继承
继承是oop语言中的重要一环,用extends关键字实现,在java中所有声明的类都要继承一个类,如果没有特别声明,默认继承object类。被继承的类叫做父类,继承别人的类叫做子类,一个父类可以被多个子类继承,但一个子类不能继承多个父类,但是这里注意,一个接口是可以继承多个接口的,因为接口没有具体的实现,不会发生冲突,子类可以调用父类的变量和方法,注意子类一般是父类的特殊情况:
public class Person{
}
public class zhangsan extends Person{
}
public class lisi extends Person{
}
成员变量
子类能否调用父类的成员变量,要看父类成员变量的关键字(例如protect等),具体信息我在软件构造系列(一)里已讲过,如果不清楚请移步。
如果子类中有成员变量的名字与父类中相同,会优先使用子类成员变量(也就是隐藏父类的名字相同的成员变量),这时,如果又想使用父类的这个变量,使用super方法即可。
这里还提醒一点,如果这个类方法的输入参数的名字与此类成员变量重合了,会优先使用方法的输入参数,要使用成员变量得用this方法:
public class Person{
public int age;
}
public class zhangsan extends Person{
public int age;
public void setage(int age){//这样就把父类和子类的age都set了
this.age = age;
super.age = age;
}
}
方法
与成员变量类似,能否使用父类的方法得看关键字。
方法与父类的方法同名,会优先使用子类方法,覆盖父类方法,相当于override了,这时要使用父类方法,用super就行了
public class Person{
public void eat(){
}
}
public class zhangsan extends Person{
public void eat(){
super.eat();
}
}
构造器
父类构造器是不能被子类继承的,如果父类的构造器必须要参数,那么子类必须在构造器中使用super(参数)进行构造;如果父类的构造器不需要参数,那就不用管;如果父类的构造器有要参数和不要参数的,如果你不用super构造,默认使用不要参数的构造器构造,否则使用你super对应的构造器。
public class Person{
public int age;
public Person(int age){
this.age = age;
}
}
public class zhangsan extends Person{
public zhangsan(int age){
super(age);
}
}
委托
委托(delegation)说白了就是在一个类里new另一个类,这样就可以到达使用另一个类的属性和方法的效果,来增加代码的复用性和整洁。
实现形式
我总结为两种实现形式
一种直接委托类本身,比如我给一台电脑装个intel的CPU,他就可以利用这个CPU去完成相应的计算:
public class Computer {
public Intel intel = new Intel();
}
public class Intel {
}
第二种是委托给接口,其中这种方式更为常用,因为你可以替换接口的具体实现,更加灵活,就比如这里,我给电脑安一个CPU,但我具体安的时候,可以安intel处理器,也可以选择其他牌子的CPU。
public class Computer {
public CPU intel = new Intel();
}
public interface CPU {
}
public class Intel extends CPU{
}
临时委托
临时委托一般用在方法中,常用来处理一些操作,因为用完就可扔了,所以是临时的,比如我们要从控制台读入数据时,new一个scanner,就是把读数据这个操作委托给scanner来处理,读完就不需要这个scanner了。
永久委托
永久委托一般用于成员变量,我这个类需要有一个成员,它要有一些属性和功能,那么此时就可以使用委托把这个成员交给另一个类来处理实现,比如上面的电脑的CPU就是永久委托,CPU这个部分委托给CPU相关的类来实现。