java基础提高笔记——继承

一、前言

本文是我在工作中积累一定经验后,再读《Java核心技术》一书所记录的笔记,纯粹自己记录使用,大家可以不予关注。

二、继承

5.1.1
通过父类定义子类时,仅需指出子类与父类不同之处
5.1.2
override的方法中可以使用super.method()调用被override的父类方法
5.1.3
子类构造器必须调用父类的构造器super(…)
5.1.5
尽管e声明为Employee类型(父类),但实际上e既可以引用Employee也可以引用Manager类型(子类)。e.getSalary可以根据引用对象调用对应的方法
一个对象变量可以指示多种实际类型的现象被称为多态。在运行的时候可以自动选择调用哪个方法的现象称为动态绑定。

Manager boss = new Manager(...);
Employee[] staff = new Employee[3];
staff[0] = boss;//子类引用可直接转换为父类的引用,不需要类型转换

虽然boss和staff[0]引用的同一对象,但是它们类型不同
boss.setBonus()——OK
staff[0].setBonus()——Error(staff[0]是Employee类型)
5.1.6
JVM为类创建method table,根据方法签名快速查找动态绑定的方法
5.1.7
final定义的类,无法被继承,其中的方法自动为fianl,但实例域不是
final定义的方法,无法被覆写
fianl定义的域,构造对象后无法被修改
5.1.8
类型转换
Manager boss = (Manager)staff[0]
子类可以直接赋值给父类,但是反过来需要类型转换,进行类型转换前,使用instance of判断

if(staff[1] instance of Manager){
    boss = (Manager)staff[1]
    ...
    }

5.1.9
抽象类 更为通用的基类,abstract修饰的方法无需实现,包含抽象方法的类必须为抽象类
抽象类内也可以包含具体数据和方法
抽象类不能被实例化,但是可以创建一个具象子类的对象
Person p = new Student(…)
P是Person类型的变量,但引用的是非抽象子类Student的实例
protected,子类和同包可以访问
5.2
Object类
java中只有基本类型不是对象
5.2.1
equals 检测对象是否等于另一个对象
子类中的equals方法先调用超类的equals,再比较子类的实例域
1.自反性 2.对称性 3.传递性 4. 一致性 5.x.equals(null) false
equals建议编写:
1.显式参数赋给otherObject
2.if(this == otherObject) return true;
3.if(otherObject == null) return false;
4.if(getClass() !=otherObject.getClass) return false; equals 在子类改变
if(!(otherObject instance of ClassName)) return false;相同语义
5.ClassName other = (ClassName)otherObject
6.使用==比较基本类型域,使用equals比较对象域
return field1=other.field1 && Objects.equals(field2,other.field2) &&…
5.2.3
hashCode()返回个整形数值 必须和equals定义一致
5.2.4
toString() 返回对象值的字符串
类名+[field1=…,….] “”+x
数组是Array.toString(…)
5.3
泛型数组列表——可改变大小,泛型类 ArrayList

ArrayList<Employee> staff = new ArrayList<Employee>();

add 数组内部用满后,自动扩大
trimToSize 回收多余空间
toArray的 拷贝到数组中
for(Employee e:staff)

5.4
对象包装器
Integer——int 是final类,不可改变

ArrayList<Integer> list = new ArrayList<Integer>();
lsit.add(3)//等价于list.add(Integer.valueOf(3))自动装箱,转换类型

5.5
参数数量可变

public static double max(double... values){
    double largest = Double.NEGATIVE_INFINTY;
    for(double v:values)
        if(v>largest)
            largest = v;
    return largest;
}

5.6
枚举型
public enum Size{SMALL,MEDIUM,LARGE,EXTRA,LARGE}
使用==比较
5.7
反射——工具/框架核心技术
5.7.1

getClass().getName() 获得类名
String className = "java.util.Random";
class cl = Class.forName(className);//获得类名对应的Class对象
String s = "java.util.Random"
Object t = Class.forName(s).newInstance();//通过字符串创建对象,必须有无参构造方法

5.7.3
Class类中getFields、getMethods、getConstructors
可以提供public域,方法,构造器数组,包括超类公有成员
getDeclareFields,getDeclareMethods,getDeclareConstrutors
获取全部….包括private,protected,但不包括超类的
new ObjectAnalyzer().toString(ArrayList-泛型对象)
5.7.5
使用反射编写泛型数组代码
5.7.6
invoke方法,使用反射调用任意方法
5.8
继承的技巧
1.公共操作和域放在父类
2.不要使用protected,因为其他人的子类可以访问,同包可以访问
不过protected方法对于指示不提供一般用途而应在子类重新定义的方法很有用
3.使用继承实现is-a关系
4.除非所有的继承方法都有意义,不然不要使用继承
5.覆盖方法时,不要改变预期的行为
6.使用多态,而非类型信息
7.不要过多使用反射

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值