面向对象之 继承中的成员访问特点
2.1 继承中变量的访问特点
在子类方法中访问一个变量,采用的是就近原则。
1.子类局部范围找
2.子类成员范围找
3.父类成员范围找
4.如果都没有就报错(不考虑父亲的父亲....)
示例代码:
public class Fu {int num =50;}
class Zi extends Fu {int num = 40;public void show(){int num = 30; //局部变量System.out.println(num);//就近原则//需求1: 打印本类成员变量numSystem.out.println(this.num);//需求2: 打印父类成员变量numSystem.out.println(super.num);}
}
测试类代码:
public class Demo03 {public static void main(String[] args) {Zi zi = new Zi();zi.show();}
}
2.2 Super
this&super关键字:
this: 代表本类对象的引用
super:代表父类存储空间的标识(可以理解为父类对象引用)
this&super的使用分别:
成员变量:
this:成员变量 - 访问本类成员变量
super:成员变量 - 访问父类成员变量
成员方法:
this:成员方法 - 访问本类成员方法
super:成员方法 - 访问父类成员方法
构造方法:
this(...) - 访问本类构造方法
super(...)- 访问父类构造方法
2.3 继承中构造方法的访问特点
注意:子类中所有的构造方法默认都会访问父类中无参的构造方法
子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化,原因在于,每一个子类构造方法的第一条语句默认都是:super()
问题:如果父类中没有无参构造方法,只有带参构造方法,该怎么办?
1.通过使用super关键字去显示的调用父类的带参构造方法
2.子类通过this去调用本类的其他构造方法,本类其他构造方法再通过super去手动调用父类的带参构造方法
注意: this(...) super(...) 必须放在构造方法的第一行有效语句,并且二者不能共存
示例代码:
public class Fu {public Fu(){System.out.println("Fu无参构造执行了");}public Fu(int age){System.out.println("Fu带参构造执行了:"+ age);}
}
class Zi extends Fu{public Zi(){//JVM默认会在任何构造方法中第一行添加:super()//前提: 当前构造方法第一行不是this() 或者 super()这类操作super(); //调用父类无参构造!!System.out.println("Zi无参构造执行了");}public Zi(int age){super(age);System.out.println("Zi带参构造执行了:"+ age);}
}
public class Demo04 {public static void main(String[] args) {Zi zi = new Zi();System.out.println("-------");Zi zi1 = new Zi(18);}
}
2.4继承中成员方法的访问特点
通过子类对象访问一个方法
1.子类成员范围找
2.父类成员范围找
3.如果都没有就报错(不考虑父亲的父亲)
示例代码:
public class Student extends Person {public void study(){System.out.println("学生学习...");}
}class Person{private String name;private int age;
public void show(){System.out.println(name+"..."+age);
}public Person(){}public Person(String name, int age) {this.name = name;this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
测试类代码:
* 1.先找本类* 2.本类找不到往上找父类* 3.都找不到就报错*/
public class Demo05 {public static void main(String[] args) {Student stu= new Student();stu.study();stu.show();}
}
2.5 方法重写
1.方法重写的概念
子类出现了和父类一模一样的方法声明(方法名一样,参数列表也一样)
2.方法重写的应用场景
当子类需要父类的功能,而功能主体子类有自己特有的内容时,可以重写父类中的方法,这样,即沿袭了父类的功能。又定义了子类特有的内容
3.Override注解
用来检测当前的方法,是否是重写的方法,起到【校验】的作用
示例代码:
public class Phone13 {public void call(){System.out.println("打电话");}public void sendMessage(){System.out.println("发短信");}
}
class Phone14 extends Phone13{//场景一 需要父类的功能并在次基础上扩展延申@Overridepublic void call(){//需要父类功能super.call();//扩展自身额外实现System.out.println("视频通话");}//场景二 需要父类的功能 具体实现与父类完全不同@Overridepublic void sendMessage(){System.out.println("发彩色短信");}
}
测试类代码:
public class Demo06 {public static void main(String[] args) {Phone14 phone14=new Phone14();phone14.call();phone14.sendMessage();}
}
2.6 方法重写的注意事项
1.私有方法不能被重写(父类私有成员子类是不能继承的)
2.子类方法访问权限不能更低(public > 默认 > 私有)
3.静态方法不能被重写,如果子类也有相同的方法,并不是重写的父类的方法
示例代码:
public class Fu {//1.父类私有方法子类不能重写private void method1(){}//2.父类静态方法子类不能重写public static void method2(){}//3.子类重写父类方法,子类方法权限要大于等于父类方法权限protected void method3(){}
}
//@Overrideprivate void method1(){}//@Overridepublic static void method2(){}@Overridepublic void method3(){}
}
2.7权限修饰符
