继承的概念
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
继承关键字
1.extends关键字
在Java中如果要想要实现继承,可以直接使用如下的语法来表示。
class 父类{} // 定义父类
class 子类 extends 父类{} // 使用extends关键字实现继承
例:通过子类扩展父类的功能
package charjava;
class Cat { // 定义Cat类
private String name; // 定义name属性
private int age; // 定义age属性
public String getName() { // 取得name属性
return name;
}
public void setName(String name) { // 设置name属性
this.name = name;
}
public int getAge() { // 取得age属性
return age;
}
public void setAge(int age) { // 设置age属性
this.age = age;
}
}
class Student extends Cat { // Student是Cat的子类
private String school; // 新定义的属性school
public String getSchool() { // 取得school属性
return school;
}
public void setSchool(String school) { // 设置school属性
this.school = school;
}
}
public class java13 {
public static void main(String[] args) {
Student student = new Student();
student.setName("张三"); // 此时访问的方法是父类中的,子类中并没有定义
student.setAge(30); // 此时访问的方法是父类中的,子类中并没有定义
student.setSchool("清华大学"); // 此时的方法是在子类中定义的
System.out.println("姓名:" + student.getName() + ",年龄:" + student.getAge() + ",学校:" + student.getSchool());
}
}
注意:只允许多层继承不能多重继承。一个子类只能继承一个父类;一个子类可以有一个父类,一个父类还可以有一个父亲。
implements关键字
package charjava;
interface A {
void eat();
void sleep();
}
interface B {
void show();
}
class C implements A,B {
public void eat() {
System.out.println("大口吃");
}
public void sleep() {
}
public void show() {
}
}
public class java14 {
public static void main(String[] args) {
C c = new C();
c.eat();
}
}
在使用继承的时候也应注意的是:子类是不能直接访问父类中的私有成员的,但是子类可以调用父类中的非私有方法,但是不能直接调用父类中的私有成员。
继承的特性
- 子类拥有父类非private的属性、方法。
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
- Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如B类继承A类,C类继承B类,所以按照关系就是B类是C类的父类,A类是B类的父类,这是Java继承区别于C++继承的一个特性。
- 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
super关键字的作用
使用super可以从子类中调用父类中的构造方法、普通方法、属性。
例:使用super调用父类中的指定构造方法
package charjava;
class Horse { // 定义父类Horse
private String name; // 定义name属性
private int age; // 定义age属性
public Horse(String name, int age) { // 通过构造方法设置name和age
this.setName(name); // 设置name属性内容
this.setAge(age); // 设置age属性内容
}
public String getName() { // 取得name属性
return name;
}
public void setName(String name) { // 设置name属性
this.name = name;
}
public int getAge() { // 取得age属性
return age;
}
public void setAge(int age) { // 设置age属性
this.age = age;
}
public String getInfo() { // 信息输出
return "姓名:" + this.getName() + ";年龄:" + this.getAge();
}
}
class Age extends Horse { // Age是Horse的子类,扩展父类的功能
private String school; // 新定义的属性school
public Age(String name, int age, String school) {
super(name, age); // 指定调用父类中的构造方法
this.setSchool(school);
}
public String getSchool() { // 取得school属性
return school;
}
public void setSchool(String school) { // 设置school属性
this.school = school;
}
public String getInfo() { // 覆写父类中的方法
return super.getInfo() + ";学校:" + this.getSchool(); // 扩充父类的方法
}
}
public class java15 {
public static void main(String[] args) {
Age age = new Age("张三",30,"清华大学");
System.out.println(age.getInfo()); // 打印信息,调用覆写过的方法
}
}
this与super的区别
序号 | 区别点 | this | super |
1 | 属性访问 | 访问本类中的属性,如果本类没有此属性则从父类中继续查找 | 访问父类中的属性 |
2 | 方法 | 访问本类中的方法,如果本类中没有此方法,则从父类中继续查找 | 直接访问父类中的方法 |
3 | 调用构造 | 调用本类构造,必须放在构造方法的首行 | 调用父类构造,必须放在子类构造方法的首行 |
4 | 特殊 | 表示当前对象 | 无此概念 |
final关键字
final在Java中表示的意思是最终的意思,也可以称为完结器。可以使用final关键字声明类、属性、方法,在声明时要注意以下几点:
- 使用final声明的类不能有子类;
- 使用final声明的方法不能被子类所覆写;
- 使用final声明的变量即成为常量,常量不可以修改。
声明类:
final class 类名 {//类体}
声明方法:
修饰符(public /private /default /protected) final 返回值类型 方法名() { // 方法体}
注意:final定义的类,其中的属性、方法不是final的。