依赖:一个类用到另一个类,但这种使用关系是偶然的、临时的。
代码体现:局部变量、方法参数
关联:一个类用到另一个类,但这种使用关系是经常的。
代码体现:成员变量
聚合:整体与局部的关系,是关联的一种,但是整体与部分可以独立存在
合成(组合):整体与局部的关系,是关联的一种,但是整体与局部不可独立存在
注:(1)构造方法的执行顺序按先超类后子类的层次顺序
(2)如果调用超类有参数的构造方法,必须要在子类的构造方法中用super方法明确指出调用超类的哪个构造方法
区别点 | 重写(覆写) | 重载 |
---|---|---|
英文 | Overriding | Overloading |
定义 | 方法名称、参数类型、返回值类型全部相同 | 方法名称相同,参数的类型或个数不同 |
被重写的方法不能拥有更严格的权限 | 对权限没有要求 | |
范围 | 发生在继承类中 | 发生在同一个类中 |
静态绑定成员变量:在处理Java类中的成员变量时,并不是采用运行时绑定,而是一般意义上的静态绑定
可以将成员变量封装成get形式,通过动态绑定来实现调用子类的成员变量
public Father {
protected String name = "Father";
public String getName() {
return name;
}
}
public Son extends Father {
protected String name = "Son";
public String getName() { //子类必须写getName方法,否则调用sample.getName()结果还是Father
return name;
}
}
Father sample = new Son();
System.out.println(sample.name); //Father
System.out.println(sample.getName()); //Son
[public] interface 接口名 [extends 父接口列表] {
[public] [static] [final] 常量;
[public] [abstract] 方法;
}
public class B implements A {}
A a = new B(); //正确
A a = new A(); //错误
创建内部类:
创建非静态内部类对象时,一定要先创建相应的外部类对象
outerClass outerObject = new outerClass(Constructor Parameters);
outerClass.innerClass innerObject = outerObject.new innerClass(Constructor Parameters);
静态内部类(嵌套类):将内部类声明为static
outerClass.innerClass innerObject = new outerClass.innerClass(Constructor Parameters)
局部内部类:类被定义在一个方法或是一个代码块中
匿名内部类
声明形式:
new interfaceName(){ //body }
new superClassName(){ //body }
实例:
interface Contents { int vaule(); }
public class Goods {
public Contents cont() {
return new Contents() {
private int i = 11;
public int value() {
return i;
}
};
}
}
public class Outer {
public Outer() {}
private class Inner {
public Outer getOuter() {
return Outer.this;
}
public Outer newOuter() {
return new Outer();
}
}
}
Outer out = new Outer();
Outer.Inner inner = out.new Inner();
Outer o1 = inner.getOuter(); //得到创建该内部类时使用的外部类对象的引用
Outer o2 = inner.newOuter(); //创建了一个新引用
interface Shape {
public void paint();
}
public class Painter {
private class Inner Shape implements Shape {
public void paint() {
System.out.println("painter");
}
}
public Shape getShape() {
return new InnerShape();
}
public static void main(String[] args) {
Painter painter = new Painter();
Shape shape = painter.getShape();
shape.paint(); //painter
}
}
class WithInner {
class Inner {
Inner() {
System.out.println("WithInner.Inner");
};
}
}
public class InheritInner extends WithInner.Inner {
InheritInner(WithInner wi) {
wi.super();
System.out.println("InheritInner");
}
public static void main(String[] args) {
WithInner wi = new WithInner();
InheritInner ii = new InheritInner(wi);
}
}
重载的两个内部类是完全独立的,各自在自己的命名空间内
class Egg {
privated Yolk y;
protected class Yolk {
public Yolk() {
System.out.println("Egg.Yolk()");
}
}
public Egg() {
System.out.println("new Egg");
y = new Yolk();
}
}
public class BigEgg extends Egg {
public class Yolk {
public Yolk() {
System.out.println("BigEgg.Yolk()");
}
}
public static void main(String[] args) {
BigEgg b = new BigEgg(); //new Egg; Egg.Yolk()
}
}