一、继承VS组合
继承我们十四章节说过啦,大家可以看看,现在我们来看看组合
组合:将(继承中)父类当做一个属性变量放在子类(相对于继承而言,没有实现extends)中。
- 上面的通过在Audi类中增加一个Car属性虽然也复用了代码,但是不合逻辑不容易理解
- 比如说:哺乳动物是动物,但是绝对不能说哺乳动物包含动物
- 计算机类 ,主板类。可以通过在计算机类中增加主板属性来复用主板类的代码!
- 计算机包含主板,同样不能说计算机是主板。
<span style="font-size:18px;">/**
* 测试组合
* @author dell
*
*/
public class Animal2 {
String eye;
public void run(){
System.out.println("跑跑!");
}
public void eat(){
System.out.println("吃吃!");
}
public Animal2(){
super();
System.out.println("创建一个动物!");
}
public static void main(String[] args) {
Bird2 b = new Bird2();
b.run();
b.animal2.eat(); //利用实例化Bird2的对象b,调用b中的属性变量Animal2中的eat()方法
}
}
class Bird2 {
Animal2 animal2=new Animal2(); //原本Bird继承Animal2类,现在为了讲解组合的关系
public void run(){ //run()与Animal2类中的run()方法不再是重写的关系
animal2.run();
System.out.println("我是一个小鸟!!");
}
/**
* Bird2类默认继承Object类,super()方法调用的是Object类的无参构造器方法
*/
public Bird2(){
super();
System.out.println("建一个鸟对象");
}
}
</span>
显示结果:
创建一个动物!
建一个鸟对象
跑跑!
我是一个小鸟!!
吃吃!
从建模的角度来看,继承与组合是不同的概念;
从代码复用的角度来看,它们之间是可以互相取代的!
二、final关键字
修饰变量:
- 常量,初始化之后不能再被修改;
修饰方法:
- 该方法不可被子类重写。但是可以被重载
修饰类
- 修饰的类不能有子类,不能被继承。比如:Math、String
1.修饰变量:被final修饰的 变量就是常量,所以在写的时候一般采用大写
<span style="font-size:18px;">final int MAX_VALUE= 200; //常量,初始化之后,<span style="font-family: Arial, Helvetica, sans-serif;">MAX_VALUE值就不能修改,否则会报错误:Syntax error on token "Invalid Character", ; expected</span></span>
2.修饰方法
<span style="font-size:18px;"><span style="white-space:pre"> </span>public /*final*/ void run(){ //final加到方法前面,意味着该方法不能被子类重写!
System.out.println("跑跑!");
}
public void run(String str){ //这里形参str没有具体应用到,仅仅实现以下重载
System.out.println("实现run()方法的重载!");
}</span>
3.修饰类
<span style="font-size:18px;">public /*final*/ class Animal { //final修饰类则说明,这个类不能被继承!
public void run(){
System.out.println("跑跑!");
}
}
class Bird extends Animal {
public void run(){
super.run();
System.out.println("我是一个小小小小鸟,飞呀飞不高");
}
}</span>
如果final修饰类,修饰的类不能有子类,不能被继承。否则会报错误:Illegal modifier for the class Animal; only public, abstract & final are permitted本文参考:非常感谢北京尚学堂高琪老师!