Java 继承

继承

  • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
  • extends的意思时“扩展”。子类是父类的扩展。
  • Java中类只有单继承,没有多继承。(一个儿子只能有一个爸爸,而一个爸爸能有很多儿子)
  • 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等关系。
  • 继承关系的两个类,一个为子类,一个为父类。子类继承父类,使用关键字extends表示。
  • 子类和父类之间,从意义上讲应该具有“is a”的关系
  • 继承的基础原理:在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象,所以子类可以继承父类中所有的属性和方法,包括private修饰的属性和方法,但是子类只是拥有父类private修饰的属性和方法,却不能直接使用它,也就是无法直接访问到它(子类可以通过调用父类的public声明的get方法来获取父类的private属性,但无法访问父类的private方法)。
//人 :父类
public class Person {
    public int money = 1000;
    public void say(){
        System.out.println("说了一句话!");
    }
}


//学生  is  人:派生类,子类
//子类继承父类,就会拥有父类的全部方法
//前提是方法的修饰符为 public 公共的
//一般类的属性都是私有的,不会继承,但是会像封装那样,提供方法进行操作
public class Teacher extends Person{
}


//测试类
public abstract class Application {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        teacher.say();
        System.out.println(teacher.money);
    }
}
  • 子类和父类都有的属性,子类.这个属性 得出的结果为子类中所定义的,如果子类没有,父类有,则子类继承父类的这个属性
  • 快捷键:Ctrl + H 查看当前类的关系类
  • 所有的类,都默认直接或间接继承Object类

super

  • super在子类中指代父类,利用super可以调用父类的方法或者参数
  • 父类的私有属性或者方法可以被子类继承,但是子类无权访问
  • super必须只能出现在子类的方法或者构造方法中,出现在非子类中只会被认作Object类
  • 在子类创建对象时,会默认调用父类的构造方法,所以通过super调用父类的构造方法,必须在构造方法的第一行
  • 而 super 和 this 不能同时出现在构造方法中,也就是不能同时调用构造方法
  • 一旦父类定义了有参构造,而没有显示的定义无参构造,子类将会报错,因为无参构造消失了

与 this 的区别

  • 代表的对象不同:
    • this 代表当前所属类
    • super 代表父类对象的引用
  • 前提
    • this 没有继承也可以使用
    • super 只能在继承中使用

方法的重写

静态方法:方法的调用只和左边,即只和定义的数据类型有关

public class A extends B{
    public static void test() {
        System.out.println("A=>test()");
    }
}

public class B {
    public static void test(){
        System.out.println("B=>test()");
    }
}

//测试
public static void main(String[] args) {

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

        //父类的引用指向了子类
        B b = new A();
        b.test();//B=>test(),此时可以知道 B类 的方法并没有被 A类 重写

    }

非静态方法:

public class A extends B{
    public void test() {
        System.out.println("A=>test()");
    }
}

public class B {
    public void test(){
        System.out.println("B=>test()");
    }
}

//测试
public static void main(String[] args) {

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

        //父类的引用指向了子类
        B b = new A();
        b.test();//A=>test(),A类 重写了 B类 的方法

    }
  • 两个类之间需要有继承关系,子类重写父类的方法!

  • 方法重写只适用于父类的非静态方法,还有如下几种不能被重写:

    • final 常量,是放在常量池中
    • private 方法:方法私有,其他类没有访问权限
  • 注意点:

    • 方法名必须相同

    • 参数列表必须相同

    • 修饰符:权限范围可以扩大但不能缩小

    • 抛出的异常:范围可以被缩小但不能被扩大

  • 子类的方法和父类的方法一致,只是方法体不同

为什么需要方法重写

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

快捷键:Alt + Insert 快速重写方法

posted @   远帆启航  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示