程序员基本功 07 面向对象的陷阱

1、instaceof运算符的陷阱

instanceof运算符的前一个操作数通常是一个引用类型的变量,后一个操作数通常是一个类,它用于判断前面的对象是否是后面的类或其子类、实现类的实例。

instanceof运算符有一个限制:要么与后面的类相同,要么是后面类的父类、要么是后面类型的子类。

使用null调用instanceof运算符时返回false时非常有用的行为,因为这可以保证第一个操作数所引用的对象不是null。

2、构造器不能使用void声明返回值

构造器是java每个类都会提供的一个特殊方法,负责对java对象执行初始化操作,不管是定义实例变量时指定的初始值,还是在非静态初始化块中所做的操作,实际都会被提取到构造器中被执行。

3、构造器只是初始化对象

在构造器执行之前,Java对象所需的内存空间,应该说是由new关键字申请出来的。然后使用构造器对这个对象进行初始化。

一些时候程序创建Java对象时无需调用构造函数,可使用反序列化的方式恢复Java对象;使用clone方法分支Java对象。如果希望Java类的实例是可复制的,对该类有俩个要求:让该Java类实现Cloneable接口,为Java类提供colne()方法,该方法负责进行复制。

4、避免无限递归的构造器

  • 尽量不要在定义实例变量时指定实例变量的值为当前类的实例;
  • 尽量不要在初始化块中创建当前类的实例;
  • 尽量不要在构造器内调用本构造器创建的Java对象

5、区分重载的方法

第一阶段JVM将会选取所有可获得并匹配调用的方法或构造器,到底调用哪个方法,此时JVM会在第一阶段所选取的方法或构造器中再次选取更精准匹配的那一个。

6、private方法不能重写

子类不能访问父类的private方法。

7、包访问权限的方法也可能无法重写

对于不使用访问控制修饰符修饰的方法,它只能被与当前类处于同一个包中的其他类访问,其他包中的子类依然无法访问该方法。若其子类与该类处于同一个包中,子类可以重写父类的方法;否则,子类将不能重写父类的方法。

8、非静态内部类的构造器必须传入外部类的实例

内部类能提供更好的封装,而且可以直接访问外部类的private成员。

9、非静态内部类不能拥有静态成员

推荐使用静态内部类

10、static关键字的作用

  static是一个修饰符,它用于修饰类里定义的:Field、方法、内部类、初始化块、内部枚举类。static的作用就是把类里定义的成员变成静态成员,也就是类成员。

被static修饰的成员属于类本身,而不是单个的Java对象,

11、静态内部类不能访问外部类的非静态成员

 

12、native方法跨平台时可能有问题

对于native方法而,Java程序不会为该方法提供实现体。native方法通常需要借助C语言来完成,即需要使用C为Java提供实现。其实现步骤:

  1. 用javah编译第一步生成的class文件,将产生一个.h文件
  2. 写一个.cpp文件实现native方法。其中需要包含第(1)步产生的.h文件
  3. 将第2步的.cpp文件编译成动态链接库文件
  4. 在Java中用System的loadLibirary方法或Runtime的loadLibrary()方法加载第3步产生的动态链接库文件,就可以在程序中调用这个native方法了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值