读书笔记6-《crazy java》

instanceof运算符
1. 运算符的前一个操作是一个引用类型的变量,后一个操作是一个类或接口 ,用于判断前面对象是否是后面的类或其子类、实现类的实例;
2. instance前面的操作数的编译时类型必须是:要么与后面的类相同,要么是后面类的父类,要么是后面类型的子类;
3. instance运算符可以保证某个引用变量是特定类型的实例外,还可以保证该变量没有引用一个null,这样就可以将该引用变量转型为该变量,并调用该类型的方法,而不用担心引发ClassCastExecption或NullPointerExecption。

java的强制类型转换
在编译阶段,强制转型要求转型变量的编译时类型必须为:
1. 被转型变量的编译时类型与目标类型相同
2. 被转型变量的编译时类型是目标类型父类
3. 被转型变量的编译时类型是目标类型的子类,这种情况下可以自动向上转型
强制转型的编译阶段只关心引用变量的编译时类型
在运行阶段,被转型变量所引用对象的实际类型必须是目标类型的实例,或者是目标类型的子类、实现类的实例,否则报错ClassCastException

构造器
1. 构造器不能声明返回值类型,也不能使用void声明构造器没有返回值;
2. 当为构造器声明添加任何返回值类型或添加void声明该构造器没有返回值时,编译器并不会提示这个构造器有错误,只会当做普通方法进行处理;
3. 构造器不负责创建java对象,只负责执行java的初始化,new关键字为java对象申请空间

创建java对象无需使用构造器:
1. 使用反序列化的方式恢复java对象
2. 使用clone方法复制java对象

单例类提供的readResolve()方法即使通过反序列化机制来恢复java实例,该方法保证反序列化时得到已有的java实例

java类的实例是可复制的两个要求:
1. 该java类实现Cloneable接口;
2. 该java类提供clone()方法负责复制。

避免递归调用构造器:
1. 尽量不要在定义实例变量时指定实例变量的值为当前类的实例;
2. 尽量不要在初始化块中创建当前类的实例;
3. 尽量不要在构造器内调用本构造器创建java对象。

选择构造函数的精确匹配原则:当实际调用时传入的实参同时满足多个方法时,如果某个方法的形参要求参数范围越小,那这个方法就越准确。

非静态内部类的规则:
非静态内部类必须寄生在外部类的实例中,没有外部类对象,就不能产生非静态内部类的对象。因此,非静态内部类不可能有无参数的构造器,即使系统为非静态内部类提供了一个默认的构造器,这个默认构造器也需要一个外部类形参。

系统在编译阶段总会为非静态内部类的构造器增加一个参数,非静态内部类的构造器的第一个形参总是外部类,因此调用非静态内部类的构造器时必须传入一个外部类对象作为参数,否则程序会引发运行是异常。

非静态内部类不允许拥有静态成员

static关键字:
1. static修饰的成员属于类本身,而不属于java对象
2. 当程序使用静态内部类时,外部类相当于静态内部类的一个包;
3. 静态内部类不能访问外部类的非静态成员。

native方法依赖于具体实现的平台。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值