继承多态组合代理向上转型static和final
访问控制权限又称为封装,是面向对象三大特性中的一种。
访问控制权限最核心的一点是只对需要的类可见。
Java中成员的访问权限共有四种,分别是public、protected、default、private,它们的可见性如下
| private | default | protected | public | |
|---|---|---|---|---|
| 同一类 | √ | √ | √ | √ |
| 同一包中的类 | √ | √ | √ | |
| 子类 | √ | √ | ||
| 其他包中的类 | √ |
√ 表示可以访问
继承继承是所有面向对象编程(OOP)语言和Java语言都不可或缺的一部分。只要创建了一个类,就隐式地继承自Object父类,只不过没有指定。如果你显式指定了父类,那么你继承于父类,而父类继承于Object类。
继承的关键字是 extends,代码表示如下
class Father{}
class Son extends Father{}
继承双方拥有某种共性特征
class Father{
public void feature(){
System.out.println("父亲的特征");
}
}
class Son extends Father {
}
如果Son没有实现自己的方法,那么默认使用父类的feature方法。如果子类实现了自己的feature方法,就相当于重写了父类的feature方法。
多态多态指的是同一个行为具有多个不同的表现形式。是指一个类实例(对象)的相同方法在不同情形下具有不同表现形式。
封装和继承是多态的基础。多态只是一种表现形式。
多态的实现需要具有三种充要条件:
继承重写父类方法父类引用指向子类对象
public class Fruit {
int num;
public void eat(){
System.out.println("eat Fruit");
}
}
public class Apple extends Fruit{
@Override
public void eat() {
super.num = 10;
System.out.println("eat " + num + " Apple");
}
public static void main(String[] args) {
Fruit fruit = new Apple();
fruit.eat();
}
}
上述代码中可以发现,Fruit类型的对象指向了Apple对象的引用,这其实就是多态->父类引用指向子类对象,因为Apple继承于Fruit,并且重写了eat方法,所以能够表现出来多种状态的形式。
组合组合就是将对象引用于新类中。组合也是一种提高类的复用性的一种方式。如果想让类具有更多的扩展功能,就需要多用组合,少用继承。
public class SoccerPlayer {
private String name;
private Soccer soccer;
}
public class Soccer {
private String soccerName;
}
上面代码中 SoccerPlayer 引用了 Soccer 类,通过引用Soccer 类,来达到调用soccer中的属性和方法。
组合和继承的区别
| 特征 | 组合 | 继承 |
|---|---|---|
| 关系 | 组合是一种 has-a 的关系,可以理解为有一个 | 继承是一种 is-a 的关系,可以理解为是一个 |
| 耦合性 | 组合的双方是一种松耦合的关系 | 继承双方紧耦合 |
| 是否具有多态 | 组合不具备多态和向上转型 | 继承是多态的基础,可以实现向上转型 |
| 时期 | 组合是运行期绑定 | 继承是编译器绑定 |
代理可以描述为A想要调用B类的方法,A不直接调用,A会在自己的类中创建一个B对象的代理,再由代理调用B的方法。如下
代码如下(示例):
public class Destination {
public void todo(){
System.out.println("control...");
}
}
public class Device {
private String name;
private Destination destination;
private DeviceController deviceController;
public void control(Destination destination){
destination.todo();
}
}
public class DeviceController {
private Device name;
private Destination destination;
public void control(Destination destination){
destination.todo();
}
}
向上转型
向上转型代表了父类与子类之间的关系,其实父类和子类之间不仅仅有向上转型,还有向下转型,转型后的范围不一样:
向上转型:通过子类对象(小范围)转为为父类对象(大范围),这种转换是自动完成的,不用强制。向下转型:通过父类对象(大范围)实例化子类对象(小范围),这种转换不是自动完成的,需要强制指定。 static和final
static是Java中的关键字,他的意思是静态的,static可以用来修饰成员变量和方法,static用在没有创建对象的情况下调用方法/变量
用static声明的成员变量为静态成员变量,也称为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。
static String name = "cxuan";
使用static修饰的方法称为静态方法,静态方法能够直接使用类名.方法名进行调用。静态方法不依赖于任何对象可直接访问,因此没有this关键字,实例变量都会有this关键字。在静态方法中不能访问类的非静态成员变量和非静态方法。
static void printMessage(){
System.out.println("cxuan is writing the article");
}
static除了修饰属性和方法,还有静态代码块的功能,可用于类的初始化操作。进而提升程序的性能。
public class StaicBlock {
static{
System.out.println("I'm A static code block");
}
}
由于静态代码块随着类的加载而执行,因此,很多时候会将只需要进行一次的初始化操作放在static代码块中进行。
final的意思是最后的、最终的,他可以修饰类、属性、方法。
final修饰类时,表明这个类不能被继承。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。final 修饰方法时,表明这个方法不能被任何子类重写,因此只有在想明确禁止该方法在子类中被覆盖地情况下才会将方法设置为final。final 修饰变量分为两种情况,一种是修饰基本数据类型,表示数据类型的值不能被修改;一种是修饰引用类型,表示对其初始化之后便不能再让其指向另一个对象。



