继承:
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,
那么多个类无需再定义这些属性和行为,只要继承那个类即可。
如何实现继承:
class 子类名 extends 父类名{}
有了继承以后,我们定义一个类的时候,
可以在一个已经存在的类的基础上,还可以定义自己的新成员。
继承的好处:
1、提高代码的复用性
2、提高了代码的维护性
3、让类与类之间产生了关系,是多态的前提,为后面讲解多态做准备
继承的坏处:
继承让类与类产生了关系,类之间的耦合性变高了。
耦合:类与类之间的关系
内聚:就是类自己完成某件事的能力
开发的原则:
低耦合,高内聚
//定义一个父类:员工
public class Employee {
public void method() {
System.out.println("方法执行!");
}
}
定义了一个员工的子类:讲师
public class Teacher extends Employee{
}
定义了员工的另一个子类:助教
public class Assistant extends Employee {
}
定义测试类
public class DemoExtends {
public static void main(String[] args) {
// 创建了一个子类对象
Teacher teacher =new Teacher();// 创建了一个子类对象
teacher.method();// Teacher类当中虽然什么都没写,但是会继承来自父类的method方法。
Assistant assistant =new Assistant();// 创建另一个子类助教的对象
assistant.method();
}
}
Java中继承的特点:
1、Java只支持单继承,不支持多继承,这是类与类之间的关系
2、Java支持多层继承(继承体系)
class GrandFather{
public void show(){
System.out.println("这是在爷爷里面的show方法");
}
}
class Father extends GrandFather{
public void show1(){
System.out.println("这是在父亲里面的show1方法");
}
}
class Son extends Father{
public void show2(){
System.out.println("这是在儿子里面的show2方法");
}
}
public class ExtendsDemo3 {
public static void main(String[] args) {
Son s = new Son();
s.show2(); //这是调用自己特有的方法 自己的
s.show1(); //这是调用继承父类中的方法 父亲的
s.show(); //这是调用多层继承中父类的方法 爷爷的
}
}
使用继承的注意事项:
1、子类只能继承父类所有非私有的成员(成员方法和成员变量)
2、子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法。
3、不要为了部分功能而去继承
class A{
public void show1(){}
public void show2(){}
}
class B{
public void show2(){}
public void show3(){}
public void show4(){}
public void show5(){}
public void show6(){}
}
通过观察发现,出现了一个相同的show2方法,在类A和B中都出现了
class B extends A{
public void show3(){}
public void show4(){}
public void show5(){}
public void show6(){}
}
为了重复的show2方法,我们采用了继承,这样虽然可以做,但是这样并不推荐
1、这样继承,我们发现,虽然把show2方法给继承过来了,但是我们也把show1也继承过来,
但是show1是A特有的,这样做显然是不合理的
2、为了一个相同的方法用继承改进,发现并没有简便到哪去,反而出错了会增加工作量
那问题来了?
到底什么时候使用继承呢?
满足英语中一句话“is a”
Person:
Student
Teacher
Police
液体:
可乐
水
牛奶
总结:只要满足is a这个语法,就可以使用继承
class Father2{
Father2(){
System.out.println("父类的无参构造");
}
int num = 20;
private int num2 = 30;
public void song(){
System.out.println("唱歌");
}
private void diving(){
System.out.println("潜水");
}
}
class Son2 extends Father2{
// Father2();
public void show(){
System.out.println(num);//子类可以访问父类的非私有成员变量
// System.out.println(num2); //子类不能访问父类中的私有成员变量
song(); //子类可以访问父类中的非私有成员方法
// diving(); //子类不能访问父类中私有的成员方法
}
}
public class ExtendsDemo4 {
public static void main(String[] args) {
Son2 s = new Son2();
s.show();
}
}



