继承

本文深入探讨Java中的关键概念,包括super关键字的使用、阻止继承的final关键字、强制类型转换、抽象类的作用、访问权限的设定、equals与hashCode的正确实践、toString方法的自定义、泛型数组列表的应用、对象包装器与自动装箱机制、枚举类的创建及反射技术的运用,旨在帮助读者全面掌握Java编程的基础与进阶技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

仅仅是看书笔记,便于复习翻看

一、super

super不是一个对象的引用,不能将super付给另一个对象变量,他只是一个编译器调用超类方法的特殊关键字,使用super调用父类构造器的语句必须是子类的第一句。

用途
  1. 调用超类的方法
  2. 调用超类的构造器

注:在子类覆盖一个超类方法的时候,子类方法不能低于超类方法的可见性。特别是超类方法是public的时候,子类一定要声明为public。若遗漏之后,编译器将会把他解释称为更为严格的访问权限。

二、阻止继承

有时候程序设计者不想自己的类被继承,那么就会将自己的类使用final关键字进行修饰

public final class Father{...}
那么这个Father类就不允许其他任何类去继承他
复制代码

若只想类中的有些方法不想让子类对其进行修改覆盖,那么也可以使用final进行修饰

public final String getName(){return name;}
复制代码

三、强制类型转换

子类的引用赋给一个超类变量,编译器是允许的 但是若超类的引用赋给一个子类变量的时候,必须使用类型转换

  • 只能在继承层次内进行类型转换
  • 在将超类转换成子类之前,应该使用instanceof进行检查

四、抽象类

比继承更具有通用性的,更高一个层次的结构就可以当作一个抽象类,抽象类不会实例化任何东西,只是封装一些通用的属性,通用的方法(抽象方法:不需要有方法的具体内容),也可以有具体的方法

建议将通用的实例域和方法(无论是不是抽象的)放在超类中(无论是不是抽象类)
  1. 拓展抽象类
  • 在抽象类中定义部分抽象类的方法或不定义抽象类方法,这样也就必须把子类定义成抽象类
  • 超类中定义全部的超类方法,子类就可以不抽象了

五、访问权限

private:对本类可见 public:对所有类可见 protected:对本包和子类可见(不推荐使用,破坏封装性) 默认:对本包可见

六、equals

equals是判断两个对象是不是有相同的引用

1. 特性
  • 自反性:x.equals(x),返回true
  • 对称性:y.equals(x)--->x.equals(y)都应该是true
  • 传递性:x.equals(y),y.equals(z)----->x.equals(z)都是true
  • 一致性:反复调用同一个,结果不应该变
  • 任何非空引用x.equals(null),false

七、hashCode方法

散列码(hashCode)是由对象导出的一个整数值。无规律

注意

字符串的散列码是由内容导出的,若字符串内容相同即散列码相同 equals与hashCode的定义必须保持一致

八、toString方法

返回表示对象值得字符串。格式:类名,随后是一对方括号括起来的域值。 Manager[name=...,salary=...,hireDay=...]

建议 :自定义的每一个方法最好都有自己的toString方法,可以使使用这个类的人获得这个类得信息

九、泛型数组列表

Java中允许动态创建数组,即可以在运行时在确定数组的大小。

ArrayList是一个采用类型参数的泛型类,使用一对尖括号<>来指定数组列表保存的元素对象类型,例如:

ArrayList<Employee> staff = new ArrayList<>();
Java7以后后面的<>中可以省略
复制代码

使用add可以添加元素到数组中,若add数组已经被填满,那么它就会自动扩充数组,自动创建一个更大的数组(1.5倍扩容),当使用add添加完成后,可以使用**trimToSize()**进行数组自适应,调整成当前数组内元素数量的大小,垃圾回收器会回收多余的存储空间。(为了减少操作时间,确定不再扩容后使用trimToSize(),再次扩容就会花很多时间移动存储块)

访问数组列表

add添加新元素,set访问已经存在的元素,并进行替换,remove进行删除

十、对象包装器与自动装箱

Integer、Long、Float、Double、Short、Byte、Character、Void、Boolean这六个类派生于Number。对象包装器是不可变的,一但构造了包装器,就不允许更改其内部的值。并且,对象包装器是final,不可以继承的。

ArrayList<Integer> list = new ArrayList<>();
list.add(3);
它会将上一行自动执行成list.add(Integer.valueOf(3));
复制代码

这种变换叫做自动装箱,相反的,Integer--->int ,自动拆箱

装箱和拆箱是编译器认可的,而不是虚拟机

十一、枚举类

public enum Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE};
复制代码

在比较两个枚举类的时候, 直接使用==进行比较即可

十二、反射

能够分析类能力的程序称为反射,作用:

  • 在运行时分析类的能力
  • 在运行时查看对象,例如:toString()方法
  • 实现通用的数组操作代码
  • 利用Method对象
1. Class类

在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识,这个信息跟踪者每个对象所属的类。 然而,可以通过专门的Java类访问这些信息。保存这些信息的类称为Class。 虚拟机为每一个类型管理一个Class对象。因此,可以使用 == 运算符实现两个类对象比较的操作,例如:

if(e.getClass() == Rmployee.class)
复制代码

newInstance()

动态创建一个类的实例。newInstance方法调用默认无参构造器,创建一个与调用它具有相同类的类型的实例

2. 利用反射分析类的能力

java.lang.reflect包中有三个类Field、Method和Constructor分别描述类的域、方法和构造器。

getClass(),用来返回项目的名称。

Filed类有一个getType方法,用来返回描述域所属类型的Class对象。

Modifiers类中的isPublic、isPrivate或idFinal判断方法或构造器是否是public、private或final。

Class类中的getFields、getMethods和getConstructors方法将分别返回类提供给的public域、方法和构造数组,其中包括超类的公有成员。getDeclareFields、getDeclareMethods和getDeclaredConstructors方法将分别返回

转载于:https://juejin.im/post/5bcb1862e51d450e6160877c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值