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注意点:

    1. super 调用父类的构造方法,必须在构造方法的第一个
    2. super 必须只能出现在子类的方法或构造方法中!
    3. 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

posted @ 2021-04-09 20:24  D..T  阅读(69)  评论(0编辑  收藏  举报