2019独角兽企业重金招聘Python工程师标准>>>
39.类的继承
描述类的时候,我们如果发现有几个类有重复的属性和方法,我们就可以采用继承的方法来设计
使用extends关键字来继承
语法:
class 子类 extends 父类{
子类属性
子类方法
}
特点:(1)子类会把父类所有属性和方法继承下来(暂时不考虑final)
(2)子类使用extends关键字继承父类的共同属性以外。子类话可以有自己特有的属性和方法;
(3)父类更通用,子类更具体
(4)子类只能获得符类中的非private的属性,如果想要继承就得提供公共的set和get的方法。私有的方法是无法继承下来的;
(5)java中只能做单继承。可以多级继承不能多继承。
class ChineseTeacher{
String name;
private int age;
public void setAge(int myAge){
age=myAge;
}
public int getAge(){
return age;
}
public void speek(){
System.out.println("老师在讲课");
}
}
/*类的继承语法:
class 子类 extends 父类{
子类属性
子类方法
}
*/
class MathTheacher extends ChineseTeacher{
boolean isMarry;
public void mathTeach(){
System.out.println(this.getAge()+"岁的"+name+"教数学");
}
}
public class Teacher{
public static void main(String[] args){
MathTheacher m=new MathTheacher();
m.name="大可爱";
m.setAge(27);
int age=m.getAge();
m.isMarry=true;
m.speek();
m.mathTeach();
}
}
//发现一个问题,当我把主方法放在MathTeacher下创建m的时候编译是没有问题的但是运行Mathteacher却出现错误: 找不到或无法加载主类 MathTeacher,不知道为什么这样不可以
40.类的继承的内存结构
总结:在类的继承结构中,如果创建一个子类的对象,那么在子类的对象内部创建一个父类的对象,如果通过子类的对象访问属性的时候,就会到父类的对象中去查找,如果调用方法的时候也是一样的,如果子类中没有,也会到父类中查找。
42.super关键字的使用
(1)子类通过默认构造器实例化的过程中父类的构造器先被调用,然后再调用子类的构造器,在子类构造器内部默认的调用super();
public JavaTeacher{
super();//隐藏调用父类的构造器
System.out.println("子类构造器被调用");
}
注意:如果父类带有有参数的构造器,并且没有显式的定义父类的默认构造器,默认构造器被覆盖,导致子类的构造器无法通过super()来做调用,就会编译报错,需要显式的定义父类的默认的构造器
(2)如果子类的构造器中调用了父类中的有参数的构造器,默认的super()调用就不会有了,不能在子类的构造器中调用两个super(..);
(3)super(..)调用必须放在方法的第一行
(4)super 可以表示父类的引用,使用super和this区分父类和子类中同名的属性,在子类中访问属性的查找顺序首先在子类中查找指定的属性名字,如果子类中没有该属性,那么就去父类中查找该属性,方法也是一样,但是可以通过super对父类的引用来调用父类的方法。
重点:1.理解super(...)对于父类构造器的调用;2.super表示子类内部的那个父类的对象引用
对比this关键字:1.代表当前类的指定实例的引用;2.可以区分同名的属性和局部变量;3.通过This可以调用同类中的构造器(this(),this(...));4.调用本类里面的属性,this.属性名,this.方法名();
class Teacher{
String name="小白兔";
int age=20;
public Teacher(){
System.out.println("父类构造器被调用");
}
}
class ArtTeacher extends Teacher{
String name="小老虎";
int age=22;
public ArtTeacher(){
//super();//隐藏调用父类的构造器
System.out.println("子类构造器被调用");
}
public void introduce(){
System.out.println(this.name+super.age);
}
}
public class Test{
public static void main(String[] args){
ArtTeacher A=new ArtTeacher();
A.introduce();
}
}
43.方法的重写
在子类继承父类时,子类的方法和父类的方法相同(访问修饰先支付,返回值类型,方法名,参数列表),方法体不同,这种子类的方法将父类的方法覆盖叫重写
重写和重载的区别:
重写:(override)在子类的继承中有相同的方法,唯一布通的就是方法体,一般是父类的该方法满足不了子类的需求所有才发生重写;
重载:(overload)重载是在同一个类中,有着相同的方法名但是参数的数据类型或者参数的个数不同这两个方法就是重载,母的是节省类中命名资源和提高代码的可读性;