Java学习-面向对象04继承

继承

  • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
  • extends的意思是”扩展“,派生类是超类的扩展。
  • Java中类只有单继承,没有多继承!
  • 继承是类和类之间的一种关系,除此之外,类和类之间的关系还有依赖、组合、聚合等。
  • 继承关系的两个类,一个为派生类(子类),一个为超类(基类,父类),派生类继承超类,使用关键字extends来表示。
  • 派生类和超类之间,从意义上讲应该具有”is a“的关系。

涉及三个重要的知识点:

  • object类
  • super
  • 方法重写(重点->多态)

object类

Application.java

package com.oop.www;

import com.oop.www.demo05.Student;

public class Application {
    public static void main(String[] args) {
        Student student = new Student();
        student.say();//说了一句话
        System.out.println(student.money);//1000000000
        
    }


}

Person.java

package com.oop.www.demo05;

//Person类 人:超类(父类)
//Java中所有类都默认直接继承或者间接继承 Object类(祖宗类)
public class Person /*extends Object*/{
    //public:公开
    //protected:保护
    //default:默认
    //private:私有
    public int money = 10_0000_0000;
    public void say(){
        System.out.println("说了一句话");
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }
}

Student.java

package com.oop.www.demo05;

//学生 is 人:派生类(子类)
//派生类继承了超类,就会拥有超类的所有属性方法!
public class Student extends Person {
    //Ctrl + H:查看继承关系

}

super

Application.java

package com.oop.www;

import com.oop.www.demo05.Person;
import com.oop.www.demo05.Student;

public class Application {
    public static void main(String[] args) {
        Student student = new Student();
        student.test("小王");

    }


}

Person.java

package com.oop.www.demo05;

//Person类 人:超类(父类)
//Java中所有类都默认直接继承或者间接继承 Object类(祖宗类)
public class Person /*extends Object*/{
    protected String name = "李四";


}

Student.java

package com.oop.www.demo05;

//学生 is 人:派生类(子类)
//派生类继承了超类,就会拥有超类的所有属性方法!
public class Student extends Person {
    private String name = "张三";

    public void test(String name){
        System.out.println(name);//小王
        System.out.println(this.name);//张三
        System.out.println(super.name);//李四
    }

}

Application.java

package com.oop.www;

import com.oop.www.demo05.Person;
import com.oop.www.demo05.Student;

public class Application {
    public static void main(String[] args) {
        Student student = new Student();

        student.test();

    }


}

Person.java

package com.oop.www.demo05;

//Person类 人:超类(父类)
//Java中所有类都默认直接继承或者间接继承 Object类(祖宗类)
public class Person /*extends Object*/{
    protected String name = "李四";
    
    //私有的东西无法被继承
    public void print(){
        System.out.println("Person");
    }

}

Student.java

package com.oop.www.demo05;

//学生 is 人:派生类(子类)
//派生类继承了超类,就会拥有超类的所有属性方法!
public class Student extends Person {
    private String name = "张三";

    public void print(){
        System.out.println("Student");
    }

    public void test(){
        print();// Student
        this.print();// Student
        super.print();// Person
    }



}

Application.java

package com.oop.www;

import com.oop.www.demo05.Person;
import com.oop.www.demo05.Student;

public class Application {
    public static void main(String[] args) {
        Student student = new Student();

        

    }


}

运行结果

Person无参构造器执行了
Student无参构造器执行了

Process finished with exit code 0

Person.java

package com.oop.www.demo05;

//Person类 人:超类(父类)
//Java中所有类都默认直接继承或者间接继承 Object类(祖宗类)
public class Person /*extends Object*/{
    public Person(){
        System.out.println("Person无参构造器执行了");
    }
    
    protected String name = "李四";
    
    //私有的东西无法被继承
    public void print(){
        System.out.println("Person");
    }

}

Student.java

package com.oop.www.demo05;

//学生 is 人:派生类(子类)
//派生类继承了超类,就会拥有超类的所有属性方法!
public class Student extends Person {
    public Student(){
        System.out.println("Student无参构造器执行了");
    }
    private String name = "张三";

    public void print(){
        System.out.println("Student");
    }

    public void test(){
        print();// Student
        this.print();// Student
        super.print();// Person
    }



}

Application.java

package com.oop.www;

import com.oop.www.demo05.Person;
import com.oop.www.demo05.Student;

public class Application {
    public static void main(String[] args) {
        Student student = new Student();



    }


}

运行结果

Person有参构造器执行了
Student无参构造器执行了

Process finished with exit code 0

Person.java

package com.oop.www.demo05;

//Person类 人:超类(父类)
//Java中所有类都默认直接继承或者间接继承 Object类(祖宗类)
public class Person /*extends Object*/{
    public Person(){
        System.out.println("Person无参构造器执行了");
    }

    public Person(String name){
        System.out.println("Person有参构造器执行了");
        this.name = name;
    }

    protected String name = "李四";

    //私有的东西无法被继承
    public void print(){
        System.out.println("Person");
    }

}

Student.java

package com.oop.www.demo05;

//学生 is 人:派生类(子类)
//派生类继承了超类,就会拥有超类的所有属性方法!
public class Student extends Person {
    public Student(){
        //隐藏代码:调用了超类的无参构造器
        //super();//调用超类的构造器,必须在派生类构造器的第一行
        super("张三");
        //this() //super()和this()不能同时出现,this()也必须在第一行,因此两者同时出现会冲突
        System.out.println("Student无参构造器执行了");
    }

    public Student(String name){
        this.name = name;
    }

    private String name = "张三";

    public void print(){
        System.out.println("Student");
    }

    public void test(){
        print();// Student
        this.print();// Student
        super.print();// Person
    }



}

super注意点:

  1. super调用超类的构造器,必须在构造器的第一行

  2. super必须只能出现在派生类的方法或者构造器中

  3. super和this不能同时调用构造器

对比this:

  • 代表的对象不同

    this:当前对象(调用者对象)

    super:超类对象的引用

  • 前提

    this:没继承也可以使用

    super:只有在继承条件满足时才能使用

  • 构造方法

    this():本类的构造

    super():超类的构造

方法重写

Application.java

package com.oop.www;

import com.oop.www.demo05.A;
import com.oop.www.demo05.B;

public class Application {
    //注意:静态方法和非静态方法区别很大!
    //静态方法:方法的调用只和左边定义的数据类型有关
    //非静态方法:重写
    public static void main(String[] args) {

        A a = new A();
        a.test();//A=>test()

        //父类的引用指向子类(为了方便写以后就叫做父子类,之前写的超类和派生类)
        B b = new A();//子类重写了父类的方法
        b.test();//A =>test()


    }



}

B.java

package com.oop.www.demo05;

//重写都是方法的重写,与属性无关
public class B {
    public void test(){
        System.out.println("B=>test()");
    }
}

A.java

package com.oop.www.demo05;

//继承
public class A extends B {
    //Override 表示重写
    @Override//注解:有功能的注释
    public void test(){
        System.out.println("A=>test()");
    }
}

重写:需要有继承关系,子类重写父类的方法

  1. 方法名必须相同
  2. 参数列表必须相同
  3. 修饰符:范围可以扩大,但是不能缩小!(public->protected->default->private)(从大到小)
  4. 抛出异常:范围,可以缩小,但是不能扩大!(ClassNotFoundException->Exception(大))

重写:子类的方法和父类必须一致,方法体不同!

为什么需要重写?

父类的功能,子类不一定需要,或者不一定满足!

快捷键:Alt+Insert(Override)

posted on 2025-06-23 07:52  burgess0x  阅读(6)  评论(0)    收藏  举报