概念
继承(英语:inheritance)是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
子类的创建可以增加新数据、新功能,可以继承父类全部的功能,但是不能选择性的继承父类的部分功能。继承是类与类之间的关系,不是对象与对象之间的关系。
如果某类B“继承”另某类A,就把这个B称为“A的子类或派生类(subclass)”,而把类A称为“B的父类”也可以称为“A是B的超类或基类(superclass)”。
在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。
继承的语句格式:
class 子类名 extends 父类名{}
class 父类 { } class 子类 extends 父类 { }
extends关键字
在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。
implements关键字
implements 关键字可以变相的使Java具有多继承的特性,使用范围为类实现接口的情况,可以同时实现多个接口(接口之间采用逗号分隔)。
final关键字
final可以修饰类、变量、方法。
final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:
声明类:final class类名 {//类体}
声明方法:修饰符(public/private/default/protected) final返回值类型 方法名(){//方法体}
static关键字
static修饰成员变量(属性)和方法、代码块(不能出现在方法内部),static修饰变量(属性)和方法,得到的是类变量和类方法,类变量和类方法用所在类的类名直接调用。static和abstract不能一起使用。
由static修饰的变量和方法,不能用this调用。静态方法可以调用静态的方法,普通方法也可以调用静态方法,静态方法不能调用普通方法。
this关键字
this 关键字在Java方法中只能用在实例变量和实例方法上,不能用在由static、final修饰的类变量和类方法上
如果在Java方法中,实例化的成员变量和某方法的参数变量同名时,实例化的成员变量在这个方法内暂时失效(内部屏蔽外部),这时如果想在该方法中使用这被屏蔽的成员变量,用“this.成员变量名”的方式调用该成员变量,并且将参数变量赋值给this调用的成员变量,
格式如下:this.本类成员变量=局部参数变量;
super关键字
super是在子类中调用被屏蔽的成员变量和方法
方法重写(override)(方法覆盖)
发生在子类和父类当中
子类中的方法名、参数和返回值和父类相同
意义:子类跟父类拥有同样的功能,但是子类有自己的特定内容和特定实现方式。可以 定义一个不同的名字方法,但是为了见名知意,保持父类名字,自己重新实现方法体。
注意
不能重写private方法
重写的时候,访问权限不能降低(最好保持权限一致)
方法重载(overload)
发生在同一个类中
方法名一样,参数 不一样 ,返回值不要求
继承中的构造
通过子类的构造方法构造子类对象的时候,都会调用父类里面的构造方法
如果对父类里面的属性初始化,不指定就调用默认的无参构造方法
如果父类没有无参构造方法,要通过调用指定的有参构造方法
怎么指定调用父类里面的那个构造方法?
super(xx,xx,xx,xx);//父类里面的属性
怎么在构造方法中调用其他构造方法?
this(xx,xx,xx);
注意:
1、父类中一般只定义一般属性和方法(这个一般可以理解为是子类共有的,这就是父类更通用,而子类拥有其他的,所以子类更具体)
2、子类中通过super关键字来调用父构造方法,并且需要放在构造方法的第一行
3、父类中public、protected修饰的属性和方法可以继承,private修饰的属性和方法不能被继承
4、规则:创建子类对象的时候,首先调用的是父类的无参构造方法创建一个父类对象
5、可以在子类中显示调用父类的有参构造方法
6、如果父类的属性均为private修饰,则可以通过共有的getter、setter方法来调用
7、通过this或者super调用构造方法的时候必须在第一条语句
继承案例:teacher类继承person类
person类:
class Person {
public String name;
public int age;
public char gender;
public Person(String name, int age, char gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
/*
* get方法区
*/
public String getName() {
return name;
}
public int getAge() {
return age;
}
public char getGender() {
return gender;
}
/*
* 人具有的行为
*/
public void eat() {
System.out.println(name + "在吃饭");
}
public void sleep() {
System.out.println(name + "在睡觉");
}
}
teacher类:
// 老师具有人的属性和自己个人的一些职业等属性
class Teacher extends Person {
private String title;
private String course;
private String className;
public Teacher(String name, int age, char gender, String title, String course, String className) {
super(name, age, gender);// 必须放在第一行
this.title = title;
this.course = course;
this.className = className;
}
/*
* get方法区
*/
public String getTitle() {
return title;
}
public String getCourse() {
return course;
}
public String getClassName() {
return className;
}
/*
* 老师具有的行为
*/
public void teach() {
System.out.println(getName() + "在教课");
}
// 这个方法重写了父类里面的eat方法,子类中重写的方法将覆盖父类里的原方法
public void eat() {
System.out.println("先出示自己的教师证");
System.out.println(getName() + "在吃饭");
}
}
class ExtendsDemo {
public static void main(String[] args) {
Teacher t = new Teacher("苍井空", 20, '女', "高级老师", "生物", "二班");
/*
* 如果采用下面的方式构造和初始化,person类和teacher类中必须包含空参构造方法和set方法
Teacher t = new Teacher();
t.setName("苍井空");
t.setAge(20);
t.setGender('女');
t.setTitle("高级老师");
t.setClassName("二班");
t.setCourse("生物");
*/
t.eat();
t.sleep();
t.teach();
}
}
- 控制台的输出:
先出示自己的教师证
苍井空在吃饭
苍井空在睡觉
苍井空在教课