把相同的内容给定义到一个独立的类中。 然后,让这多个类和这个独立的类产生一个关系,有了这个关系后, 这多个类就可以具备这个独立的类的功能。 为了实现这个效果,java就提供了一个技术:继承。
继承概述:
把多个类中相同的内容给提取出来定义到一个类中。
继承是面向对象的三大特征之一。
继承是类与类关系的一种。
从类与类关系的设计角度来,子类必须是父类的一种才可以使用继承。
如何实现继承呢?
Java提供了关键字:extends
格式:
class 子类名 extends 父类名 {}
好处: A:提高了代码的复用性 B:提高了代码的维护性 C:让类与类之间产生了关系,是多态的前提
类与类产生了关系,其实也是继承的一个弊端: 类的耦合性增强了。
开发的原则:低耦合,高内聚。 耦合:类与类的关系 内聚:就是自己完成某件事情的能力
Java中继承的特点:
A:Java只支持单继承,不支持多继承。一个类可以有多个子类,但只能有一个父类
B:Java支持多层继承(继承体系) ,不能循环继承。
继承后子父类成员的特点:
子类可以拥有父类(除了构造方法以外)的所有成员:成员变量和成员方法
子类可以直接访问父类非private修饰的成员:成员变量和成员方法
子类可以定义自己特有的成员:成员变量和成员方法
子类可以使用自己的方式实现父类的方法,即方法重写
构造方法不能被子类继承,但是子类可以间接调用父类的构造方法。
继承的注意事项:
A:子类只能继承父类所有非私有的成员(成员方法和成员变量)
B:子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。
C:不要为了部分功能而去继承
继承中成员变量的关系:
A:子类中的成员变量和父类中的成员变量名称不一样,这个太简单。
B:子类中的成员变量和父类中的成员变量名称一样,这个怎么玩呢?
在子类方法中访问一个变量的查找顺序:
a:在子类方法的局部范围找,有就使用
b:在子类的成员范围找,有就使用
c:在父类的成员范围找,有就使用
d:如果还找不到,就报错。
继承中成员方法的关系:
A:子类中的方法和父类中的方法声明不一样,这个太简单。
B:子类中的方法和父类中的方法声明一样,这个该怎么玩呢?
通过子类对象调用方法:
a:先找子类中,看有没有这个方法,有就使用
b:再看父类中,有没有这个方法,有就使用
c:如果没有就报错。
定义一个学生类:Student类(子类) // 成员变量:name,age // 成员方法:eat(),sleep() 成员变量:score 成员方法:study(); 定义一个老师类:Teacher类(子类) // 成员变量:name,age // 成员方法:eat(),sleep(); 成员变量:salary 成员成员:teach(); 定义一个工人类:Worker类(子类) // 成员变量:name,age // 成员方法:eat(),sleep(); 定义一个人类:Person类(父类或超类或基类) 成员变量:name,age 成员方法:eat(),sleep(),drink();
/** * 人类:父类 */ public class Person { // 成员变量 public String name; public int age; // 成员方法 public void eat() { System.out.println("吃饭"); } public void sleep() { System.out.println("睡觉"); } } /** * 学生类:继承Person类,是Person类的子类 */ public class Student extends Person{ // 定义子类特有的成员变量和成员方法 public double score; public void study() { System.out.println("好好学习,迎娶白富美"); } } /** * 老师类:继承Person类 是Person类的子类 * * */ public class Teacher extends Person { // 定义子类特有的成员变量和成员方法 public double salary; public void teach() { System.out.println("好好上课"); } } public class Demo01 { public static void main(String[] args) { // 创建学生对象 Student stu = new Student(); // 给成员变量赋值 stu.name = "张三"; stu.age = 23; stu.score = 100; System.out.println(stu.name+"="+stu.age); // 调用成员方法 stu.eat(); stu.sleep(); // 调用子类特有方法 stu.study(); // 创建老师对象 Teacher t = new Teacher(); t.name = "小泽"; t.age = 18; t.salary = 20000; System.out.println(t.name+"="+t.age); // 调用t的eat和sleep方法 t.eat(); t.sleep(); // 调用子类特有方法 t.teach(); } }
如果父类没有无参构造方法,那么子类的构造方法会出现什么现象呢?
报错。 如何解决呢?
A:在父类中加一个无参构造方法
B:通过使用super关键字去显示的调用父类的带参构造方法
C:子类通过this去调用本类的其他构造方法 子类中一定要有一个去访问了父类的构造方法,否则父类数据就没有初始化。
注意:如果类用 public 修饰,则类名必须与文件名相同。一个文件中只能有一个public 修饰的类。