面向对象:继承

1、继承

继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。

继承关系的俩个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来
表示。

public class student extends Person{
}//student类继承了Person类
  1. 一个子类只能"直接"继承一个父类,就像是一个人只能有一个亲生父亲

2.一个父类可以被多子类继承,就像一个父亲可以有多个孩子

3.父类中的属性和方法可以被子类继承

4.子类中继承了父类中的属性和方法后,在子类中能不能直接使用这些属性和方法,是和这些属性和方法原有的修饰符(public protected default private)相关的。
例如 :
父类中的属性和方法使用public修饰,在子类中继承后"可以直接"使用
父类中的属性和方法使用private修饰,在子类中继承后"不可以直接"使用

2、Object

在JAVA中,所有的类,都默认直接或间接继承Object,.所以每一个对象都和Object类有"is a"的关系。从API文档中,可以看到任何一个类最上层的父类都是Object。(Object类本身除外)
AnyClass is aObject。

3、super

子类继承父类之后,在子类中可以使用this来表示访问或调用子类中的属性或方法,使用super就表示访问或调用父类中的属性和方法。

  1. super的使用
    【访问父类中的属性】
//父类
public class Person{
protected String name = "zs";
}
//子类
public class Student extends Person{

  private String name = "lisi";
  public void test(String name){
  System.out.println(name);//String name
  System.out.println(this.name);//list
  System.out.println(super.name);//zs
  }
}

【调用父类中的方法】

//父类
package com.oop.ceshi;

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

}
//子类
package com.oop.ceshi;

public class Student extends Person{
    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不能同时调用构造方法

Vs this:
代表的对象不同:
this: 本身调用者的这个对象
super: 代表父类对象的引用
前提
this: 没有继承也可以使用
super:只能在继承条件才可以使用
构造方法
this();本类的构造
super();父类的构造

4、方法重写

方法的重写(override)

  1. 方法重写只存在于子类和父类(包括直接父类和间接父类)之间。在同一个类中方法只能被重载,不能被重写.

  2. 静态方法不能重写

  3. 父类的静态方法不能被子类重写为非静态方法 //编译出错

  4. 父类的非静态方法不能被子类重写为静态方法;//编译出错

  5. 子类可以定义与父类的静态方法同名的静态方法(但是这个不是覆盖)
    【例子】

A类继承B类 A和B中都一个相同的静态方法test

B a = new A();

a.test();//调用到的是B类中的静态方法test

A a = new A();

a.test();//调用到的是A类中的静态方法test

可以看出静态方法的调用只和变量声明的类型相关

这个和非静态方法的重写之后的效果完全不同

私有方法不能被子类重写,子类继承父类后,是不能直接访问父类中的私有方法的,那么就更谈不上
重写了。
【例子】

public class Person{
private void run(){}
}
//编译通过,但这不是重写,只是俩个类中分别有自己的私有方法
public class Student extends Person{
private void run(){}
}

重写:需要有继承关系,子类重写父类的方法
1.方法名必须相同
2.参数列表必须相同
3.修饰符:范围可以扩大: public>protected>Default>private
4.抛出的: 范围,可以被缩小,但不能扩大:ClassNotFoundException --> Exeption(大)

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

为什么需要重写?:
1.父类的功能,子类不一定需要,或者不一定满足

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