Java父子类在生成对象时的属性关系

来源:互联网 发布:centos多线程下载命令 编辑:程序博客网 时间:2024/06/18 09:37

今天遇到这样一道选择题:
以下程序运行结果是()

public class Child extends Father {    public  String name = "child";    public static void main(String[] args) {        Child c = new Child();        System.out.println(c.getName());    }}class Father {    public String name = "father";    public String getName() {        return name;    }}

A: father B:child C:编译出错 D:运行出错,无输出
编译结果是:father

Java编程思想讲继承语法时说,子类继承父类,会自动得到父类中所有的域和方法。
不知道是不是中文版翻译跟原意有区别,我的理解是子类继承父类,子类可以访问父类的属性和方法(同时受到访问权限的限制),而不是得到。
可分为以下四种情况讨论:
1、子类没有重写父类的方法,调用父类的方法访问一个属性,访问的是父类的属性,因为调用的是父类的方法。

public class Child extends Father {    public  String name = "child";    public static void main(String[] args) {        Child c = new Child();        System.out.println(c.getName());    }}class Father {    public String name = "father";    public String getName() {        return name;    }}

输出:father

2、子类重写父类的方法,调用此方法访问一个属性,访问的是子类的属性,因为此时调用的方法是子类的方法,只有当子类不存在此方法时,才会去父类中寻找

public class Child extends Father {    public  String name = "child";    public String getName() {        return name;    }    public static void main(String[] args) {        Child c = new Child();        System.out.println(c.getName());    }}class Father {    public String name = "father";    public String getName() {        return name;    }}

输出:child
3、父子类中有相同的属性,若要调用父类的属性,则需要使用super.属性 来调用父类中的属性

public class Child extends Father {    public  String name = "child";    public String getName() {        return super.name;    }    public static void main(String[] args) {        Child c = new Child();        System.out.println(c.getName());    }}class Father {    public String name = "father";    public String getName() {        return name;    }}

输出:father
4、若子类没有该属性,则在子类中调用重写的方法访问属性,调用的是父类属性,不需显示使用 super.属性 来调用

public class Child extends Father {    //public  String name = "child";    public String getName() {        return name;    }    public static void main(String[] args) {        Child c = new Child();        System.out.println(c.getName());    }}class Father {    public String name = "father";    public String getName() {        return name;    }}

输出:father

1 0