龙空技术网

Java基础知识 - 类/超类/子类/枚举/序列化

技术猿芝麻粉 113

前言:

当前我们对“类的概念及应用实验目的怎么写”大体比较讲究,看官们都想要分析一些“类的概念及应用实验目的怎么写”的相关内容。那么小编同时在网摘上收集了一些关于“类的概念及应用实验目的怎么写””的相关资讯,希望小伙伴们能喜欢,咱们快快来学习一下吧!

1、继承

1)super.getXxx()

> 这里的super关键字,是用于告诉编译器这里是调用父类的一个方法;

2)this.getXxx()

> super关键字与this关键字意义不一样,这里this关键字表示当前对象的引用,可以把this传给一个方法作为入参,表示当前类对象;

> super关键字不是表示对象的引用,不能传递给一个方法作为入参,来表示当前类的父类对象的引用;

3)super(xxx)

> 这里的super关键字表示调用父类的构造器方法,且必须放在子类构造器的第一行

> 子类构造器中没有通过 super 关键字显式的调用父类构造器方法时,默认自动的调父类的无参构造器方法;

> 如果父类没有无参构造器方法,且子类没有调父类其他的构造器方法,则会编译报错;

4)父类类型的对象变量可以引用父类对象,也可以引用子类对象;

示例

> 数组中放置的父类对象和子类对象,但是在 for 循环时对象变量 _a 引用的是不同的对象,一个父类对象,一个子类对象,所以在执行 name() 方法时一个调用父类的方法,一个调用子类的方法;

5)如上一个引用类型变量可以指定多个不同类型,称为多态;

6)在运行时引用类型变量能够选择适当的类型的方法,称为动态绑定;

7)子类可以重写父类的方法,重写后的方法的返回类型必须和父类一致,或者是父类方法返回类型的子类;

8)子类重写的方法的可见性不能低于父类中方法的可见性,当父类中方法是 public 可见性,那么子类中重写的方法也必须是 public ,不然会编译报错;

2、多态

1)引用类型变量是多态的,一个父类类型的变量可以引用父类对象,也可以引用子类对象;

2)一个子类类型的变量不能引用父类对象;

3)子类数组的引用可以赋值给父类数组的引用;

B[] bArr = new B[10];A[] aArr = bArr;

3、final,阻止继承

1)final 可以修饰类、方法、实例字段、方法属性、局部变量等;

2)final 修饰类,表示该类不可扩展,即不能有继承的子类;

3)final 类中的所有方法都自动的成为 final 方法,但是实例字段不会自动成为 final 修饰的字段;

4)final 方法不能被子类重写,即子类不能覆盖该方法;

5)final 修饰字段,则构造对象之后就不允许改变他们的值了;

4、强制类型转换

1)数值类型变量强制转换是值转换;

2)对象变量强制转换是对象引用强制转换;

3)对象变量必须是继承关系、且由上往下转的时候才允许使用强制转换,不然会编译报错;

> 只是编译不会报错,但是运行时会报异常 ClassCastException;

> 如果不是继承关系,使用了强制转换会编译报错;

4)如果对象变量引用的是父类对象,那么强制转换为子类类型的对象变量引用会在运行时报错,ClassCastException;

5、抽象类

1)抽象类具有一般性;

2)抽象类使用 abstract 关键字修饰;

3)抽象类可以包含字段、构造器、具体实现方法、抽象方法;

4)抽象方法充当占位方法的角色,由子类来实现;

5)包含抽象方法的类,必须声明为抽象类;

6)子类可以不实现父类的抽象方法,那么子类也必须声明为抽象类;

7)子类也可以实现父类的抽象方法,子类此时可以不声明为抽象类;

8)抽象类可以不包含抽象方法;

9)抽象类可以有构造器方法,但是抽象类不能实例化对象;

10)抽象类的对象变量只能引用非抽象的子类对象;

6、受保护访问

1)private ,仅对本类可见;

2)public,对外部完全可见;

3)protected,对本包和子类可见;

4)默认,无修饰符,对本包可见;

7、java.lang.Object所有类的父类

1)java 中所有的类没有明确指明继承的父类,则默认的父类都是 Object类;

2)Object 类型的对象变量可以引用任何对象;

3)Java 中只有基本类型不是对象;

4)数组类型也是继承了 Object 类;

5)equals方法;

> Object 类的 equals 方法比较的是对象的引用,对象引用相等,那么对象肯定相等;

> 有时想比较在引用不相等时,比较对象状态是否一致,即对象所有实例字段的值是否相等;

> 数组类型相等的比较可以使用 Arrays.equals 方法比较;

> 如果两个数组长度相同,且在对应位置上的元素也相同,则认为相等;

> 子类定义 equals 方法,在实现时先调用父类的 equals 方法,super.equals(Object obj);

6)hashCode方法;

> Objects类的 hashCode() 方法返回的是从对象的存储地址得出散列码,即根据对象的存储地址计算出哈希值;

> 数组类型可以通过 Arrays.hashCode(Object[] objArr) 计算出一个散列码,这个散列码有数组元素的散列码组成;

7)toString方法

> 对象通过 + 连接符与字符串连接时,java 编译器会自动调用对象的 toString() 方法,之后再与字符串连接;

> 数组类型 toString() 方法是继承自 Object 父类,如果数组类型变量调用 toString() 方法返回的是 [L 开头的字符串,[L 表示是数组对象;

> 可以使用 Arrays.toString(Object[] objArr) 生成字符串;

> 多维数组可以使用 Arrays.deepToString() 方法;

8、序列化Serializable

1)Serializable 接口内没有任何方法与字段,是空的;

2)Serializable 接口位于 java.io 包中,是语义级别的接口,用于标识 java 类可以被序列化和反序列化;

3)实现 Serializable 接口的类可以被 ObjectOutputStream 转换为字节流,同时可以通过 ObjectInputStream 将字节流解析为对象;

> 字节可以保存在磁盘文件中(磁盘IO),也可以发到网络(网络IO);

4)Serializable 接口就是为了让 JVM 知道实现该接口的类可以被转换为字节流,即序列化;

5)什么是序列化?

> 序列化就是将对象(包含对象类型和当时的状态信息,即字段和字段值)转换为字节流存储在磁盘文件中,或者在网络中传播;> 序列化就是从内存中把对象当时的信息保存、固定下来,是完整、连续的字节流数据;> 序列化过程就是把对象 freeze 过程,freeze 住进行存储;

6)什么是反序列化?

> 反序列化就是对象序列化后的字节数据在内存中重新生成对象;> 反序列化过程就是将 freeze 住的对象字节数据进行 de-freeze,生成对象再来使用;

7)项目中类是否需要实现Serializable接口?

> 最好做实现处理,但是不实现 Serializable 接口问题也不大,因为现在项目中都是通过 json 字符串传递数据的,而字符串 String 类是实现了 Serializable 接口的;> 在现在的项目中,服务提供方会把返回的数据转化为 json 串,这个过程也可以叫做序列化;服务调用方会进行反序列化,即将 json 串转化为对象;以上的序列化和反序列化两个过程其实都是框架帮处理了,只是必要时可以加一些自定义配置告诉框架处理时可以按自定义配置的处理;> dubbo 框架应该是采用的字节流序列化与反序列化,dubbo 项目调用远程微服务就像调用本地的一样,就是这个道理;服务提供方会把对象序列化为字节流,通过网络返回给调用方;服务调用方接收到字节流就会在内存中创建对象信息;> mybatis 框架根据表字段生成的实体类也是序列化过的,在日常开发中会发现类没有序列化也可存入数据到表中,其实是因为类中的基础字段都是实现 Serializable 接口的,字段会完成序列化然后存入数据库中;> 类是否需要实现 Serializable 接口实例化呢?看两个条件:①、是否需要存储至磁盘中;②、是否需要远程传输;> 经测试在项目中不实现 Serializable 接口时,两个服务直接数据传输也没问题,因为是通过 json 串的形式传递数据的;

8)serialVersionUID

> 该字段的作用是在反序列化时把字节数据转化为对象后,比较对象所属类的该字段值是否与调用方的该类的该字段的值一致,不一致时会报异常;> 类实现 Serializable 接口后如果在类中没有显示的定义 serialVersionUID 字段,那么在序列化时会自动的跟进该类的字段计算出一个值来;

9、transient关键字,临时数据

1)该关键字表示在对象序列化时忽略被该关键字修饰的字段;

2)transient 字段是指短暂、临时的意思;

10、对象包装器与自动装箱

1)所有的基础类型都有与之对应的类,这些类被称为包装器;

> 如:int 对应 Integer 包装器类;

2)包装器一旦构造了,就不允许更改包装在其中的值;

3)包装器类是 final 修饰的类,不能被继承;

4)ArrayList<Integer> 效率远低于 int[] 数组,因为 ArrayList 中存的是包装对象,值是被包装在对象中的;

5)自动装箱;

> list.add(3) <==> list.add(Integer.valueOf(3))

6)自动拆箱;

> int a = list.get(i) <==> int a = list.get(i).intValue()

7)自动装箱、拆箱是编译器做的事情,虚拟机只是执行字节码文件;

> 即什么时候拆箱、装箱是编译器做好了的,编译器会把拆箱、装箱后的代码写到字节码文件中;

8)比较是否相等;

> 比较两个包装器类是否相等不能用 == 符号,因为比较的是两个对象的所在内存地址,是属于两个引用在比较是否相等,而不是其中的值;> 可以使用 equals 方法,比较的是其中的值;如下,当 obj 为 null 时,if 语句不会抛异常,而是其值为 false;
> 介于 -128 ~ 127 之间的包装器类的对象是一个固定的,即此时使用 == 符号判断是否相等也是可以的;

11、枚举类

1)判断枚举类的值是否相等使用 == 符号就可以了,不需要使用 equals 方法;

2)枚举类的构造器方法总是私有的,即构造器方法不指明修饰符时就是 privite,用其他修饰符会报错(public / protected);

3)所有枚举类都是 Enum 类的子类;

4)toString()方法等同于name()方法;

5)ordinal()方法

> 返回枚举类的枚举值的顺序值,从 0 开始;

6)valueOf()方法

附录:如果读者觉得文章质量还可以,帮忙关注一下,会定期发布技术文章

标签: #类的概念及应用实验目的怎么写