| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 596 人关注过本帖
标题:java基础多态问题
只看楼主 加入收藏
xiaonuo
Rank: 1
等 级:新手上路
帖 子:16
专家分:5
注 册:2018-3-27
结帖率:25%
  已结贴   问题点数:20  回复次数:7   
java基础多态问题
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为什么呢?
2018-03-28 02:10
有多难
Rank: 2
等 级:论坛游民
帖 子:39
专家分:39
注 册:2018-3-26
  得分:7 
父类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方法。
2018-03-28 11:15
有多难
Rank: 2
等 级:论坛游民
帖 子:39
专家分:39
注 册:2018-3-26
  得分:0 
还有继承关系
2018-03-28 11:18
rind
Rank: 2
等 级:论坛游民
威 望:4
帖 子:7
专家分:37
注 册:2018-3-8
  得分:7 
private修饰的属性和方法不具有多态的特性。
它们不会出现在扩展出的子类的属性列表和方法列表中,
所以super和this无法调用。

2018-03-28 17:37
xiaonuo
Rank: 1
等 级:新手上路
帖 子:16
专家分:5
注 册:2018-3-27
  得分:0 
回复 2楼 有多难

那我是不是可以理解为子类要重写父类的方法,否则子类对象调用的是父类方法?
2018-03-29 01:02
有多难
Rank: 2
等 级:论坛游民
帖 子:39
专家分:39
注 册:2018-3-26
  得分:0 
回复 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编辑过]

2018-04-01 01:51
xiaonuo
Rank: 1
等 级:新手上路
帖 子:16
专家分:5
注 册:2018-3-27
  得分:0 
回复 6楼 有多难
一个类的创建包含了整个家族的创建,但由于子类重写了父类的方法,它就会优先调用子类中的方法。
2018-04-01 06:57
有多难
Rank: 2
等 级:论坛游民
帖 子:39
专家分:39
注 册:2018-3-26
  得分:0 
回复 7楼 xiaonuo
所以,分析出来输出结果会是什么呢?
2018-04-04 12:19







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024317 second(s), 9 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved