【2019秋冬】《Java核心技术》 第5章 继承

已存在的类为:超类,父类,基类
新类为:子类,派生类,孩子类

public class Manager extends Employee{
	XXXXXXX;
}

覆盖
子类无法直接访问超类的域,需要借助共有的接口,调用超类时用super super.father(),得到超类的值,再在自己方法中操作
用super创造子类构造器

public manager(string a,string b){
	super(a,b);
}

使用super调用超类构造器必须是子类构造器的第一条语句
一个对象变量可以指示多种实际类型的现象:多态
动态绑定:程序运行时能自动选择调用哪个方法
多态性
可以将一个子类的对象赋值给超类变量

Employee e;
e = new Employee();
e = new Manager(); // e 是 超类变量 new Manager是 子类对象

不能将超类引用赋值给子类变量

Manager m = staff[i]; //wrong

m 是 子类,staff是超类,如果这样赋值,m想调用子类新定义的方法时会出错,因为m现在被赋值的是超类,没有新定义的方法

方法调用过程
1)如果要调用的函数是用static final private修饰的,可以直接知道要调用哪一个,这种方式叫静态绑定
2)编译器查看要处理的方法的名称和声明类型(public private),把所有可能被调用的方法都获取到(虚拟机预先创建了一个方法表,节省查找时间)
3)编译器根据要调用的方法的参数类型,在所有候选方法中找到最合适的

使用final阻止继承

public final class Executive extends Manager{
	XXXXX;
}

当一个类被声明为final的时候,该类不能被继承,并且它的所有方法都自动生成final,但不包括类中的域

类间类型转换
只能在继承层次内进行类型转换
超类转换成子类前,用instanceof检查

抽象
用abstract修饰,由子类自行完成
包含抽象方法的类必须被声明为抽象
抽象类可以包含具体的数据和方法,但是不建议

抽象类有两种继承方法
1)抽象类本身定义一部分抽象方法或者不定义抽象方法,其子类必须为抽象类
2)抽象类本身全部定义的抽象方法,子类不用声明为抽象
类即使不含抽象方法,也可以被声明为抽象类
抽象类不能被实例化,可以定义一个抽象类的非抽象子类对象变量,调用时调用的是他的子类的函数

除了基本类型(数值,字符,布尔类型)不是不是对象,剩下的全部都是Object类
Object类方法:
equals方法
检测一个对象是否等于另外一个对象,判断两个对象是否具有相同的引用
= =与equals区别
1.==比较基本类型时比较其值,equals不能比较基本类型
2.= =在比较引用类型时比较地址,equals默认比较地址,可以重写来比较值
hashCode方法
散列码是由对象导出的一个整型值,散列码无规律
默认散列码为对象的存储地址

hashCode值相同但equals不一定返回true

为什么重写equals一定要重写hashCode?
如果两个对象值相同,他们的hashCode也必须相同。hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等

泛型数组列表:ArrayList

ArrayList<Employee> arr = new ArrayList<>();
arr.add(new Employee(XX,XX));
arr.set(i,harry); //赋值
arr.get(i); //取值
arr.remove(i); //删除
arr.size(); //计算大小

自动装箱与自动拆箱
Integer (int) Float(float) 称为包装器
int float 基本类型
对象包装器是不可变的,被修饰为final
<>类型中不允许放置基本类型,只能放包装器
自动装箱是将基本类型转化为对应的包装器
自动拆箱是将包装器转化为的对应的基本类型

枚举类型

public enum Size{SMALL,MEDIUM,LANGER};

实际上是构建了一个类,创建了三个实例
比较两个枚举类型的值的时候使用= = ,不需要使用equals

反射
能够分析类能力的程序称为反射
反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。
推荐视频 B站Java反射讲解
在这里插入图片描述
创建对象,生成.java文件,通过编译生成class文件(字节码文件,还在硬盘中,没有进内存)
类加载器(ClassLoader)将class文件加载成Class类对象的过程称为反射
在程序运行时,创建对象通过调用class类生成对象

获取class对象的三种方法
1)源代码阶段
通过Class.Forname(“类名”),将字节码文件存入内存,返回class对象
2)类对象阶段
类名.class 返回class对象的信息
3)运行阶段
对象.getclass() 定义在Object类中

同一个class文件(字节码文件)在运行过程中只会被加载一次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值