1.概念:
- 在Java中指的是【一个类】可以【继承】【另一个类】
- 【被继承的类】叫做【父类/超类/基类】
- 【继承其他类的类】叫做【子类】
- 继承后,【子类】中就拥有了【父类】中所有的成员(成员变量和成员方法) 那么,【子类】就不需要在额外的区定义和【父类】一样的成员了,可以直接调用
2、继承的好处:
- 提高代码的复用性(减少沉余)
- 使类与类之间产生了关系
3、继承的格式:
- 关键字extends
- 通过extends 关键字
- 可以声明一个类区继承另一个类
- 子类 与 父类 的关系
给出一个人类的类:
//人类的类
public class Person {
//成员变量
String name;
int age;
//成员方法
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
}
在定义一个学生的类:
//学生类
public class Student {
//成员变量
double score;
//成员方法
public void stydy(){
System.out.println("学习");
}
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
}
最后定义教师的类用extends来调用父类Person
//教师类
public class Teacher extends Person {
//成员变量
double salary; //工资
//String name;
//int age;
//成员方法
public void teach(){
System.out.println("上课");
}
}
创建一个测试类,如图
测试类:
public class Tests {
public static void main(String[] args) {
//实例化一个teacher对象
Teacher teacher = new Teacher();
teacher.name = "张老师"; //父类成员属性
teacher.age = 30; //父类成员属性
teacher.salary = 3000; //子类成员属性
teacher.teach(); //父类成员方法
teacher.sleep(); //父类成员方法
teacher.teach(); //子类成员方法
4、继承总结:
通过继承extends可以将一些共性的属性,行为抽取到一个父类中
子类只需要继承即可,提高了代码的复用性
另外需要注意一点:
Java是单继承的,一个类只能继承一个直接父类,并且满足is-a的关系
is - a 的关系
Person 是父类、Teacher 是子类 --> class Teacher extends Person
Teacher is a Person
Student is a person
Dog is a Person ??? //语法上是可以的,但不符合显示逻辑
(dog is a person 的关系也走不通)
5、多类:
为了开发学习方便,我们把多个类定义在一个.java文件中
当一个Java文件存在多个类的时候,必须保证java文件的名称和公共类的;类名称一致即可
换句话说,只要这个java文件的pubic class 类名称和Java文件名称相同即可
--> 注意: 一个.java文件中只允许存在一个public class
比如:
Person 类中除了public class Person,还有class Dog, class Cat
然后编译的时候自动产生三个编译文件,即Person.class Dog.class Cat.class
5、继承后,成员访问的规则
1.继承后构造方法的访问规则:
规则一:
构造方法的访问规则:
父类的构造方法不能被子类继承
class Fu{
//构造方法
public Fu(){
}
public Fu(String name ,int age){
}
}
class Zi extends Fu{
}
public class Tsets {
public static void main(String[] args) {
// Zi类默认系统提供了无参构造方法
Zi zi = new Zi();
// Zi类继承了Fu类,那么Fu类中的构造方法是否可以被继承呢
// Zi zi_1= new Zi("张三",18); // 代码编报错,因为没有继承关系
}
}
2.继承后私有成员的访问规则:
规则二:父类的私有成员可以被子类继承,但不能直接访问
class Fu{
// 私有的成员属性
private int num = 100;
// 私有成员方法
private void method(){
System.out.println("父类中的私有成员方法");
}
}
class Zi extends Fu{
}
public class Tests {
public static void main(String[] args) {
//实例化一个子类对象,测试子类对象是否 可以调用父类私有成员
Zi zi = new Zi();
//System.out.println(zi.num); // 编译错误
//zi.method(); //编译错误
3.继承后非私有成员的访问规则
规则三:
继承后,子类可以调用父类的非私有成员变量或方法
当通过子类访问非私有成员时,会优先在子类中查找,如果找到就使用子类,
没有找到就会去父类去找。
class Fu{
int money = 100;
public void method(){
System.out.println("Fu类中的成员方法method");
}
}
class Zi extends Fu{
/*
* 如果子类中和父类的成员一摸一样
* 那么调用的相同名称的变量或者方法的时候,会调用子类还是父类
* */
int money = 10;
@Override
public void method(){
System.out.println("Zi类中的成员方法method");
}
}
public class Tsets {
public static void main(String[] args) {
//实例化一个Zi类对象,测试调用父类的非私有成员
Zi zi = new Zi();
System.out.println(zi.money);
zi.method();
}
4、总结:
构造方法不能被继承
父类的私有成员可以 被继承 ,但子类不能直接调用,因为父类私有成员只限于本类中
当通过子类访问非私有成员时,优先子类,子类没有再去父类查找
--> 一个Java文件可以定义多个类,但该文件只能有一个public修饰的类,该类的名称和文件名 一致
效果:相当于三个文件中的代码放到了一个文件中,使用还是和之前一样