Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不允许子类重写方法会导致不可变对象的创建?_Java_Overriding_Subclass_Immutability_Final - Fatal编程技术网

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

Java 为什么不允许子类重写方法会导致不可变对象的创建?,java,overriding,subclass,immutability,final,Java,Overriding,Subclass,Immutability,Final,我是Java新手,正在尝试学习定义不可变对象的概念。我在Java教程oracle中读到,创建不可变对象的方法之一是 不允许子类重写方法。最简单的方法是将类声明为final 我的问题是,为什么不允许子类重写方法会导致不可变对象的创建?我正在努力理解这里的联系。假设String的方法可以被另一个类扩展。不能保证另一个类会像String一样是不可变的 所以,如果调用某个库方法并获取一个字符串,该字符串是否会更改?是字符串基类还是扩展它的东西是可变的?String是最后一个类,所以我们不必担心这一点 我

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

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


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

假设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());
    }
}

我认为正确的问题应该是“为什么允许子类重写方法是设计不可变对象的必要步骤”?这就是你的意思吗?非常感谢你向我解释这件事并举个例子!!非常感谢你的帮助!!