Java知识点小结

1. 不可以在函数内部定义enum 枚举类型,like

public void foo() {
    	enum LocalEnum {
    		A,B,C
};
原因主要是因为enum是静态嵌套类。 具体见: why cant enums be declared locally in a method


2. String 中的length方法将返回给定字符串所需要的代码单元数量。

    调用s.charAt(n)将返回位置n的代码单元。


3. StringBuilder与StringBuffer

    StringBuider的前身是StringBuffer。  StringBuffer的效率稍有些低,但允许采用多线程的方式执行添加或删除字符的操作。

    如果所有字符串在一个单线程中编辑(通常都是这样),则应该用StringBuilder替代它。这两个类的API是相同的。


4. 不要编写返回引用可变对象的访问器方法。否则会破坏封装性。如果需要返回一个可变对象的引用,应该首先对它进行克隆(clone).


5. Java总是采用按值调用。有人可能认为Java对对象采用的是引用调用,实际上这种理解是不对的。

   首先,举个例子。

public static void swap(Employee x, Employee y)
{
    Employee temp = x;
    x = y;
    y = temp;
}
 如果Java对对象采用的是引用调用,那么这个方法就应该能够实现交换数据的效果:

Employee a = new Employee("Alice",...);
Employee b = new Employee("Bob",...);
swap(a,b);
但是,方法并没有改变存储在变量a和变量b中的对象引用。 swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝。

总结下,Java 应用程序按值传递参数(引用类型或基本类型),其实都是传递他们的一份拷贝.而不是数据本身.(不是像 C++ 中那样对原始值进行操作。)

6. Java在创建一个子类时,初始化顺序为:

     父类静态代码块->子类静态代码块->父类非静态代码块->父类构造函数>子类非静态代码块->子类构造函数

public class mainjava {//父类
   int a = test();
   {//非静态代码块
	   System.out.println("父类的非静态代码块2");
   }
	public int test()
	{
		System.out.println("父类的非静态代码块1");
		return 1;
	}
	static {
		System.out.println("父类的静态代码块");
	}
	public mainjava(){
	System.out.println("父类的构造函数");
	}
}

class Son extends mainjava {
	{
	System.out.println("子类的非静态代码块");
	}
	static {
		System.out.println("子类的静态代码块");
	}
	public Son(){
		System.out.println("子类的构造方法");
	}

	public static void main(String[] args){
		Son a = new Son()  ;
	}
}

7. 关于 equals() 与 hashcode():

    如果要重写equals()方法,必须要重写hashcode()方法;

    尽量保证使用对象的同一个属性来生成hashcode()和equals()两个方法;

    任何时候只要a.equals(b), 那么a.hashcode()必须和b.hashcode()相等。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值