注册 登录
编程论坛 JAVA论坛

java基础多态问题

xiaonuo 发布于 2018-03-28 02:10, 2404 次点击
class Car{
    private String color = "red";
    public String getColor(){
    return color;
    }
    public void setColor(String color){
    this.color = color;
    }
}
class Benz extends Car{
    private String color = "black";
}

class Test{
    public static void main(String[] args){
    Benz b1 = new Benz();
    System.out.println(b1.getColor());
    Benz b2 = new Benz();
    b2.setColor("yellow");
    System.out.println(b2.getColor());
    }
}
输出结果第一个是red,第二个是yellow为什么呢?
7 回复
#2
有多难2018-03-28 11:15
父类Car有一个私有的字段 颜色,初始值为红色,因为是私有字段所以外部无法直接访问到,然后在后面提供了供给外部访问此私有字段的getColor()、setColor()方法,getColor()方法用来获得Car的颜色,setColor()方法用来设定Car的颜色。Benz是Car的子类,该子类中除了有一个私有字段color以外没有任何方法,所以new出来的Benz实例b1调用的是父类的getColor()方法,所以获得的值也就是父类的私有字段颜色的初始值:“red”;同样的,new出来的b2实例调用的也是父类的setColor()方法,而调用此方法传入了参数“yellow”,将父类的私有字段颜色的值从“red”变为了“yellow”,所以b2实例再调用getColor()方法时获得的是更改后的颜色“yellow”。这里要着重理解是get、set方法。
#3
有多难2018-03-28 11:18
还有继承关系
#4
rind2018-03-28 17:37
private修饰的属性和方法不具有多态的特性。
它们不会出现在扩展出的子类的属性列表和方法列表中,
所以super和this无法调用。

#5
xiaonuo2018-03-29 01:02
回复 2楼 有多难

那我是不是可以理解为子类要重写父类的方法,否则子类对象调用的是父类方法?
#6
有多难2018-04-01 01:51
回复 5楼 xiaonuo
子类调用的是从父类继承来的方法。
关于这个我自己还有一个疑惑 就是父类在的自己构造方法里调用了自身的普通方法,子类重写了那两个普通方法,
在main方法中new 子类的时候 会先调用父类的构造器,而父类的构造器中调用的是子类重写过的方法。代码如下:
class Jack{
    private String name ="Jack";
    public Jack(){
        givenName();
        say();
     }
    public void givenName(){
       System.out.println("Jack is given Name:" + name);
    }
    public void say(){
       System.out.println("Jack say name:" + name);
    }
}

public class David extends Jack{
    private String name ="David";
    public David(){
        givenName();
        say();
     }
    public void givenName(){
       System.out.println("David is given Name:" + name);
    }
    public void say(){
       System.out.println("David say name:" + name);
    }

    public static void main(String[] args){
        new David();
    }

}


[此贴子已经被作者于2018-4-1 01:54编辑过]

#7
xiaonuo2018-04-01 06:57
回复 6楼 有多难
一个类的创建包含了整个家族的创建,但由于子类重写了父类的方法,它就会优先调用子类中的方法。
#8
有多难2018-04-04 12:19
回复 7楼 xiaonuo
所以,分析出来输出结果会是什么呢?
1