java学习记录(day4)

  • 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

  1. 声明包
  2. 使用本包下的类不需要导包,使用其他包下需要导包
  3. 所有的类默认引入java.lang包
  4. 类名重名的的情况下可以使用类的全名制定具体使用哪个类

  1. 包具有封装性,没有子父关系

2.自动装箱和拆箱

Int a=12;

  1. a 不是Object  a不是对象
  2. 基本数据类型记录的是数值,不是面向对象的
  3. java为了实现万物皆对象的理念,给每一个基本数据类型提供了对应的封装类型
  4. 基本数据类型的封装类型 :

  1. 基本数据类型的封装类  可以和基本数据类型直接转换

输出结果为55.

基本数据类型转换成对应的封装类型的过程:装箱

将封装类型转换成对应的基本数据类型的过程:拆箱

整数类型都有缓存

只有Integer类型的范围可以调整,一个byte的大小,-128~127

调整方式:-XX : AutoBoxCacheMax=<size>

浮点型没有,字符型有但缓存范围不一样0~127,布尔也有

在缓存范围内的比较都为true,反之为false。

由于intC和intD超过了缓存范围,所以结果为false。

基本数据类型和对应的封装类型比较,封装类型拆箱之后再比较,比大小

封装类型只要类型不一样就不能比较

这些方法将字符串类型转换成相对应的封装类型

Integer.valueOf("34");

将字符串转换成Integer类型

Integer.parseInt("12");

字符串转换成int类型

  • Static
  1. static 修饰的属性是属于类的,可以使用类名直接调用static修饰的属性和方法  成员属性是独立的内存
  2. 静态属性对所有的对象(本类)是共享的
  3. 本类的对象也可以调用静态的属性和方法,调用的方式还是静态方式
  4. 静态方法中不能直接调用非静态的属性和方法,有具体的对象才可以

Method方法中必须声明一个具体的StaticObject对象才能调用非静态的age属性。

  • 抽象类 Abstract

1.抽象类

  1. 使用abstract修饰的类是抽象类
  2. 抽象类没有直接实例  不能new
  3. 抽象类中可以定义抽象方法
  4. 抽象类用来被继承的

定义抽象类

  1. 抽象方法
  1. 使用abstract修饰的方法
  2. 抽象方法只是没有方法体

  1. 实体类继承抽象类必须实现抽象类的抽象方法

  1. 抽象类继承抽象类可以不实现抽象方法

  • Final

final 最终的形态

final的用途:

1.final可以修饰类  不能被继承

2.final可以修饰方法 不能被重写

3.final可以修饰量   不能被重新赋值 =

Final 定义变量时可以不赋值,但是后面使用时一定要赋值。

Final 定义数组时,数组的个数不能发生改变,但是数组内的值可以改变

  • 接口类

1.只能去定义方法,但是没有方法体

2.接口中的方法是抽象方法   没有具体实现的方法

3.接口中定义属性,都是常量,必须全是大写,必须初始化,默认使用public static final 修饰

  1. 接口中定义的方法默认使用public abstract修饰

  1. 在接口中,用default定义方法,不是抽象的方法,在接口中可以定义default修饰的实体方法虽然使用default修饰但是访问权限还是public

6.java中使用implements声明一个类实现一个接口,在类中可以重写接口中的方法。

7.一个类可以实现多个接口

8.接口使用extends继承接口

9.如果一个接口中只有一个未实现的方法,这个接口称为函数式接口。可以用@FunctionalInterface来验证

10.接口里面没有构造方法

七、克隆

被克隆的对象的类必须实现Cloneable借口

定义一个Student类实现Cloneable接口,创建Student对象和Object对象,将Student对象克隆给Object对象。

两者输出结果相同,说明指向的是同一个数值。

  1. 浅拷贝

首先,创建一个Student类来实现Cloneable接口,在Student类中声明一个Teacher类的对象,重写Object类的toString方法,打印出name。然后创建一个Teacher类,在里面声明一个name属性,重写Object类的toString方法,打印出name。主函数中运行以下函数:

将stu中的数据克隆给obj。输出结果为:

Stu修改obj对象也会跟着改变。

下面是浅拷贝的原理图:

两个对象指向同一个对象。

  1. 深拷贝

首先,创建一个Student类来实现Cloneable接口,在Student类中声明一个Teacher类的对象,重写Object类的toString方法,打印出name,定义一个方法,先克隆自己,然后将当前对象的teacher属性克隆一遍,将克隆出来的teacher对象赋值给克隆出来的Student对象中。然后创建一个Teacher类实现Cloneable接口,在里面声明一个name属性,重写Object类的toString方法,打印出name。Student类中添加的方法如下:

在主函数中运行以下函数:

输出结果为:

会发现修改stu的teacher类的name属性,Obj对象所指向的name属性并不会跟着改变。

下面是深拷贝的原理图:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值