继承(extends)的概述:
现实生活中的继承,孩子继承父辈的财产,孩子可以直接拿父辈的财产来使用,
Java中的继承是指在现有类的基础上定义一个新的类,
现有类称为父类,新的类称为子类,子类会自动拥有父类的可继承的内容.
1. 学生类
属性:姓名,年龄
行为:吃饭,睡觉
public class Student {
private String name;
private int age;
public void eat() {
}
public void sleep() {
}
}
2. 医生类
属性:姓名,年龄
行为:吃饭,睡觉
public class Doctor {
private String name;
private int age;
public void eat() {
}
public void sleep() {
}
}
3. 工人类
属性:姓名,年龄
行为:吃饭,睡觉
public class Workder {
private String name;
private int age;
public void eat() {
}
public void sleep() {
}
}
由于学生类、医生类、工人类属性和行为都一样属于人类
在JAVA中可以将人类定义为父类,且都具有子类的所有属性
public class Person {
String name;
int age;
public void eat() {
System.out.println("吃饭");
}
public void sleep() {
System.out.println("睡觉");
}
}
继承的格式:
class 类名 extends 父类名{}
学生类继承人类:
public class Student extends Person{}
医生类继承人类:
public class Doctor extends Person{}
工人类继承人类:
public class Worker extends Person{}
创建完继承类之后
创建学生类对象、医生类对象和工人类对象,都可以直接调用人类中的成员变量和方法
Student s = new Student();
System.out.println(name);
s.eat(); //输出:吃饭
Doctor d = new Doctor();
d.eat(); //输出:吃饭
Worker w = new Worker();
w.sleep(); //输出:睡觉
没有任何成员变量的学生类医生类工人类,继承了父类后,可以直接使用父类中的成员方法和成员变量。
继承注意事项:
1.子类可以具有特有成员方法,创建子类对象,可以直接调用特有方法
2.子类可以重写父类的成员方法,创建子类对象调用成员方法时,使用子类重写的成员方法
3.若父类中有抽象方法,则子类必须重写抽象方法,否则编译错误
4.被private关键词修饰的成员变量和成员方法都不能被子类继承
5.构造方法不能继承
抽象(abstract)的概述:
父类中的方法,被它的子类们重写,子类各自的实现都不尽相同。
若父类的方法仅是起到告知子类具有该方法,却不明确写明方法的主体,这就是抽象
Java语法规定,包含抽象方法的类就必须是抽象类。
继续使用上述的Person作为抽象类
抽象类格式:
修饰符 abstract class 类名{}
抽象类成员方法格式:
修饰符 abstract 返回值 方法名(参数);
(注意:抽象方法没有方法体,直接用;结束方法体)
public abstract class Person{
String name;
int age;
public abstract void eat();
public abstract void sleep();
}
若父类是抽象类,则子类继承时也与普通继承不同
需重写父类中的抽象方法,且写清方法体
public class Student extends Person{
@Override
public void eat(){
System.out.println("学生吃饭");
}
@Override
public void sleep(){
System.out.println("学生睡觉");
}
}
1. 抽象类不能创建对象,只能创建其非抽象子类的对象。
2. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
3. 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。
假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有意义。
好处:
强迫子类重写父类的抽象方法,在不清楚子类具体方法体时,
可以将方法写为抽象方法,让子类继承后自己重写抽象方法
继承中常用this、super关键字
this.成员变量 -- 本类的
super.成员变量 -- 父类的
假设上述继承关系中
Person类中:
String name = "人";
Student 类中:
String name = "学生";
public void eat(){
System.out.println(this.name + "在吃饭");
System.out.println(super.name + "在吃饭");
}
主方法:
new Student().eat();
//输出:学生 在吃饭
// 人 在吃饭
注意事项:
super无法调用父类使用private修饰的成员变量或成员方法