当你使用可变参数列表时,在两个方法都要加上可变参数列表,避免编译器歧义:
public class OverloadingVarargs3 {
static void f(float i, Character... args) {
System.out.println("first");
}
static void f(char c, Character... args) {
System.out.println("second");
}
public static void main(String[] args) {
f(1, 'a');
f('a', 'b');
}
}
枚举类型
使用:
Spiciness howHot = Spiciness.MEDIUM;
继承
如果没有无参数的基类构造函数,或者必须调用具有参数的基类构造函数,则必须使用 super 关键字
class Game {
Game(int i) {
System.out.println("Game constructor");
}
}
class BoardGame extends Game {
BoardGame(int i) {
super(i);
System.out.println("BoardGame constructor");
}
}
final
-
final 位于static的位置。对
基本类型
值不变,对引用对象
引用对象地址不变,值可变 -
我们不能因为某数据被 final 修饰就认为在编译时可以知道它的值。
-
final static一起则在对象初始化时创建,初始化一次
-
在参数列表中,将参数声明为 final 意味着在方法中不能改变参数指向的对象或基本变量
-
final加在方法上,继承的子类不能更改
-
finnal加在类上,则不允许继承
如果一个方法是
private
的,它就不是基类接口的一部分。它只是隐藏在类内部的代码你没有覆写方法,只是在创建新的方法而已
一个类当它任意一个 static 成员被访问时,就会被加载。所有的 static 对象和 static 代码块在加载时按照文本的顺序初始化一次
Java 中除了 static 和 final 方法(private 方法也是隐式的 final)外,其他所有方法都是后期绑定
多态
- 在继承上,只有普通的方法调用可以是多态的,static方法不具有多态性。
- 如果在派生类的构造器主体中没有显式地调用基类构造器,编译器就会默默地调用无参构造器。如果没有无参构造器,编译器就会报错(当类中不含构造器时,编译器会自动合成一个无参构造器)。
多态初始化顺序:从继承的类有下往上一次走父类构造器,走到顶,看顶父类是否static数据类型(方法快或者基本类型)
class Glyph {
void draw() {
System.out.println("Glyph.draw()");
}
Glyph() {
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph {
private int radius = 1;
RoundGlyph(int r) {
radius = r;
System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius);
}
@Override
void draw() {
System.out.println("RoundGlyph.draw(), radius = " + radius);
}
}
public class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
}
- 在所有事发生前,分配给对象的存储空间会被初始化为二进制 0,所以radius为0,在draw被覆盖,导致基类构造器的draw调用子类,输出radius为0而不是想要的5,5在之后才会输出。