本质:是对某一批类的抽象,从而实现对现实世界更好的建模
继承就是 子类 继承 父类 的特征和行为,使得 子类对象(实例)具有父类的实例域和方法,或 子类 从 父类 继承方法,使得 子类 具有 父类 相同的行为
继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等
继承关系的俩个类,一个为子类(又称派生类)一个为父类(又称基类)。子类继承父类,使用关键字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 {
}
输出
说了一句话
//在Java中,所有的类,都默认直接或者间接继承Object类
public class Person /*extends Object*/ {
}
通过IDEA的快捷键crtl+H
可以得到如下图的层次结构
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类
this关键字:指向自己的引用
super注意点:
Vs this:
使用示例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
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
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的无参执行了
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变
示例
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
原文:https://www.cnblogs.com/dt746294093/p/14638675.html