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 快速重写方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!