学习笔记 - Java 面向对象_中
this 关键字#
当形参名和属性名相同时,使用 this 关键字来区分,有 this 修饰的变量是属性,无 this 修饰的是形参。
this 可以调用的除了属性,还有方法、构造器。
所以,this 指的是当前对象(在方法调用时)或当前正在创建的对象(在构造器中调用时)。
在构造器中,使用 this(形参列表);
可以调用当前类中其它对应参数的构造器,但必须声明在首行(意味着只能声明一次)。
继承性#
使用继承的原因#
从代码的两个角度来考虑:
- 自上而下:父类的内容与子类部分相同,但子类需要拓展,这时候就可以用继承来获得父类基本内容,子类再去拓展额外内容;
- 自下而上:多个类拥有相同的内容,此时就可以抽取这部分相同的内容为父类,子类继承即可。
使用继承的好处#
- 减少代码冗余,提高代码复用性;
- 继承有利于功能的拓展;
- 继承使类之间产生了 is - a 的关系,使父类更通用,子类更具体,同时为多态的使用提供了前提。
补充及注意事项#
- 继承性不可打破封装性,父类中私有的属性或方法在子类中无法使用;
- 不要仅为了获取某类中的某个功能来使用继承;
- Java 中的类如果没有显式的声明所继承的父类,则默认继承 java.lang.Object 类;
- Java 支持多层继承,区分直接父类和间接父类;
- Java 的单继承性:一个父类可以声明多个子类,但子类只能有一个父类;
- 子类继承父类时,不会继承父类的构造器。
方法重写#
子类对从父类继承而来的方法进行覆盖、覆写的操作,就称为方法的重写。
格式#
权限修饰符 返回值类型 方法名(形参列表) throws 异常类型{
//方法体
}
规则#
- 子类中要重写的父类方法,必须与父类中原有方法的方法名和形参列表相同;
- 子类中重写方法的权限修饰符应大于父类中原有方法的权限修饰符(父类中声明为私有的不可被重写);
- 关于返回值类型:
- 父类中原有方法的返回值类型为 void ,则子类中重写方法的返回值类型也必须是 void;
- 父类中原有方法的返回值类型为基本数据类型,则子类中重写方法的返回值类型也必须与之相同;
- 父类中原有方法的返回值类型为引用数据类型(例如类),则子类中重写方法的返回值类型也必须与之相同或者是其子类;
- 子类中重写方法的异常抛出可以与父类中原有方法的异常抛出相同,也可以是其异常类的子类。
补充#
可以使用 @Override
注解做方法重写校验,在添加了注解之后,如果方法名有误等会报错。
区分重载(overload)与重写(override \ overwrite):
- 重载是指同一个类中因方法形参列表不同而重新编码;
- 重写是继承父类方法后对父类方法进行重新编码。
super 关键字#
何时使用 super#
当子类继承父类以后,还想使用父类中的同名属性、被重写方法或构造器,此时可以通过 super 关键字进行调用。
补充知识#
-
调用父类中的同名属性、被重写方法时通过
super.xx
来实现; -
子类不会继承父类的构造器,所以需要调用父类构造器时要通过
super(形参列表)
来实现,且必须声明在子类构造器的首行; -
遵循首行原则,在子类的构造器中,
this(形参列表)
(重载构造器)和super(形参列表)
(调用父类构造器)只能二选一来使用; -
如果子类构造器的首行没有显式的调用 this 关键字和 super 关键字,则该构造器默认调用
super()
,即调用父类中空参的构造器; -
由 3 和 4 可得:子类的构造器中,只能是 调用本类中重载的构造器 或 调用父类构造器 两种情况之一;
-
由 5 可得:一个类中有 n 个构造器,则最多有 n-1 个构造器中使用了 this 关键字,剩下的一个使用了 super 关键字
多态性#
概念#
多态性是指一个事物的多种形态。
在 Java 中,体现在父类的引用指向子类的对象,例如:Person p = new Man();
虚拟方法调用#
在多态的场景下调用方法(仅适用于方法,不适用于属性):
- 编译时,认为方法是左边声明的父类中被重写的方法;
- 执行时,实际执行的是子类重写父类之后的方法。
简称为:编译看左边,运行看右边。对于属性来说得到的还是父类中的属性。
前提及优缺点#
使用前提#
- 要有类的继承关系;
- 要有方法的重写
优缺点#
优点:极大的减少了代码的冗余,不需要定义多个重载的方法。
缺点:在多态的场景下,创建了子类的对象,此时加载了子类的属性和方法。但是由于声明为父类的引用,所以无法调用子类特有的属性和方法。
向下转型#
使用强转符进行转换,例如:
Person p1 = new Man();
Man m1 = (Man)p1;
向下转型时可能会出现类型转换异常(ClassCastException),所以可以在向下转型之前使用 instanceof
来进行判断,格式:a instanceof A
,判断对象 a 是否是类 A 的实例。如果返回 true ,则与 superA(A 的父类)的判断也将返回 true 。
Object 类#
概述#
类 java.lang.Object
是类层次结构的根类,即所有其它类的父类。每个类都使用 Object 作为超类。
Object 类中声明的结构具有通用性:
- Object 类中没有声明属性;
- Object 类中提供了一个空参的构造器。
equals() 方法#
equals() 方法适用于引用数据类型。
- 对于自定义的类,未重写时比较两个对象的引用地址是否相同;
- 对于String、File、Date和包装类等,它们都重写了该方法,用于比较两个对象的实体内容是否相等。
区分 == 和 equals()#
== 是一个运算符,可以对基本数据类型和引用数据类型使用。对于基本数据类型,判断其数据值是否相等;对于引用数据类型,判断其地址值是否相等。
equals() 是一个方法,只能对引用数据类型使用。
toString() 方法#
- 对于自定义的类,未重写时默认打印对象的类名和其地址值;
- 对于String、File、Date和包装类等,它们都重写了该方法,调用时返回当前对象的实体内容。
clone() 方法#
克隆一个已有对象。
finalize() 方法#
当某个对象被垃圾回收器释放时,可以执行此方法。
作者:Koi.C
出处:https://www.cnblogs.com/KoiC/p/17644390.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
声明:转载或使用请注明本文地址,感谢您的阅读!如果文章内容帮到了您,烦请点一下推荐,不胜感激!
欢迎关注个人公众号!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端