Java基础:继承
Java基础:继承
继承
-
本质:是对某一批类的抽象,从而实现对现实世界更好的建模
-
继承就是 子类 继承 父类 的特征和行为,使得 子类对象(实例)具有父类的实例域和方法,或 子类 从 父类 继承方法,使得 子类 具有 父类 相同的行为
-
继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等
-
继承关系的俩个类,一个为子类(又称派生类)一个为父类(又称基类)。子类继承父类,使用关键字extends来表示。extands 的意思是“扩展”,用于继承的关键字,在 Java 中子类是父类的扩展
-
类的继承格式
class 父类 { } class 子类 extends 父类 { }
-
示例
public class Application { public static void main(String[] args) { Student student = new Student(); student.say(); } }
父类
//Person 人 //父类(基类) public class Person { public void say() { System.out.println("说了一句话"); } }
子类
//Student 人 //子类(派生类) 子类继承父类,会拥有父类的全部方法 //子类 extends 父类 public class Student extends Person { }
输出
说了一句话
Object类
- 在 Java 中,所有的类,都默认直接或者间接继承Object类
//在Java中,所有的类,都默认直接或者间接继承Object类
public class Person /*extends Object*/ {
}
通过IDEA的快捷键crtl+H
可以得到如下图的层次结构
super关键字与this关键字
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类
this关键字:指向自己的引用
-
super注意点:
- super 调用父类的构造方法,必须在构造方法的第一个
- super 必须只能出现在子类的方法或构造方法中!
- super 和 this 不能同时调用构造方法!
-
Vs this:
- 代表的对象不同:
- this:本身调用着的对象
- super:代表父类对象的引用
- 前提:
- this:没有继承也可以使用
- super:只能在继承条件下使用的条件下才可以使用
- 构造方法:
- this();调用本类的构造
- super();调用父类的构造
- 代表的对象不同:
-
使用示例1(打印父类、子类的属性):
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.text("狗爹");
}
}
父类
public class Person {
//public 公共的
//protected 受保护的
//default 不声明就是默认的
//private 私有的
//注:私有制的东西没法继承
protected String name = "Dt";
}
子类
public class Student extends Person {
private String name = "Destroy";
public void text(String name) {
System.out.println(name);//狗爹
System.out.println(this.name);//Destroy
System.out.println(super.name);//Dt
}
}
输出
狗爹
Destroy
Dt
- 使用示例2(调用父类、子类的方法):
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.text1();
}
}
父类
public class Person {
public void print() {
System.out.println("Person");
}
}
子类
public class Student extends Person {
public void print() {
System.out.println("Student");
}
public void text1() {
print();//Student
this.print();//Student
super.print();//Person
}
}
输出
Student
Student
Person
- 使用示例3(父类、子类的构造器):
public class Application {
public static void main(String[] args) {
Student student = new Student();
}
}
父类
public class Person {
public Person() {
System.out.println("Person无参执行了");
}
}
子类
public class Student extends Person {
public Student() {
//super();为隐藏代码,可以不写,作用:调用了父类的无参构造
super();//调用父类的构造器,必须要在子类的第一行
System.out.println("Student的无参执行了");
}
}
输出
Person无参执行了
Student的无参执行了
方法的重写(Override)
-
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变
-
示例
public class Application { //静态方法和非静态方法区别很大! //静态方法:不能被重写 //非静态:重写 public static void main(String[] args) { A a = new A(); a.text();//A //方法的调用只和左边,定义的数据类型有关 //父类的引用指向了子类 B b = new A();//子类重写了父类的方法 b.text();//B } }
父类
//重写都是方法的重写,和属性无关 public class B { public void text() { System.out.println("B->text()"); } }
子类
public class A extends B { //Override 重写 @Override//注释,有功能的注释 public void text() { System.out.println("A->text()"); } }
输出
A->text() A->text()
Note:
重写:需要有继承关系,子类重写父类的方法!
1.方法名必须相同
2.参数列表必须相同
3.修饰符:范围可以扩大,但不能缩小 public> protected> default> private
4.抛出的异常:范围可以被缩小但不能被扩大 ClassNotFoundException --> Exception(大)重写,子类的方法必须要和父类一致,方法体不同!
为什么需要重写:
父类的功能,子类不一定需要,或者不一定满足!IDEA快捷键:Fn+Alt+Insert 选中 Override