学习笔记 - Java 面向对象_中

阅读(7)
评论(0)
Beginning

this 关键字#

当形参名和属性名相同时,使用 this 关键字来区分,有 this 修饰的变量是属性,无 this 修饰的是形参。

this 可以调用的除了属性,还有方法、构造器。

所以,this 指的是当前对象(在方法调用时)或当前正在创建的对象(在构造器中调用时)。

在构造器中,使用 this(形参列表); 可以调用当前类中其它对应参数的构造器,但必须声明在首行(意味着只能声明一次)。

继承性#

使用继承的原因#

从代码的两个角度来考虑:

  • 自上而下:父类的内容与子类部分相同,但子类需要拓展,这时候就可以用继承来获得父类基本内容,子类再去拓展额外内容;
  • 自下而上:多个类拥有相同的内容,此时就可以抽取这部分相同的内容为父类,子类继承即可。

使用继承的好处#

  • 减少代码冗余,提高代码复用性;
  • 继承有利于功能的拓展;
  • 继承使类之间产生了 is - a 的关系,使父类更通用,子类更具体,同时为多态的使用提供了前提。

补充及注意事项#

  1. 继承性不可打破封装性,父类中私有的属性或方法在子类中无法使用;
  2. 不要仅为了获取某类中的某个功能来使用继承;
  3. Java 中的类如果没有显式的声明所继承的父类,则默认继承 java.lang.Object 类;
  4. Java 支持多层继承,区分直接父类和间接父类;
  5. Java 的单继承性:一个父类可以声明多个子类,但子类只能有一个父类;
  6. 子类继承父类时,不会继承父类的构造器。

方法重写#

子类对从父类继承而来的方法进行覆盖、覆写的操作,就称为方法的重写。

格式#

权限修饰符 返回值类型 方法名(形参列表) throws 异常类型{
	//方法体
}

规则#

  • 子类中要重写的父类方法,必须与父类中原有方法的方法名和形参列表相同;
  • 子类中重写方法的权限修饰符应大于父类中原有方法的权限修饰符(父类中声明为私有的不可被重写);
  • 关于返回值类型:
    • 父类中原有方法的返回值类型为 void ,则子类中重写方法的返回值类型也必须是 void;
    • 父类中原有方法的返回值类型为基本数据类型,则子类中重写方法的返回值类型也必须与之相同;
    • 父类中原有方法的返回值类型为引用数据类型(例如类),则子类中重写方法的返回值类型也必须与之相同或者是其子类;
  • 子类中重写方法的异常抛出可以与父类中原有方法的异常抛出相同,也可以是其异常类的子类。

补充#

可以使用 @Override 注解做方法重写校验,在添加了注解之后,如果方法名有误等会报错。

区分重载(overload)与重写(override \ overwrite):

  • 重载是指同一个类中因方法形参列表不同而重新编码;
  • 重写是继承父类方法后对父类方法进行重新编码。

super 关键字#

何时使用 super#

当子类继承父类以后,还想使用父类中的同名属性被重写方法或构造器,此时可以通过 super 关键字进行调用。

补充知识#

  1. 调用父类中的同名属性被重写方法时通过 super.xx 来实现;

  2. 子类不会继承父类的构造器,所以需要调用父类构造器时要通过 super(形参列表) 来实现,且必须声明在子类构造器的首行

  3. 遵循首行原则,在子类的构造器中,this(形参列表)(重载构造器)和 super(形参列表)(调用父类构造器)只能二选一来使用;

  4. 如果子类构造器的首行没有显式的调用 this 关键字和 super 关键字,则该构造器默认调用 super() ,即调用父类中空参的构造器;

  5. 由 3 和 4 可得:子类的构造器中,只能是 调用本类中重载的构造器 或 调用父类构造器 两种情况之一;

  6. 由 5 可得:一个类中有 n 个构造器,则最多有 n-1 个构造器中使用了 this 关键字,剩下的一个使用了 super 关键字

多态性#

概念#

多态性是指一个事物的多种形态。

在 Java 中,体现在父类的引用指向子类的对象,例如:Person p = new Man();

虚拟方法调用#

在多态的场景下调用方法(仅适用于方法,不适用于属性):

  • 编译时,认为方法是左边声明的父类中被重写的方法;
  • 执行时,实际执行的是子类重写父类之后的方法。

简称为:编译看左边,运行看右边。对于属性来说得到的还是父类中的属性。

前提及优缺点#

使用前提#

  1. 要有类的继承关系;
  2. 要有方法的重写

优缺点#

优点:极大的减少了代码的冗余,不需要定义多个重载的方法。

缺点:在多态的场景下,创建了子类的对象,此时加载了子类的属性和方法。但是由于声明为父类的引用,所以无法调用子类特有的属性和方法。

向下转型#

使用强转符进行转换,例如:

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() 方法#

当某个对象被垃圾回收器释放时,可以执行此方法。

Ending

作者:Koi.C

出处:https://www.cnblogs.com/KoiC/p/17644390.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

声明:转载或使用请注明本文地址,感谢您的阅读!如果文章内容帮到了您,烦请点一下推荐,不胜感激!


欢迎关注个人公众号!

posted @   KoiC  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
more_horiz
keyboard_arrow_up dark_mode menu palette
选择主题
点击右上角即可分享
微信分享提示