Java——细节知识

1、is-a(继承)与has-a(组合)关系。策略模式中,采用接口与组合的方式比采用继承的方式更具扩展性
2、方法在运行时才动态绑定;但成员变量是在编译时绑定的,代码如下

package java_IO;
public class Test_MultiState {

	public static void main(String[] args) {
		Base b=new Derived();
		b.f();
		b.g();
		System.out.println(b.i);
		// TODO Auto-generated method stub

	}

}
class Base{
	int i=0;
	public Base() {
		System.out.println("Base's constructor");
	}
	public void f() {
		System.out.println("Base.f");
	}
	public void g() {
		System.out.println("Base.g");
	}
}
class Derived extends Base{
	int i=1;
	public void f() {
		System.out.println("Derived.f"); 
	}
	public void g() {
		System.out.println("Derived.g");
	}
}

结果:

Base's constructor
Derived.f
Derived.g
0

Java中提供了两种用于多态的机制:编译时多态是通过方法人重载实现的,运行时多态是通过方法的覆盖(子类覆盖父类方法)实现的。

3、Java标识符不能用数字开头,且只能包含字母、下划线、$、数字,其他符号不能包括。
4、接口中所有的成员变量默认为public static final,且必须赋初始值(final就是必须赋初始值,其代表引用的不变性,所以再初始化后,不能再new或赋值)
其所有方法都是public、abstract,其他都不能修饰。
接口强调“has-a”,抽象类强调“is-a”。接口是一种特殊的抽象类。抽象类里可以有
5、obj.getClass().getName();obj.getClass().getSuperclass().getName()
6、assert注意在C语言中是在编译时启动,而在Java中是运行时启动。
7、static与非static
1)成员函数内部不能定义static的变量
2)static方法里不能调用非static方法和变量,只能访问所属类的静态成员变量和方法,因为可以想到,static在类加载时就初始化完成了,若其他非静态变量和方法还未初始化就被访问,会发生错误。
3)静态函数里也不能使用this和super,理由同上。
单例模式
8、switch只能用int和String(即整型和字符串形式)
9、volatile会影响编译器的优化效率,需要注意。
10、strictfp修饰类、接口、方法,保证浮点数运算的精确性。
11、所有基本类型的包装类都是不可变类,还有String
12、在值传递和引用传递时,要注意类型是否为不可变类型。

package java_IO;

public class Test_ImutableClass {

	public static void main(String[] args) {
		Integer a=1;
		Integer b=a;
		b++;
		System.out.println(a);
		System.out.println(b);
		
		// TODO Auto-generated method stub

	}

}

结果
1
2

上述部分注意!!!仍然是引用传递,不是值传递,只是因为Integer是不可变类型,当其自加时,相当于重新创建了个 对象,b指向新的对象,和a就没有关系了,包括String也是类似。
12、基本数据类型在参与计算时会自动转换为int型,但是“+=”运算时,就不会产生类型转换。

short s1=1;
s1=s1+1;会报错,因为+会将short转为int型,所以s1+1为int型,赋给short会出错;可以改为s1=(short)(s1+1)
s1+=1;这个就不会报错了,因为“+=”是Java规定的运算符 

13、<<左移,末尾补0;>>>无符号右移高位补0,>>有符号右移,正数补0,负数补1;
负数二进制用补码产生:符号位除外,其他位取反,然后加1;
左移n位,表示将现有数乘以2的n次方,比乘法速度要快。
14、String直接赋值时,是保存在JVM的常量字符串池中;用new创建时是保存在堆里。注意代码

public class Test_StringEquals {

	public static void main(String[] args) {
		String a1="abc"
				+ "";
		String a2="abc";
		String b1=new String("abc");
		String b2=new String("abc");
		System.out.println("a1==a2:"+(a1==a2));
		System.out.println("a1==b1:"+(a1==b1));
		System.out.println("b1==b2:"+(b1==b2));
		//System.out.println("a1与a2是否相等:"+a1==a2);
		System.out.println("a1.equals(a2)="+a1.equals(a2));
		System.out.println("a1.equals(b1)="+a1.equals(b1));
		System.out.println("b1.equals(b2)="+b1.equals(b2));
		// TODO Auto-generated method stub

	}

}

结果
a1==a2:true
a1==b1:false
b1==b2:false
a1.equals(a2)=true
a1.equals(b1)=true
b1.equals(b2)=true

15、StringBuffer保存在字符串缓冲区,可以进行更改。StringBuilder是线程不安全的
线程安全:就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问。执行效率:StringBuilder>StringBuffer>String,当数据量少时可以用String,当数据量大且多线程时可用StringBuffer,当为单线程时可用StringBuilder。
16、数组是对象,可用a instanceof int[] 来判断
17.序列化是一种将对象以一连串的字节描述的过程,用于解决在对对象流进行,static和transient变量是不能序列化的。java提供了多个对象序列化的接口,包括ObjectOuput,ObjectInput,ObjectOutputStream和ObjextInputStream。

猜你喜欢

转载自blog.csdn.net/qq_33605294/article/details/88370510