Java中可实现多继承的三种方法(多层继承/内部类/接口)
2019-12-05 本文已影响0人
瑟闻风倾
Java不支持多继承,但是通过一些巧妙的设计来达到和多继承同样的效果 :通过继承、内部类和接口互相配合,达到多继承的效果。
- java类不可直接多继承,但可通过多层继承实现多继承。
但多层继承一般建议不超过三次,且代码较冗余。- java类只可单继承一个具类,但可实现多个接口。
新类可继承自一个具类class,其余继承都得是interfaces。- java类不能继承多个具类,但我们可在其内部设多个inner class,每个inner class都能各自继承某一实现类。
inner class不受限于outer class 是否已经继承自某一实现类, inner class可以说是多重继承问题的完整解决方案。
1. 多层继承
public class GrandpaA {
private int age = 60;
public int getAge(){
return this.age;
}
public void fun(){
System.out.println("爷爷厨艺真棒!");
}
}
public class FarterB extends GrandpaA{
private String name="李卫聆";
public String getName(){
return this.name;
}
@Override
public void fun(){//方法覆写
System.out.println(this.getAge());//父类私有域被继承但不可直接使用,需通过getter方法间接获得私有域的内容
}
}
public class SonC extends FarterB{//C类继承B类,相当于间接继承A类
private String name="李萧然";
public String getName(){
return this.name;
}
@Override
public void fun(){//方法覆写(结果为覆写后的内容)
System.out.println(this.getName());
System.out.println(this.name);
}
public static void main(String[] args){
GrandpaA a = new GrandpaA();
a.fun();
print(new FarterB());//向上转型(优点在于子类可自动进行向上转型,可实现参数的统一)
print(new SonC());
}
public static void print(GrandpaA a){
a.fun();
}
}
多层继承.png
2. 成员内部类可直接实现多继承
(1) 示例1
public class GrandmaA {
private int age = 58;
public int getAge(){
return this.age;
}
public void fun(){
System.out.println("外婆厨艺真棒!");
}
}
public class MotherB {
private String name="刘青瑶";
public String getName(){
return this.name;
}
public void fun(){//方法覆写
System.out.println("妈妈厨艺真棒!");
}
}
public class DaughterC {
class OneA extends GrandmaA{//C中内部类继承A类
public void printA(){
System.out.println(this.getAge());
fun();
}
}
class OneB extends MotherB{//C类内部类继承B类
public void printB(){
System.out.println(this.getName());
fun();
}
}
public void print(){//在C类中生成普通方法print()
new OneA().printA();//匿名实例化OneA类对象并调用printA方法
new OneB().printB();
}
public static void main(String[] args){
DaughterC c = new DaughterC();//实例化C类对象
c.print();//调用C中print方法
}
}
成员内部类.png
(1) 示例2
假如有一个Phone类,里面实现了一个可以打电话的功能的方法callSomebody(String phoneNum);一个Message类,里面实现了一个可以发信息功能的方法sendToSomebody(String phoneNum);还有一个类Human,这个Human类想实现打电话和发信息的功能,我们知道可以用继承来获得父类的方法,但是java原则上是不允许多继承只可以单继承,也就是说只可以实现其中一个类里面的方法,这并不满足我们的需求。可以使用内部类实现多继承的效果,实现调用两个类中的方法。
package comi.example.liy.javatestdemo;
/**
* Created by liy on 2019-12-04 17:14
*/
public class Phone {
public void callSomebody(String phoneNum){
System.out.println("我在打电话喔,呼叫的号码是:" + phoneNum);
}
}
package comi.example.liy.javatestdemo;
/**
* Created by liy on 2019-12-04 17:15
*/
public class Message {
public void sendToSomebody(String phoneNum){
System.out.println("我在发短信喔,发送给 :" + phoneNum);
}
}
package comi.example.liy.javatestdemo;
/**
* Created by liy on 2019-12-04 17:16
* 内部类实现多继承的效果
*/
public class Human {
private class MyPhone extends Phone {
}
private class MyMessage extends Message{
}
private MyPhone phone = new MyPhone();
private MyMessage message = new MyMessage();
public void humanCall(String phoneNum){
phone.callSomebody(phoneNum);
}
public void humanSend(String mes){
message.sendToSomebody(mes);
}
public static void main(String[] args) {
Human phone = new Human();
phone.humanCall("110");
phone.humanSend("119");
}
}
运行结果:
利用内部类实现多继承的效果.png
3. 接口实现多继承
在同时可用内部类和接口时,优先使用接口。因为内部类需应用于继承关系,接口既可用于继承也可用于其他,比较灵活。
public interface ICatA {
void climb();
}
public interface IDogB {
void eat();
}
public interface IRabbitC {
void run();
}
(1) 同时实现多个接口示例
package comi.example.liy.javatestdemo1;
/**
* Created by liy on 2019-12-05 13:22
*/
public class Tiger implements IRabbitC, ICatA, IDogB {
@Override
public void run() {
System.out.println("老虎跑得快");
}
@Override
public void climb() {
System.out.println("老虎不会爬树");
}
@Override
public void eat() {
System.out.println("老虎要吃肉");
}
public static void main(String[] args){
Tiger tiger = new Tiger();//实例化对象
tiger.run();
tiger.climb();
tiger.eat();
}
}
实现多个接口.png
(2) 接口多继承示例
public interface IMonkeyC extends ICatA, IDogB {
void run();
}
package comi.example.liy.javatestdemo1;
/**
* Created by liy on 2019-12-05 13:11
*/
public class Human implements IMonkeyC {
@Override
public void run() {
System.out.println("人类跑得快");
}
@Override
public void climb() {
System.out.println("人类爬树退化了");
}
@Override
public void eat() {
System.out.println("人类是杂食动物");
}
public static void main(String[] args){
Human human = new Human();//实例化对象
human.run();
human.climb();
human.eat();
}
}
接口多继承.png