- Object类
Object类是java层次最顶层的基类(父类),java中所有的引用类都默认继承Object
java 是面向对象的,在Java中所有的引用类,默认继承了Object
所有引用类型的默认值是null,Integer的默认值是null
在引用类型中==比较的是地址是否是一个,比较的是否是同一个
因为obj和objA指向的是同一个地址,所以输出的比较结果是true
将objA设为一个新的对象(开辟了一个新的内存空间),所以输出的比较结果为false
Objectl类中定义的方法部分如下:
通过改写Object类中的finalize方法,然后在主函数中运行 System.gc()。
意义:运行任何待完成对象的终结方法。调用此方法表明 Java 虚拟机会花费精力来运行已发现被丢弃但尚未运行其 finalize 方法的对象的 finalize 方法。当控件从方法调用返回时,Java 虚拟机已尽最大努力完成所有未完成的终结
- package和自动装箱和拆箱
1.Package
- 声明包
- 使用本包下的类不需要导包,使用其他包下需要导包
- 所有的类默认引入java.lang包
- 类名重名的的情况下可以使用类的全名制定具体使用哪个类
- 包具有封装性,没有子父关系
2.自动装箱和拆箱
Int a=12;
- a 不是Object a不是对象
- 基本数据类型记录的是数值,不是面向对象的
- java为了实现万物皆对象的理念,给每一个基本数据类型提供了对应的封装类型
- 基本数据类型的封装类型 :
- 基本数据类型的封装类 可以和基本数据类型直接转换
输出结果为55.
基本数据类型转换成对应的封装类型的过程:装箱
将封装类型转换成对应的基本数据类型的过程:拆箱
整数类型都有缓存
只有Integer类型的范围可以调整,一个byte的大小,-128~127
调整方式:-XX : AutoBoxCacheMax=<size>
浮点型没有,字符型有但缓存范围不一样0~127,布尔也有
在缓存范围内的比较都为true,反之为false。
由于intC和intD超过了缓存范围,所以结果为false。
基本数据类型和对应的封装类型比较,封装类型拆箱之后再比较,比大小
封装类型只要类型不一样就不能比较
这些方法将字符串类型转换成相对应的封装类型
Integer.valueOf("34");
将字符串转换成Integer类型
Integer.parseInt("12");
字符串转换成int类型
- Static
- static 修饰的属性是属于类的,可以使用类名直接调用static修饰的属性和方法 成员属性是独立的内存
- 静态属性对所有的对象(本类)是共享的
- 本类的对象也可以调用静态的属性和方法,调用的方式还是静态方式
- 静态方法中不能直接调用非静态的属性和方法,有具体的对象才可以
Method方法中必须声明一个具体的StaticObject对象才能调用非静态的age属性。
- 抽象类 Abstract
1.抽象类
- 使用abstract修饰的类是抽象类
- 抽象类没有直接实例 不能new
- 抽象类中可以定义抽象方法
- 抽象类用来被继承的
定义抽象类
- 抽象方法
- 使用abstract修饰的方法
- 抽象方法只是没有方法体
- 实体类继承抽象类必须实现抽象类的抽象方法
- 抽象类继承抽象类可以不实现抽象方法
- Final
final 最终的形态
final的用途:
1.final可以修饰类 不能被继承
2.final可以修饰方法 不能被重写
3.final可以修饰量 不能被重新赋值 =
Final 定义变量时可以不赋值,但是后面使用时一定要赋值。
Final 定义数组时,数组的个数不能发生改变,但是数组内的值可以改变
- 接口类
1.只能去定义方法,但是没有方法体
2.接口中的方法是抽象方法 没有具体实现的方法
3.接口中定义属性,都是常量,必须全是大写,必须初始化,默认使用public static final 修饰
- 接口中定义的方法默认使用public abstract修饰
- 在接口中,用default定义方法,不是抽象的方法,在接口中可以定义default修饰的实体方法,虽然使用default修饰但是访问权限还是public
6.java中使用implements声明一个类实现一个接口,在类中可以重写接口中的方法。
7.一个类可以实现多个接口
8.接口使用extends继承接口
9.如果一个接口中只有一个未实现的方法,这个接口称为函数式接口。可以用@FunctionalInterface来验证
10.接口里面没有构造方法
七、克隆
被克隆的对象的类必须实现Cloneable借口
定义一个Student类实现Cloneable接口,创建Student对象和Object对象,将Student对象克隆给Object对象。
两者输出结果相同,说明指向的是同一个数值。
- 浅拷贝
首先,创建一个Student类来实现Cloneable接口,在Student类中声明一个Teacher类的对象,重写Object类的toString方法,打印出name。然后创建一个Teacher类,在里面声明一个name属性,重写Object类的toString方法,打印出name。主函数中运行以下函数:
将stu中的数据克隆给obj。输出结果为:
Stu修改obj对象也会跟着改变。
下面是浅拷贝的原理图:
两个对象指向同一个对象。
- 深拷贝
首先,创建一个Student类来实现Cloneable接口,在Student类中声明一个Teacher类的对象,重写Object类的toString方法,打印出name,定义一个方法,先克隆自己,然后将当前对象的teacher属性克隆一遍,将克隆出来的teacher对象赋值给克隆出来的Student对象中。然后创建一个Teacher类实现Cloneable接口,在里面声明一个name属性,重写Object类的toString方法,打印出name。Student类中添加的方法如下:
在主函数中运行以下函数:
输出结果为:
会发现修改stu的teacher类的name属性,Obj对象所指向的name属性并不会跟着改变。
下面是深拷贝的原理图: