一,面向对象
1,new 出来的是堆里面的。
而对对象的使用只是在使用引用变量。
Person person = new Person();
person 是对对象的引用,而new Person在堆中。
2,当一个对象创建时会在内存中对其各种类型成员变量进行初始化,初始化为0或null,boolean为false。
3,对象怎么变成垃圾?当没有引用时,对象就会变为垃圾。
4,对象的比较:
== 与 equals()
==:除了比较值外,还要比较是否引用相同对象。
equals():只比较值。
5,类的封装性,private就是要求通过set(),get()方法来改变获取变量。
6,如果不定义构造函数,编译器会自动产生一个不带参数构造函数。
7,构造函数的重载就是给一个对象几种初始化方式的备选项,初始化的过程就是先在堆中创建一个变量值为默认值(0或null,boolean为false)
的对象,再根据构造函数初始化。
8,函数的参数传递:引用类型可以通过函数改变值,是因为通过引用改变了堆内存中的变量值。
9,static方法只能调用类中其他static成员,而不能直接访问其他非静态成员。
因为非静态成员需要先创建类的实例对象后才能使用,而静态方法在使用前不需要创建任何对象。
同理,静态方法不能使用super,和this。
public class Test {
static void a(){
b = 1;
}
private static int b;
}
10,单态设计模式:一个类只产生一个对象。
为了一个类只产生一个对象,就必须,private构造方法。从而就不能new该类。而是在类的内部产生该类对象。
在内部创建的对象为了与外部联系,就必须有static方法。
class A{
private A(){
}
static A myA = new A(); //只能在内部创建对象
public static A getInstance(){
return myA;
}
}
class Test{
public static void main(String[] args){
A obj1 = A.getInstance();
A obj2 = A.getInstance();
System.out.println(obj1 == obj2);
}
}
11,内部类可以访问嵌套他的类的成员,包括private。但外部类不可以直接访问其内部类的成员。
12,类不能继承类的构造函数,默认是继承一个无参无效构造函数,但可以用super调用父类构造函数。
13,抽象类不能被实例化,也就是不能被new。
抽象方法只需声明,不需实现。
含有抽象方法的类必须被声明为抽象类,抽象类的子类必须覆盖所有的抽象方法后才能被实例化。否则这个子类还是抽象类。
14,子类对象可以自动转换为父类。 父类 a = new 子类();
父类转换为子类需要强制类型转换。 if(a instanceof B) B b = (B)a; 有必要通过instanceof来检验。
15,所有类都隐含继承Object类。
16,接口中不允许定义变量。只能为public static final 的。所以可以省略修饰符。
17,可能为一个类写了多个构造器,有时可能想在一个构造器中调用另一个构造器,以避免重复代码。可以用this关键字做到这一点。