继承(一个子类只能有一个父类)
继承有两个主要作用
- 代码复用,更加容易实现类的扩展
- 方便对事务建模
继承实现
extends
instanceof运算符
package com.ssc.inherit;
import java.security.PublicKey;
import OrientedObject.ThisStudy;
public class Person {
String name;
public static void main(String[] args) {
// TODO Auto-generated method stub
Student uStudent = new Student("孙少聪", 20);
System.out.println(uStudent instanceof Person);
System.out.println(uStudent instanceof Student);
}
public void rest() {
System.out.println("我要休息!!");
}
}
class Student extends Person{
int score;
public void study() {
System.out.println(this.name+"要学习!!");
}
Student(String name,int score) {
// TODO Auto-generated constructor stub
this.name = name;
this.score = score;
}
}
继承使用要点
- Java 中只有单继承
- Java 中类没有多继承,接口有多继承
- 子类继承父类,可以得到父类的全部属性和方法 (除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法)
- 如果定义一个类时,没有调用 extends,则它的父类是:java.lang.Object。
方法重写
方法重写三个要点
- “= =”: 方法名、形参列表相同
- “≤”:返回值类型和声明异常类型,子类小于等于父类
- “≥”: 访问权限,子类大于等
package com.ssc.inherit;
public class Transportation {
public static void main(String[] args) {
// TODO Auto-generated method stub
TransTool uTransTool = new TransTool();
TransTool uCar = new Car();
TransTool uTrain = new Train();
TransTool uPlane = new Plane();
uTransTool.run();
uCar.run();
uPlane.run();
uTrain.run();
}
}
class TransTool{
public void run() {
System.out.println("我是工具");
}
}
class Car extends TransTool{
public void run() {
System.out.println("我是小汽车,我可以达到120km/h");
}
}
class Train extends TransTool{
public void run() {
System.out.println("我是火车,我可以达到300km/h");
}
}
class Plane extends TransTool{
public void run() {
System.out.println("我是飞机,我可以达到1000km/h");
}
}
final关键字
作用
- 修饰变量:被他修饰的变量不可改变。一旦赋了初值,就不能被重新赋值。
final int MAX_SPEED = 120 - 修饰方法:该方法不可被子类重写。但是可以被重载!子类里面可以调取使用
final void study(){} - 修饰类:修饰的类不能被继承。比如:Math、String 等。
final class A {}
组合
- “组合”不同于继承,更加灵活。
- “组合”的核心就是“将父类对象作为子类的属性”,然后,“子类通过调用这个属性
来获得父类的属性和方法”
package com.ssc.inherit;
public class Animal {
int age;
String name;
public static void main(String[] args) {
// TODO Auto-generated method stub
Taidi uTaidi = new Taidi(20, "哈哈");
}
public void speak() {
System.out.println("我要嚎叫了");
}
}
class Dog{
public void run() {
System.out.println("我是小狗");
}
}
class Taidi{
Animal uAnimal = new Animal();
public Taidi(int age,String name) {
// TODO Auto-generated constructor stub
this.uAnimal.age = age;
this.uAnimal.name = name;
uAnimal.speak();
}
}
何时组合何时继承
- 继承和组合都可以代码复用
- 继承除了代码复用、也能方便我们对事物建模。所以,对于“is -a”关系建议使用继承,
“has-a”关系建议使用组合。
比如:上面的例子,Taidi is a Animal 这个逻辑没问题,但是:Taidi has a Animal
就有问题了。这时候,显然继承关系比较合适。
再比如:笔记本和芯片的关系显然是“has-a”关系,使用组合更好