继承
(1)概念
在日常的代码书写中,我们通常会遇到代码重复的情况,如下
class Dog{
String name;
int age;
double weight;
public void eat(){
System.out.println(name + "正在吃饭");
}
}
class Cat{
String name;
int age;
double weight;
public void eat(){
System.out.println(name + "正在吃饭");
}
}
为了解决这样的重复性问题,提高代码效率,java中提出了继承的概念,专门用来提取共性代码,提高代码复用 。它允许程序员在保持原有类(也叫父类)特性的基础上进行扩展,增加新功能,这样产生新的类,称派生类,也叫子类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。通俗来讲,就是写了一段代码,这段代码拥有上述几个类的共性,那么这段代码就叫父类,而在父类基础上增加几个变量写出的类叫子类(派生类)!
public class Animal {
String name;
int age;
double weight;
public void eat(){
System.out.println(name + "正在吃饭");
}
}
(2)语法
在Java中如果要表示类之间的继承关系,需要借助extends关键字 !
修饰符 class 子类 extends 父类 {// ...}
例如:
class Animal {
String name;
int age;
double weight;
public void eat(){
System.out.println(name + "正在吃饭");
}
}
public class Cat extends Animal{
int a = 2024;
public void mew(){
System.out.println(name + "喵喵喵");
}
}
注意:
(3)父成员访问
子类访问成员变量
1.子类与父类成员变量不同名
正常访问,变量在哪里就访问哪里!
2.子类与父类成员变量同名
优先访问自己的,自己没有的才访问父类的。
子类访问成员方法
1.子类与父类成员方法不同名
在子类方法中或者通过子类对象访问方法时,则优先访问自己的,自己没有时再到父类中 找,如果父类中也没有则报错。
2.子类与父类成员方法同名
(1)通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父 类中找,找到则访问,否则编译报错。
(2)通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重 载),根据调用
(4)super关键字
子类和父类可能存在相同名称的成员,如果要在子类中访问父类中相同名称的成员时,要用到super关键字,该关键字的作用是:在子类方法中访问父类的成员。
注意:
(5)子类构造方法
class Base{
int a;
int b;
public void method(){
System.out.println("method方法");
}
}
class Derived extends Base{
// super(); // 注意子类构造方法中默认会调用基类的无参构造方法:super(),
// 用户没有写时,编译器会自动添加,而且super()必须是子类构造方法中第一条语句,
// 并且只能出现一次
}
如果写了super(),那么编译器就会编译,如果没写,编译器也会自动添加,反正总是要先调用基类(父类)的构造方法,因此不要忘记!!(若父类构造方法有参,子类构造方法必写super(),若无参,可不写,但编译器会默认有隐含的super().)
注意:
(6)继承当中的代码块
在没有继承条件下 静态代码块,实例代码块,构造方法的先后顺序:
静态代码块>实例代码块>构造方法
在继承条件下 静态代码块,实例代码块,构造方法的先后顺序(因为涉及到子类代码块与父类代码块两个地方)
静态代码块1>静态代码块2>实例代码块1>构造方法1>实例代码块2>构造方法2
即静态代码块不管子类还是父类,按照先后顺序输出,而实例代码块和构造方法都是先父类输出,再是子类输出!!!
结论:
(7)访问限定符
作用:类或者类中成员能否在类外或者其他包中被访问。实现类的“封装性”,隐藏内部实现细节!
注意:父类中private成员变量虽然在子类中不能直接访问,但是也继承到子类中了。
(8)继承方式
单继承,
public class A{ } public class B extends A{ }
多层继承,
public class A{ } public class B extends A{ } public class C extends B{ }
不同类继承同一个类
public class A{ } public class B extends A{ } public class C extends A{ }
注意:java只有以上三种,没有多继承
public class A{ } public class B extends A{ } public class C extends A,B{ //java不支持 }
(9)final
二、组合
组合和继承类似,是一种思想,一种代码实现方式。也可以表达类之间的关系,达到代码复用,但没有特殊的语法和关键字。是包含的关系(has—a的关系)!
class Student{ } class Teacher{ } class School{ public Student student; public Teacher teacher; }