1.方法调用的实际过程:
Banana a = new Banana();
Banana b = new Banana();
a.peel(1); // => Banana().peel(a, 1);
b.peel(2); // => Banana().peel(b, 2);
2.关键字this,只能在方法内部使用,表示调用方法的那个对象的引用。
class Person {
public void eat(Apple apple) {
Apple peeled = apple.getPeeled();
System.out.println("Yummy");
}
}
class Peeler {
static Apple peel(Apple apple) {
//something to do;
return apple;
}
}
class Apple {
Apple getPeeled() {
return Peeler.peel(this);
}
}
这是this的一种用法,即有些操作要放到类外。这些操作对许多不同的类都相同,这里不同的类的意思是没有is-a的关系,机没有共同的父类。
3.构造器调用构造器:
public class Flower {
Flower(int) {
}
Flower(String) {
}
Flower(String, int) {
this(int);
//this(String);错误
}
}
I.只能调用一次;
II.构造器调用必须置于最起始处。
除了在构造器外,禁止在任何地方调用构造器:this(…);
只能new class();
4.static方法即没有this的方法。
即调用方法时:Class.Func(int); 区别于非static:Class.Func(this,int);
由于没有this即对象的引用,static方法就不能调用非static方法:
因为非static方法要this对象的引用这个隐藏的参数,而static方法不带this传不了。
当然可以通过在static方法的参数列表中传入对象的引用来调用非static方法,但是这只要写个非static方法就行了。
5.局部变量初始化:
void func() {
int i;//error java编译时错误,提示i尚未初始化。
}
6.类内部成员变量定义的顺序决定了初始化的顺序。
成员变量在任何方法(包括构造器)被调动之前初始化。即使它们散布于方法定义之间。
7.static不能用于局部变量
8.枚举类型
public enum Spiciness {
VOT, MILD, MEDIUM, HOT,FLANING;//是常量,所有大写;
}
Spiniciness howHot = Spiciness.MEDIUM;
howHot.ordianl(); // 2;
9..java文件是一个编译单元,一个编译单元只能有一个public class且必须和文件名相同,如果有额外的类,就不能是public的,对外部不可见类,即只服务于public类。
10.所有class都会编译为.class文件;
package字段必须写在.java文件除注释外第一行。
它确定了.class文件在.jar包中的位置。
路径用域名区分,如果发布代码最好申请自己的域名。
11.import可用于java的条件编译,在正式版本可以用import不同的包来取消打印和调试信息。
12.protected同时提供包访问权限。
13.编译单元完全不带public类也是可能的,类名可以和文件名相同也可以不同,但是不能是private的,只能是包访问权限或者public。
14.类不能是private和protected
15.继承不是复制基类的接口:当创建一个导出类对象,这个导出类对象包括了一个父类的子对象,这个父类的子对象和用父类直接创建的对象是一样的,区别是父类直接创建的对象来自于外部,而父类的子对象被包装在导出类对象内部。
16.如果基类构造器带参数,那子类构造器第一件事就是调用子类构造器。
17.除了内存外,不能依赖垃圾回收器做任何事,因为不一定会调用,也许永远不调用,调用了也会用它想要的顺序来回收对象。
18.继承和组合之间的选择:是否需要向上转型。
19.数组是对象 int[] a = {…};是在堆上分配内存。
20.允许定义空白final。final int i;即先声明final的变量。然后再赋值。
但是编译器会确保空白final在使用时都初始化。
这样做可以提供很大的灵活性,即每个对象对应的final变量不同,也保持了恒定不变的特性。
21.final修饰参数,主要用于向匿名内部类传参。
22.final修饰方法,把方法锁定,防止子类覆写。
23.private隐式含有final的含义,即private无法被覆盖。
在子类中声明和父类中private的方法相同的public或者protected和private方法,不是覆盖原来父类的方法,只是在子类中重新生成老的方法。
24.final类。类无法被继承。
25.Java除了final和static方法,其它方法都是后期绑定。
26.private 的方法如果被覆写,那么子类向上转型时调用子类的public的方法时不会成功的,只会调用父类的private方法。
27.如果子类的域名即成变量名和父类是一样的,那么子类要调用父类的域要用super.filed。
28.构造器隐式含有static。
29.子类构造器第一件事应该是调用父类构造器,如果没有指定用哪个基类构造器,就会调用默认构造器,如果默认构造器不存在,编译器会报错。
故如果父类重载了构造器,子类构造器第一件事应该调用父类的这个构造器,其子类构造器必须重载。
30.基类的清理动作应该在导出类之后。
31.编写构造器时:用尽可能简单的方法是对象进入正常的状态;避免调用其它的方法,在构造器内唯一能够安全调用的是基类的final方法,也适用于private方法。
原因:如果构造器调用的方法被子类覆盖,使用多态时父类构造器就会调用调用子类的子类的方法,而子类的一些成员可能还没初始化,对于变量都为0.但是对于对象的引用未初始化状态是null,会导致空指针。
32.接口可以包含域,但这些域都是隐式的public static和final的,可以直接用Test.filed来调用。接口的这些域不能申明为private和protected。
接口的方法默认是public的,不能申明为为private和protected。
但实现了接口的类必须申明为public,不然就是包访问权限。