JavaSE基础笔记——Javaoo(面向对象进阶:static与继承)
继承后:成员变量、成员方法的访问特点
在子类方法中访问成员(成员变量、成员方法)满足:就近原则
就近原则:子类(局部)没有找子类(成员),子类(成员)没有找父类,父类没有就报
错。如果子父类中出现了重名的成员,此时如果一定要在子类中使用父类怎么办? 格式:super.父类成员变量/父类成员方法
public class Test {
public static void main(String[] args) {
//目标:理解继承后成员的访问特点:就近原则。
Dog d = new Dog();
d.run();//狗跑的贼快---。子类的
d.lookDoor();//狗可以看门---。子类的
d.showName();
}
}
class Animal{
public String name = "动物名";
public void run(){
System.out.println("动物可以跑---");
}
}
class Dog extends Animal{
public String name = "狗名";
public void lookDoor(){
System.out.println("狗可以看门---");
}
public void showName(){
String name = "局部名";
System.out.println(name);//局部名
System.out.println(this.name);//当前子类对象的name(狗名)
System.out.println(super.name);//找父类的name(动物名)
super.run();//找父类方法(动物可以跑---)
run();//子类的run(狗跑的贼快---)
}
public void run(){
System.out.println("狗跑的贼快---");
}
}
继承后:方法重写
在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的
方法。
什么情况下需要进行方法的重写?
当子类的实现方式跟父类的实现方式不一样的时候,就需要对父类的方法进行重写( 覆盖).
当子类重写了父类的方法后,则会覆盖父类原来方法的实现。
方法重写应用场景:
当子类需要父类的功能,但父类的该功能不完全满足自己的需求时。;子类可以重写父类中
的方法。
@Override重写注解
1、重写校验注解,加上这个,这个方法必须是正确重写的,这样更安全。
2、提高程序的可读性,代码优雅!
加上该注解后如果重写错误,编译阶段会出现错误提示。
方法重写注意事项和要求:
1、重写方法的名称、形参列表必须与被重写方法的名称和参数列表一致。
2、私有方法不能被重写。 3、子类重写父类方法时,访问权限必须大于或者等于父类(暂时了解:缺省 重写和重载的区别 重载: 方法必须在一个类中,方法名相同, 但是参数列表不相同. 重写: 两个类,并且两个类之间必须有继承或者实现关系. 方法的访问修饰符必须不小于父类的反问修饰符。 方法的返回类型(必须要小于或等于父类的返回类型。前提是引用数据类型) 方法的名字要一样,甚至,方法的参数列表必须要一样。 案例: 旧手机的功能只能是基本的打电话,发信息 新手机的功能:基本的打电话下支持视频通话。基本的发信息下支持发送语音和图片。 public class Test { public static void main(String[] args) { //目标:认识方法重写。:在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。 //方法重写应用场景:当子类需要父类的功能,但父类的该功能不完全满足自己的需求时。;子类可以重写父类中的方法。 NewPhone hw = new NewPhone(); hw.call(); hw.sendMsg(); } } /** 新手机:子类 */ class NewPhone extends Phone{ //重写的方法 @Override //1、重写校验注解,加上这个,这个方法必须是正确重写的,这样更安全。2、提高程序的可读性,代码优雅! //加上该注解后如果重写错误,编译阶段会出现错误提示 //方法重写注意事项和要求:1、重写方法的名称、形参列表必须与被重写方法的名称和参数列表一致。2、私有方法不能被重写。 //3、子类重写父类方法时,访问权限必须大于或者等于父类(暂时了解:缺省 //4、子类不能重写父类的静态方法,如果重写会报错的。 public void call(){ super.call(); //先用它爸爸的基本功能 System.out.println("开始视频通话--"); } //重写的方法 @Override public void sendMsg(){ super.sendMsg();//先用它爸爸的基本功能 System.out.println("发送有趣的图片--"); } //注意:静态方法不能被重写。 // @Override // public static void test(){ // } } /** 旧手机:父类的 */ class Phone{ public void call(){ System.out.println("打电话-"); } public void sendMsg(){ System.out.println("发短信-"); } public static void test(){ } } 继承后:子类构造器的特点 子类的全部构造器默认会先访问父类的无参数构造器,再执行自己。 父类: public class Animal { public Animal(){ System.out.println("父类Animal无参数构造器被执行-"); } } 子类: public class Dog extends Animal{ public Dog(){ super();//写不写都有,默认找父类的无参数构造器执行。 System.out.println("子类Dog无参数构造器被执行-"); } public Dog(String name){ super();//写不写都有,默认找父类的无参数构造器执行。 System.out.println("子类Dog有参数构造器被执行-"); } } 测试类: public class Test { public static void main(String[] args) { //目标:认识继承后子类构造器的特点 //特点:子类的全部构造器默认会先访问父类的无参数构造器,再执行自己 //原因:1、子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。 //2、子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化。 //怎么调用父类构造器的?子类构造器的第一行语句默认都是:super(),不写也存在。 Dog d1 = new Dog(); System.out.println(d1); System.out.println("------------------"); Dog d2 = new Dog("金毛"); System.out.println(d2); /* 父类Animal无参数构造器被执行- 子类Dog无参数构造器被执行- com.itheima.d10_extends_constructor.Dog@1b6d3586 ----------------- 父类Animal无参数构造器被执行- 子类Dog有参数构造器被执行- com.itheima.d10_extends_constructor.Dog@4554617c */ } } 继承后:子类构造器访问父类有参构造器 super调用父类有参数构造器的作用: 初始化继承自父类的数据。 作用:通过调用父类有参数构造器来初始化继承自父类的数据。 父类: public class People { private String name; private int age; public People() { } public People(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 子类: public class Teacher extends People{ public Teacher(String name , int age){ //调用父类的有参数构造器,初始化继承自父类的数据 super(name,age); } } 测试类: public class Test { public static void main(String[] args) { //目标:学习子类构造器如何去访问父类有参数构造器,还要清楚其作用。 //super调用父类构造器 //作用:通过调用父类有参数构造器来初始化继承自父类的数据。 Teacher t = new Teacher("张三",18); System.out.println(t.getName()); System.out.println(t.getAge()); } }