Java继承类与基类:方法名称、属性名称相同

Java中,使用关键词extends,可以使继承类拥有基类的属性和方法,前提条件是基类的属性和方法是public或protected。在此讨论一个特殊情况,如果继承类、基类的属性和方法一样怎么办?

案例一:属性、方法均继承

class Person {
    private String name = "Person";
    public void getName() {
        System.out.println("Class name is :" + this.getClass().getSimpleName() + " ---- property name is :" + name);
    }
}
public class Student extends Person{
    public static void main(String[] args) {
        Person person = new Person();
        person.getName();

        Student student = new Student();
        student.getName();//继承类继承了基类的方法

        Person normalStudent = new Student();
        normalStudent.getName();//动态编译,基类引用调用继承类方法
    }
}
/**
 * OUTPUT
 * Class name is :Person ---- property name is :Person
 * Class name is :Student ---- property name is :Person
 * Class name is :Student ---- property name is :Person
 */

案例二、属性名称相同、方法继承基类

class Person {
    private String name = "Person";
    public void getName() {
        System.out.println("Class name is :" + this.getClass().getSimpleName() + " ---- property name is :" + name);
    }
}
public class Student extends Person{
    private String name = "Student";
    public static void main(String[] args) {
        Person person = new Person();
        person.getName();

        Student student = new Student();
        student.getName();//继承类继承了基类的方法

        Person normalStudent = new Student();
        normalStudent.getName();//动态编译,基类引用调用继承类方法
    }
}
/**
 * OUTPUT
 * Class name is :Person ---- property name is :Person
 * Class name is :Student ---- property name is :Person
 * Class name is :Student ---- property name is :Person
 */

对比案例一、案例二发现,属性名称相同没产生任何变化。继承类的属性被隐藏,通过继承获取的方法,始终只会对基类的属性进行操作。Java中属性不支持重写。道理也很合理,如果连属性都能重写,就违背了封装、安全的初衷。如果继承类的方法会更改属性值,本来是打算更改基类属性,结果却更改了继承类属性,就乱了。

案例三、方法重写、属性名称相同

class Person {
    private String name = "Person";
    public void getName() {
        System.out.println("Class name is :" + this.getClass().getSimpleName() + " ---- property name is :" + name);
    }
}
public class Student extends Person{
    private String name = "Student";
    public void getName() {
        System.out.println("Class name is :" + this.getClass().getSimpleName() + " ---- property name is :" + name);
    }
    public static void main(String[] args) {
        Person person = new Person();
        person.getName();

        Student student = new Student();
        student.getName();//继承类重写基类的方法

        Person normalStudent = new Student();
        normalStudent.getName();//动态编译,基类引用调用继承类方法
    }
}
/**
 * OUTPUT
 * Class name is :Person ---- property name is :Person
 * Class name is :Student ---- property name is :Student
 * Class name is :Student ---- property name is :Student
 */

案例三中,继承类重写了getName方法,并且激活继承类的name属性(通过操作name属性的方式)。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值