在学习设计模式之前,首先要懂得一些基本知识。
一、UML关系
1、泛化在UML中的泛化就是面向对象程序中:类的继承(extends)。
2、关联在UML中的关联就是面向对象程序中:就是通过类(接口)来声明一个类中的属性(成员变量)。
3、依赖在UML中的关联就是面向对象程序中:就是通过类(接口)来声明一个类方法的参数,或方法的返回类型。
4、实现在UML中的关联就是面向对象程序中:就是一个类实现了一个接口。
二、Java继承
首先将类的继承分为普通类和抽象类这两大继承。而具体的继承又分为属性和方法的继承,以及特殊的static和final修饰造成不同继承结果。
1、普通类的继承
名称 | 父类 | 子类 | 子类可继承 |
---|
类类型 | public | public | ~ |
属性类型 | public/protected | ~ | 可 |
属性类型 | private | ~ | 否 |
方法类型 | public/protected | ~ | 可 |
方法类型 | private | ~ | 否 |
1.1 属性继承特点
属性类型和名称相同 | 父类 | 子类 | 子类可继承 |
---|
属性 | 有 | 无 | 可用子类对象调用父类中的属性 |
属性 | 有 | 有 | 父类属性被子的隐藏,即调用的是子类中的属性 |
1.2 方法继承特点
方法的声明(类型、参数、名称)相同 | 父类 | 子类 | 子类可继承 |
---|
方法 | 有 | 无 | 可用子类对象执行父类中的方法 |
方法 | 有 | 有 | 父类方法被子类的覆盖,即执行的是子类中的方法 |
1.3 其他
1) 子类能继承同一个包内,由默认修饰符修饰(default)的成员变量和成员方法。
2) final和static修饰的属性和方法都可以被继承和修改;也就是final和static对普通类的属性和方法继承无影响,但是不能被覆盖。
父类 class A
class A {
int a1 = 1;
static int a2 = 2;
final int a3 = 3;
double f(double x, double y) {
return x + y;
}
static int g(int n) {
return n * n;
}
}
子类 class B
class B extends A {
int a1 = 11;
static int a2 = 22;
final int a3 = 33;
double f(double x, double y) {
double m = super.f(x, y);
return m + x * y;
}
static int g(int n) {
int m = A.g(n);
return 10 + n;
}
}
测试类 class Test
public class PrintMethod {
public static void main(String[] args) {
A a = new B()
System.out.println("A a1: "+a.a1)
System.out.println("A a2: "+a.a2)
System.out.println("A a3: "+a.a3)
System.out.println("A static g(): "+a.g(3))
System.out.println("A f(): "+a.f(10, 1))
System.out.println()
B b = new B()
System.out.println("B a1: "+b.a1)
System.out.println("B a2: "+b.a2)
System.out.println("B a3: "+b.a3)
System.out.println("B static g(): "+b.g(3))
System.out.println("B f(): "+b.f(10, 1))
}
}
测试结果
A a1: 1
A a2: 2
A a3: 3
A static g(): 9
A f(): 21.0
B a1: 11
B a2: 22
B a3: 33
B static g(): 12
B f(): 21.0
默认修饰符(default):默认的访问权限,也是可以省略的访问权限,它不仅能在设置了该权限的类中访问,也可以在同一包中的类或子类中访问。
2、抽象类的继承
名称 | 父类 | 子类 | 子类可继承 |
---|
类类型 | public | public | ~ |
属性类型 | public/protected | ~ | 可 |
属性类型 | private | ~ | 否 |
方法类型 | public/protected | ~ | 可 |
方法类型 | private | ~ | 否 |
1.1 属性继承特点
属性类型和名称相同 | 父类 | 子类 | 子类可继承 |
---|
属性 | 有 | 无 | 可 |
属性 | 有 | 有 | 父类属性被子的隐藏 |
1.2 方法继承特点
方法的声明(类型、参数、名称)相同 | 父类 | 子类 | 子类可继承 |
---|
方法 | 有 | 无 | 可 |
方法 | 有 | 有 | 父类方法被子类的覆盖 |
1.3 其他
1) 子类能继承同一个包内,由默认修饰符修饰(default)的成员变量和成员方法。
2) final和static修饰的属性和方法都可以被继承和修改;也就是final和static对普通类的属性和方法继承无影响。