39.类的继承java
描述类的时候,咱们若是发现有几个类有重复的属性和方法,咱们就能够采用继承的方法来设计ide
使用extends关键字来继承this
语法:设计
class 子类 extends 父类{对象
子类属性继承
子类方法内存
}资源
特色:(1)子类会把父类全部属性和方法继承下来(暂时不考虑final)get
(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)重载是在同一个类中,有着相同的方法名可是参数的数据类型或者参数的个数不一样这两个方法就是重载,母的是节省类中命名资源和提升代码的可读性;