Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop_Polymorphism - Fatal编程技术网

Java 多态性:方法已更改,但参数值未更改

Java 多态性:方法已更改,但参数值未更改,java,oop,polymorphism,Java,Oop,Polymorphism,我运行了以下代码: public class Cycling { public static void main(String[] args) { Cycle unicycle = new Unicycle(); System.out.println("Unicycle name: " + unicycle.name); unicycle.ride(); } } class

我运行了以下代码:

public class Cycling {
    
    public static void main(String[] args) {
        
        Cycle unicycle      = new Unicycle();
        System.out.println("Unicycle name: " + unicycle.name);
        unicycle.ride();
    }
}

class Cycle {
    public String name = "cycle";
    public void ride() {
        System.out.println("Ride cycle!");
    }
}

class Unicycle extends Cycle{
    public String name = "unicycle";
    public void ride() {
        System.out.println("Ride unicycle!");
    }
}
我期望这个输出:

public class Cycling {
    
    public static void main(String[] args) {
        
        Cycle unicycle      = new Unicycle();
        System.out.println("Unicycle name: " + unicycle.name);
        unicycle.ride();
    }
}

class Cycle {
    public String name = "cycle";
    public void ride() {
        System.out.println("Ride cycle!");
    }
}

class Unicycle extends Cycle{
    public String name = "unicycle";
    public void ride() {
        System.out.println("Ride unicycle!");
    }
}
独轮车名称:独轮车

骑独轮车

我得到了这个输出:

public class Cycling {
    
    public static void main(String[] args) {
        
        Cycle unicycle      = new Unicycle();
        System.out.println("Unicycle name: " + unicycle.name);
        unicycle.ride();
    }
}

class Cycle {
    public String name = "cycle";
    public void ride() {
        System.out.println("Ride cycle!");
    }
}

class Unicycle extends Cycle{
    public String name = "unicycle";
    public void ride() {
        System.out.println("Ride unicycle!");
    }
}
独轮车名称:单车

骑独轮车


方法已成功更改,但参数的值未更改。有人能解释一下为什么吗?

你的方法是多态的,你的字段不是多态的——因为字段不是多态的

当前有两个同名字段,一个字段隐藏另一个字段。当您这样做时:

Cycle unicycle = new Unicycle();
Cycle
不知道
Unicycle
类中的
名称。因此,当您执行
unicycle.name
时,它指的是
Cycle
类中的一个



建议:永远把你的领域保密



像IntelliJ Idea这样的IDE会突出显示此错误。

这是因为当您在子类中定义一个同名变量时,它将具有两个仅共享其名称的属性。这称为隐藏。如果要访问超类变量“name”的值,可以通过
super.name
调用它


正如您所看到的,变量完全是自己处理的,它们也可以有完全不同的类型。

这是编译时与运行时多态性的典型案例


编译器在编译时解析变量,但JVM在运行时解析方法。

字段不是多态的
unicycle.name
指的是
Cycle
中的
name
,因为它是通过
Cycle
类型的表达式访问的。“建议:始终保持字段私有。”-我知道,但我公开了创建此示例的过程。@JakovKusić-好的,听起来不错。那么这个评论是给未来的读者的。