面向对象:继承
1、继承
继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。
继承关系的俩个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来
表示。
public class student extends Person{
}//student类继承了Person类
- 一个子类只能"直接"继承一个父类,就像是一个人只能有一个亲生父亲
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就表示访问或调用父类中的属性和方法。
- 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)
-
方法重写只存在于子类和父类(包括直接父类和间接父类)之间。在同一个类中方法只能被重载,不能被重写.
-
静态方法不能重写
-
父类的静态方法不能被子类重写为非静态方法 //编译出错
-
父类的非静态方法不能被子类重写为静态方法;//编译出错
-
子类可以定义与父类的静态方法同名的静态方法(但是这个不是覆盖)
【例子】
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.父类的功能,子类不一定需要,或者不一定满足
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!