【自学】Java核心技术卷1_5.1-5.5继承

继承is- a

5.1类、超类、子类

  • extend:表明正在构造的新类派生于一个已存在的类。此处已存在的类称为超类(基类、父类),新类称为子类(派生类、孩子类)
  • 覆盖:子类的方法与超类的方法同名但不同功能。覆盖方法时,要保证返回类型的兼容性,允许子类将覆盖方法的返回类型定义为原返回类型的子类型。一定要保证覆盖方法不低于被覆盖方法的可见性。
  • super:要在子类覆盖超类的方法中调用超类的同名被覆盖方法,则要用super.func();还可以用super()放在子类构造器第一句,调用超类构造器。
  • this:引用隐式参数(可以说成调用被局部变量同名覆盖的域);放在构造器的第一句调用该类的其他构造器
  • 多态:一个对象变量可以指示多种实际类型
  • 动态绑定:在运行时依赖于隐式参数的实际类型来选择调用哪个方法(Java中不需要将方法声明为虚拟方法,默认就是动态绑定的处理方式,可以通过标记方法为final阻止其动态绑定)
  • 静态绑定:编译器在编译时就能确定调用哪个方法。private、static、final方法和构造器
  • 继承层次:由一个公共超类派生出来的所有类的集合(Java支持多继承)
  • 继承链:从某个特定的类到其祖先的路径称为该类的继承链
  • final:修饰不许被继承的类或不许被覆盖的方法。final类的所有方法自动成为final方法,但域不会自动变成final域
  • 置换法则:出现超类对象的任何地方都可以用子类对象置换

  • x.f(args) 方法调用过程:
  1. 编译器查看对象的声明类型和方法名
  2. 编译器查看调用方法时提供的参数类型
  3. 如果是private、static、final方法或构造器,则编译器可以确定该调用哪个方法(静态绑定)
  4. 当程序运行且采用动态绑定调用时,虚拟机一定调用与对象变量x实际所引对象类型最合适的类的方法。
  • 类型转换:子类的引用可以赋给超类变量,但要将超类的引用赋给子类变量就需要进行类型转换。类型转换只能在继承层次内,并且超类转换成子类之前,应该用instanceof先检查。一般情况下要尽量少用类型转换。
  • 抽象类:abstract修饰,不能new创建对象,但可以创建对象变量,引用子类对象。包含抽象方法的类一定是抽象类,但抽象类也可以包含具体方法和域。
  • public:对所有类可见
  • protected:对本包和所有子类可见
  • 默认:对本包可见(没有修饰符)
  • private:仅对本类可见

5.2 Object:所有类的超类

  • Java中每个类都是由Object类扩展而来的,可以使用Object类型变量引用任何类型的变量
  • Java中只有基本类型(数值、字符、布尔)不是对象,数组、字符串等都是对象

Object类的方法:hashCode()、toString()、equals()

  • hashCode():返回对象哈希值。相等的对象,其哈希值也相等。
  • toString():返回表示对象值的字符串(类名:[域值])。可用于调试。对象与字符串通过操作符“+”连接时,Java编译器自动调用toString()方法
  • equals():两个对象状态相等
  • Objects.equals(a,b):若a,b均为null,返回true;如果仅其中一个为null,返回false;否则调用a.equals(b)

  • 在子类中定义覆盖超类的equals()方法时,先调用超类equals(),如果超类中的域都相当,就需要比较子类中的实例域(这时候需要把Object类型的形参强制转换为子类类型)
public class Employee {
    ...
    @ Override public boolean equals(Object otherObject){
    if(this==otherObject) return true;
    if(otherObject==null) return false;
    if(getClass()!=otherObject.getClass()) return false;
    Employee other=(Employee) otherObject;
    return Objects.equals(name,other.name)&&salary==other.salary&&Objects.equals(hireDay,other.hireDay);
    ...
}

public class Manager extends Employee {
    ...
    public boolean equals(Object otherObject){
        if(!super.equals(otherObject)) return false;
        Manager other=(Manager) otherObject;
        return bonus==other.bonus;
    }
    ...
}

5.3 泛型数组列表Generic  Array List

  • Java允许在运行时确定数组的大小
  • ArrayList是一个采用类型参数的泛型类,需要用“<类名>”指定保存的元素类型(基本类型要先装箱/包装才能建立ArrayList)
  • get()、set()实现访问、改变数组元素,不用“[]”语法格式:staff.set(i,harry);将第i个元素值设置为harry,0<= i < staff.size()
  • add()添加元素,set()只能替换已经存在的元素的值

5.4 对象包装器与自动装箱

  • 包装器wrapper:与基本类型对应的类Integer、Long、Float、Double、Short、Byte、Character、Void、Boolean
  • 对象包装器类不可变,一旦构造了包装器,包含在包装器中的内容就不会改变,不能使用这些包装器类创建修改数值参数的方法,如果选编写一个修改数值参数的方法,需要使用在org.omg.CORBA包中定义的holder类型(IntHolder,BooleanHolder…),每个holder类型都包含一个public域,通过这个public域可以访问存储在其中的值
  • 包装器类是final类,不能被继承
  • 关于基本类型和包装类拆箱、装箱以及判断相等的理解见博客
  • 装箱和拆箱是编译器认可的,编译器在生成类的字节码时,插入必要的方法调用,虚拟机只是执行这些字节码

5.5 参数个数可变的方法 varargs methods:funcname(type… paras){ }

  • 省略号 ”” 是Java代码的一部分,表明这个方法可以接收任意数量的对象(Object[])
  • 允许将一个数组传递给可变参数方法的最后一个参数,还可以将已经存在且最后一个参数是数组的方法重新定义为可变参数的方法(main(String[] args) -> main(String… args))

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您是Java开发人员或者计算机科学相关专业的学生,Java核心技术一和二是非常值得阅读的。 首先,Java核心技术一和二是Java技术的权威教材,覆盖了Java编程语言的方方面面。无论是初学者还是有一定经验的开发人员,这两本书都可以作为学习和参考的宝贵资料。一主要介绍了Java的基础语法、关键字、类库、异常处理、多线程、集合框架等基本概念和技术。二则深入介绍了Java的高级特性,如网络编程、分布式计算、数据库访问、图形用户界面等。 其次,Java核心技术一和二的内容丰富详细,且由于是经典教材,教学经验丰富。无论是用于自学还是作为课堂教材,这两本书都能够帮助读者逐步掌握Java编程的核心知识和技巧。书中配有大量的例子和练习,使读者能够通过实践来提升编程能力。同时,作者在书中也分享了一些实际开发中的经验和技巧,有助于读者更好地理解和应用Java技术。 最后,Java核心技术一和二都是面向Java SE平台的,而且内容并不过时。虽然Java技术不断发展,但这两本书的核心知识仍然是Java编程的基石。同时,由于是权威教材,这些知识和技术在实际开发中仍然被广泛使用。因此,阅读这两本书将使您具备扎实的Java基础,为您的职业发展奠定良好的基础。 总之,Java核心技术一和二是Java开发人员或计算机科学专业学生必读的经典教材。它们内容详实,覆盖面广,适合不同水平的读者,有助于掌握Java编程的基础知识和技术,为职业发展提供很大的帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值