Java——继承

参考书目——《Java核心技术 卷一》第五章
1.类、超类、子类

  • 子类继承超类,Java中用关键字extends表示继承(子类 extends 超类),所有的继承都是公有继承。子类比超类拥有的功能更加丰富,封装了更多的数据。
  • 子类不能直接访问超类的私有域。
  • 覆盖方法。超类中的有些方法并不适用与子类,需要提供一个新的方法来覆盖超类中的这个方法。
  • 在覆盖一个方法时,子类的方法不能低于超类方法的可见性,尤其当超类是public,子类方法一定要声明为public,否则编译器会将它解释为试图提供更严格的访问权限。
public double getSalary() {
	/*
	//return salary + bonus;
	//子类不能直接访问超类的私有域
	*/
	
	/*
	double baseSalary = getSalary();
	return baseSalary + bonus;
	//因为子类也有这个方法,这样程序会不断调用这个方法直到崩溃
	//这里希望的是调用超类的方法
	*/
	return super.getSalay() + bouns;
	//使用关键字super
	
}
  • super与this并不一样。super不是一个对象的引用,不能将super赋给另一个对象变量。
  • 在子类中可以增加域、增加方法、覆盖超类的方法,但是不能删除继承的任何域或方法。
  • 可以通过super实现对超类构造器的调用,super调用超类构造器的语句必须是子类构造器语句的第一句。如果子类的构造器没有显示地调用超类的构造器,则将自动地调用超类默认构造器(无参)。如果超类没有不带参数的构造器,而且子类又没有显示地调用超类的其他构造器,则Java会报错。
public zilei(String name, String job, int age, int year, int month, int day) {
	//调用超类的构造器
	super(name, job, age);
	year = 2019;
	month = 1;
	day = 1;
}
  • this 的两个用途:一是引用隐式参数, 二是调用该类的其他构造器
    super的两个用途:一是调用超类的方法,二是调用超类的构造器

  • 不能将超类的引用赋值给子类变量,反之可以。

  • 将超类的引用赋值给子类,需要强制类型转换(第一,只能在继承层次内进行类型转换,第二,在将超类转化为子类之前,先用instanceof函数进行检查)

  • 重载解析:以函数名f为例,编译器会列举所有的同名函数(包括其超类中的同名public方法),之后编译器会查看所有方法提供的参数类型,如果找到一个完全匹配的就选择这个方法。

  • 如果是private、static、final方法或者是构造器,那么编译器可以准确的知道应该调用哪个方法,这种方法称为静态绑定。

  • 当程序运行时,并且采用动态绑定调用方法时,虚拟机一定调用与被引用对象的实际类最合适的那个类的方法。

  • 方法表:列出了所有方法的签名和实际调用的方法。减小开销。

  • final类:不允许扩展的类,即不能被继承的类。

  • final方法:子类不能覆盖的方法。

  • 抽象类中不能包含具体方法,最好将域和方法(不论是否抽象)放在超类中,

  • Java中控制可见性的四个访问修饰符:
    仅对本类可见——private
    对所有类可见——public
    对本包和所有子类可见——protected
    对本包可见——默认,不需要修饰符

2.Object类

  • equals方法。用于检测两个对象是否相等。子类中定义的equals方法,首先要调用超类的equals方法。
  • hashCode方法。每个对象都有一个默认的散码表,其值为对象的储存地址。
  • toString方法。返回表示对象值得字符串

3.泛型数组列表ArrayList

4.对象包装器和自动装箱

  • 例如Integer类和int基本类型之间的相互转化。int转为Integer称为自动打包,反之称为自动拆箱。
  • 对象包装器类是final,不能定义他们的子类。
  • “==”也可以用于对象包装器,但是比较的是两个对象是否指向一个存储区域。
Integer a = 1000;
Integer b = 1000;
//使用==, 返回false
if(a == b) {
	...
}
//使用equals方法,返回true
if(a.equals(b)) {
	...
}

需要注意的是,在自动装箱规范中要求boolean、byte、char <= 127, 介于-128~127之间的short和int会被包装到固定的对象中。如果上面的a和b分别初始化为100, 则 a==b返回true。

  • 由于包装器类可以引用null,所以自动装箱可能会抛出一个NullPointerException异常:
Integer n = null;
System.out.println(n * 2);//抛出异常


  • 如果一个表达式中包含Integer和Double类,Integer就会拆箱,提升为double,再装箱为Double。
  • 装箱和拆箱是编译器认可的。

5.参数数量可变的方法
Java中用省略号表示这个方法可以接收任意数量的变量:…

public static double max(double... values) {
	...
}

6.枚举类

7.反射
能够分析类能力的程序称为反射。反射机制可以用来:

  • 在运行时分析类的能力
  • 在运行时查看对象
  • 实现通用的数组操作代码
  • 利用Method对象,这个对象很像c++中的函数指针
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值