为什么不允许子类重写方法可以导致创建不可变对象?

Tho*_*hor 4 java overriding final subclass immutability

我是Java新手,正在尝试学习定义不可变对象的概念.我已经在Java教程oracle中读到了创建不可变对象的方法之一

不允许子类重写方法.最简单的方法是将类声明为final.

我的问题是,为什么不允许子类重写方法会导致创建不可变对象?我在努力理解这里的联系.

小智 5

假设String的方法可以由另一个类扩展.不能保证其他类像String一样是不可变的.

因此,如果您调用某个库方法并获取String,那么String是否会更改?是String基类还是扩展它的东西是可变的?String是最后一个类,所以我们不必担心.

我举了一个如下混淆的例子:

public class WhyImmutableClassesShouldBeFinal {
    /*
     * This is an immutable class
     */
    private static class ImmutableClass {
        private final String data;

        public ImmutableClass(String data) {
            this.data = data;
        }

        public String getData() {
            return data;
        }
    }

    /*
     * This extends an immutable class, but is not immutable.
     */
    private static class NotSoImmutableClass extends ImmutableClass {
        private int oops;

        public NotSoImmutableClass() {
            super("WHATEVER");
        }

        public String getData() {
            return Integer.toString(oops++);
        }
    }

    /*
     * Here's some function that looks like it returns an immutable class but
     * doesn't.
     */
    private static ImmutableClass immutableClassProducer() {
        return new NotSoImmutableClass();
    }

    public static void main(String[] args) {
        /*
         * I called a method and got an ImmutableClass back.
         */
        ImmutableClass c = immutableClassProducer();

        /*
         * But why is the value changing?
         */
        System.out.println(c.getData());
        System.out.println(c.getData());
        System.out.println(c.getData());
        System.out.println(c.getData());
    }
}
Run Code Online (Sandbox Code Playgroud)