本文主要是讲述Java高质量代码之面向对象,更多Java技术知识,请登陆疯狂软件教育官网。加疯狂软件官方微信号:fkitorg,免费赢大奖,有机会赢得iOS培训课程一套。
1.在接口中不要存在实现代码
接口中存在实现?接口中应该只能声明抽象方法,常量,继承其他接口,但抽象方法当中不能存在实现吧?请观看一下的一段代码
Java代码
public interface TestInterface {
public static final Test test = new Test() {
public void doSomething() {
System.out.println("这就是实现");
}
};
void test();
}
从以上代码中可以看到,在接口当中使用了匿名内部类的方式对接口当中的常量进行了实现,这种编码方式可以说是很好很强大,但由此带来的是什么?接口从此不再稳定,接口和类有了依赖,当Test类方法doSomething改变时,直接影响了接口,而接口应该是一种规范,是稳定不变的
2.静态变量一定要先声明后使用
标题是什么意思?难道可以使用一个没有声明的静态变量吗?请看以下代码
Java代码
public class Test {
static {
i = 100;
}
public static int i = 1;
public static void main(String[] args) {
System.out.println("此时 i 的输出为 1" + i);
}
}
从以上代码看到,i先被使用,然后再进行了初始化,那为什么会出现这样的情况?首先要明确,静态变量在类初始化首先被加载的,注意,此时只加载了 i 这个变量,但还没有对 i 进行赋值,然后JVM会根据类中的静态块来顺序执行,以上代码由于静态块static{}放置顺序在前面,所以首先被执行,然后再执行int i = 1的操作
3.不要复写静态方法和静态方法使用类名调用:
在Java中,可以通过子类对父类的方法进行复写从而增强或减弱父类的行为,但复写是针对非静态方法的,我们都知道静态方法是针对类本身的,通过类名进行调用,当然也可以使用对象来调用,但这样Eclipse本身就会给你报个小警告,使用对象调用是不规范的,所以子类和父类应该尽量避免静态方法重名和静态方法使用类名调用
4.构造函数尽量简化
我们都知道,在New出一个新对象时,对象会执行一个方法,此方法名为构造函数,而构造函数当中,应该尽量不出现业务代码,因为构造函数的职责就是为类的创建进行初始化的,例如对对象的属性值进行初始化,而业务代码应该封装在类的方法当中,让构造函数尽量简单
5.用构造代码块精炼代码
现在我们有这样一个需求,在Test类初始化时需要记录日志,但Test类当中有多个构造函数,当然我们可以在每个构造函数当中编写日志,但使用构造代码块将更加的简洁完成以上需求,请看以下代码
Java代码
public class Test {
// 直接编写1对{}代表构造代码块
{
System.out.println("我是记录日志的构造代码快");
}
public Test() {
System.out.println("执行无参构造");
}
public Test(String id) {
System.out.println("执行有参构造");
}
}
以上代码中,构造代码块会增加到每个构造函数中的第一行的位置,这样就代表执行构造代码块再执行构造函数本身的内容
6.使用匿名类的构造函数
在我们开发当中,若想快速实现一个接口,例如是Comparator(比较器),我们会使用匿名类的形式来进行实现,但有没有想过,匿名类的构造函数在何方?我们都知道构造函数是没有重写的,那我们在对自定义的接口使用匿名方式实现时,如何使用构造函数?请看以下代码
Java代码
public class Test {
private Comparator comparator = new Comparator() {
{
System.out.println("其实我可以代替匿名类的构造函数");
}
@Override
public int compare(Test o1, Test o2) {
return 0;
}
};
}
使用构造代码块就可以实现对匿名类的构造函数.
7.让多重继承成为现实
我们都知道Java当中是单继承的,但我们可以使用婉转的方式来实现多继承,这就需要使用到内部类
Java代码
public abstract class Runable {
private int speed = 10;
void run() {
System.out.println("running..." + speed);
}
}
public abstract class Flyable {
private int speed = 10;
void fly() {
System.out.println("flying..." + 10);
}
}
//动物能飞,能跑
public class Animal {
public void fly() {
new Flyable() {
}.fly();
}
public void run() {
new Runable() {
}.run();
}
}
当然我们可以在Animal中再创建一个内部类继承runable或flyable然后在run或fly中创建内部类来实现,这里只给出最方便快捷的实现