java基础

    • instance of
    • finalize()
    • Throwable
    • finally
    • overload和override
    • abstract和native
    • this和super
    • protect和default
    • final
    • ==和equals
    • transient
    • 序列化
    • 克隆
    • 创建对象
    • 自动拆箱装箱
    • StringBuilder、StringBuffer、String
    • 内部类
    • 抽象类vs接口

instance of

instance of

finalize()

在垃圾收集器将对象删除之前,做清理工作
在object类中定义,子类覆盖:整理系统资源或执行其他清理工作
删除对象前(确定该对象未被引用),调用对象的方法

Throwable

java基础_第1张图片
throw用于方法中,抛出异常(检查exception)
throws用于方法后

接口方法抛运行时异常,少返回null。
少Throwable,多exception。exception要明确。

finally

finally在try catch中的return执行之前,会覆盖try catch中的return
try catch中有system.exit(0),则finally不执行
finally中少return/抛异常

overload和override

overload:方法重载,不能通过访问权限、返回类型、异常重载,按照参数类型、个数、顺序,多个同名方法
override:方法覆盖,子类覆盖父类方法(多态性)。比父类方法更少的异常,更大的访问权限,返回值小于等于父类。若父类为private,则新加方法
构造方法不能重写,只能重载

abstract和native

abstract:方法实现移交给子类,不能同为static(类加载时无方法实现)/final(不可继承)/synchronized(需要同步操作)

native:方法实现移交给本地操作系统

this和super

不能同时出现在构造方法里,不在static中使用
this:当前类的引用对象
super:引用对象的父类对象,父类储存空间标识

protect和default

protect:同包,非同包子类
default:同包

final

只读,值不可变
引用类型:引用不变,对象的值可变

  • 修饰属性:常量,初始化可以在编译期作编译期常量使用(JVM优化)
  • 修饰方法:不能在子类被重写
  • 修饰类:不能被继承,final和abstract不能同时存在

==和equals

当两边都是包装类型时,==比较引用地址,equals 比较值,不进行类型转换

Integer num1 =  256;
Integer num2 =  256;

System.out.println(num2 == num1);
false

System.out.println(num2.equals(num1));
true

一边为表达式时,==比较两边数值(自动拆箱)
String、Date重写equals,比较值
元素类型相同时,equals先比较hashcode,再比较。(equals和hashcode一起重写)
equals为true,则hashcode相等,但hashcode相等equals不一定为true(hash冲突)

每个对象都有默认的散列值,两个对象==相等,则hashcode一定相等

transient

修饰属性阻止其序列化
若修饰引用类型,必须实现serializable
反序列化时变量的值设为初始值

序列化

对象
序列化

  • 不保存静态变量
  • 不能序列化父类(无serializable),父类必须有默认的构造方法
  • 可加密

反序列化

  • 类路径,功能代码一致
  • 序列号一致,用于验证版本

实现

  • serializable接口:所有序列化自动进行
  • externalizable:在writeExternal中手动制定要序列化的变量,不受transient影响

作用

  • 把对象变为字节序列,存于硬盘
  • 网络上传送字节序列

克隆

浅克隆:new一个新对象,基本类型的数据复制一份,其他类型的复制一份引用
深克隆:全部复制一份
基本数据类型为深克隆,引用类型为浅克隆,string是引用类型,但可以认为是深克隆,stringBuffer和stringBuilder为浅克隆,主动拷贝为深克隆
实现

  • 写一个克隆方法:new一个对象,get原值,set值,实现深克隆
  • cloneable接口,重写obj的clone():深克隆使用instance of进行接口判断
  • serializable接口,序列化/反序列化,深克隆

创建对象

  • new
  • 反射 class.newInstance
  • 克隆
  • 反序列化

自动拆箱装箱

自动拆箱装箱是一种编译特性

//装箱
Integer num1 = Integer.valueOf("1");

//拆箱
int num2 = num1.intValue();

Integer:-128~127 有一个数据缓冲池,范围内的数字,返回池中对象的引用,范围外的新建对象。
Short、Byte、Character、Long类似于Integer,Float和Double每次都返回新对象

StringBuilder、StringBuffer、String

StringBuilder StringBuffer String
效率高
非安全 线程安全(synchronized实现) final

String是final的,所以其成员方法都是final的,不允许继承。具有唯一性、不变性,可做map的key

不同的字符串变量都指向字符串池的同一个字符串
创建时hashcode就被缓存

String str = "AB";//class文件的部分内容编译生成字面常量"AB"和符号引用
				  //运行期间,字面常量存于运行时常量池
String str = new String("AB");//类加载时在运行时常量池创建对象"AB"
							  //运行期间在堆上创建对象"AB"

String str = "A" + "B"; 
String str = "AB";//二者相等

String str1 = "A";
String str2 = "B";
String str = str1 + str2;//新建字符串

内部类

抽象类vs接口

抽象类 接口
可以有默认的方法实现 default方法
子类为抽象类,不实现抽象方法 必须实现
不能实例化 不能实例化
有构造器,普通方法,成员变量,是类 有静态方法常量,静态方法,default方法,是接口
public/protected/default public static final
有main方法可以运行
可以添加新方法,不需要改变代码 改变实现类,添加新接口
继承一个类 实现多个接口
抽象类可以实现多个接口,不实现接口方法
慢,找实现类的方法

你可能感兴趣的:(笔记,java)