接口多态得简单了解(偷懒只会骗自己)

阅读 161

2022-03-14

接口
           场景:一个类中,所有的方法,都是抽象方法 (指定规则)
        接口介绍:
            当一个类中的所有方法都是抽象方法的时候,我们就可以将其定义为接口
            接口是一种引用数据类型,他比抽象还要抽象
        接口存在的两个重要意义:
        1.规则的定义
        2.程序的扩展性
        例子: USB数据线接口   长方形的接口,笔记本插口也是长方形的   定义了一种规则   USB的扩展下 可以接鼠标 耳机等等
        
    接口的定义格式:
        public interface 接口名{}
    接口不可以实例化 
    接口和类之间是实现关系,通过implements关键字表示 
        public class 类名 implements 接口名{}
    接口的子类(实现类)
        要么重写接口中的所有抽象方法
        要么是个抽象类
    注意:接口和类得实现关系,可以单实现,也可以多实现
            public class 类名 implements 接口名1,接口名2{}
    代码:
接口类

public interface inter {
    public abstract void study();
}

 接口实现类

public class interImpl implements inter{
    @Override
    public void study() {
        System.out.println("我是实现类中得实现方法");
    }
}

 测试类

public class TestInterface {
    /*
    接口的定义格式:
		public interface 接口名{}

		接口和类之间是实现关系,通过implements关键字表示
		public class 类名 implements 接口名{}
     */
    public static void main(String[] args) {
    //inter i=new inter();会报错,不能被实例化
    interImpl i=new interImpl();
    i.study();
    }
}

接口中成员得特点:
            成员变量:只能是常量,系统会默认加入三个关键字
                    public static final
            构造方法:
                    接口当中没有构造方法
            成员方法:
                    只能是抽象方法,系统会默认加上public abstract 
            关于接口中得方法,JDK9和JDK9有一些新特性
            1.JDK8版本之后,Java只对接口得成员方法进行了改进
            如何能在丰富接口方法得同时,不对子类代码进行修改嫩 
            允许接口中定义带有方法体得方法
            允许在接口中定义非抽象得方法,但是需要使用关键字default修饰,这些方法就是默认方法
            作用:解决接口升级得问题
            格式: 
            public default 返回值类型 方法名(参数列表){}
            范例:
            public default void show(){}
            默认方法不强制重写 如果多个接口定义相同得声明  必须得重写    如果重写默认方法 一定不要写default
            2.接口中允许定义static 静态方法 
            格式:public static 返回值类型  方法名(参数列表){}
            范例:public static void  show(){}
            静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
            public可以省略,static不能省略
            JDK9版中接口成员得特点
            格式1:private 返回值类型 方法名(参数列表){}
            范例1:private void show(){}
            格式2:private static    返回值类型 方法名(参数列表){}
            范例2:private static    void show(){}

    接口得使用思路
        如果发现一个类中所有得方法都是抽象方法,那么就可以将该类,改进为一个接口
        设计到了 接口大面积更新方法,而不想修改每一个是实现类,就可以将更新得方法,定义为带有方法体得默认方法
        希望默认方法调用更加简介,可以考虑设计为static 静态方法(需要去掉default关键字)
        默认方法中出现了重复得代码,可以考虑抽取出一个私有方法
    类和接口得关系
    类和类得关系:
        继承关系,只能单继承,但可以多层继承
    类和接口得关系:
        实现关系,可以单实现,也可以多实现,还可以在继承一个类得同时 实现多个接口
    接口和接口得关系
        继承关系,可以单继承,也可以多继承  (两个接口要是有同样得声明,就会接口实现类就会重写方法)
    
    
    多态 
        多态概述:同一个对象,在不同时刻表现出来得不同形态
        举例 猫
        我们可以说猫是猫  猫 cat=new 猫();
        我们可以说猫是动物   动物  animal=new 猫();
        这里猫在不同得时刻表现出来不同得心态,这就是多态
    多态得前提和体现
        有继承/实现关系
        有方法重写
        有父类引用指向子类对象

代码实例:

public class test4 {
    /*
    有继承/实现关系
		有方法重写
		有父类引用指向子类对象
     */
    public static void main(String[] args) {
        //当前事物是一只猫
        Cat c=new Cat();
        // 当前事物,是一只动物
        Animal animal=new Cat();
    }

}
class  Animal{
    public  void eat(){
        System.out.println("动物吃饭");
    }
}
class Cat extends Animal{
    @Override
    public  void eat() {
        System.out.println("猫吃鱼");
    }
}

多态中成员访问特点
    构造方法:同继承一样,子类会通过super访问父类构造方法
    成员变量: 编译看左边(父类),执行看左边(父类)
    成员方法: 编译看左边(父类),执行看右边(子类)

public class test4 {
    /*
    有继承/实现关系
		有方法重写
		有父类引用指向子类对象
		成员变量: 编译看左边(父类),执行看左边(父类)
	成员方法: 编译看左边(父类),执行看右边(子类)
     */
    public static void main(String[] args) {
       Fu f=new Zi();
        System.out.println(f.num);//10
        f.method();   //Zi.....method
    }
}
class  Fu{
    int num =10;
    public  void method(){
        System.out.println("Fu.....method");
    }
}
class Zi extends Fu{
    int num=20;
    @Override
    public  void method() {
        System.out.println("Zi.....method");
    }
}

多态得好处和弊端
    好处: 扩展性得提高   具体体现  使用父类性作为参数,该方法就可以接收这父类得任意子类对象
    弊端:不能调用子类   不能调用子类得特有功能  

public class test4 {
    public static void main(String[] args) {
        userAnimal(new userDog());
        userAnimal(new userCat());
    }
    public static void userAnimal(Animal a){
        a.eat();
        a.watchHome();  //会报错  不能调用特有得方法
    }
}
abstract class  Animal{
   public abstract void eat();
}
class userDog extends Animal{
    @Override
    public  void eat() {
        System.out.println("狗吃肉");
    }
    public void watchHome(){
        System.out.println("看家护院");
    }
}
class userCat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃肉");
    }
}

 多态中得转型
    向上转型 
        从子到父
        父类引用指向子类对象
    向下转型
        从父到子
        父类引用转为子类对象

public class test4 {
    public static void main(String[] args) {
       // 1.向上转型  父类引用指向子类对象
        Fu f=new Zi();
        f.show();
        //多态得弊端  不能调用子类特有成员
        //f.method
        //方案一  直接创建子类对象
        //方案二 向下转型  从父类转换为子类类型
        Zi z=(Zi) f;
        z.method();
        z.show();
    }

}
 class  Fu{
   public  void show(){
       System.out.println("Fu....show");
   };
}
class Zi extends Fu{
    @Override
    public  void show() {
        System.out.println("Zi.....show");
    }
    public void method(){
        System.out.println("子类特有方法");
    }
}

码不动了 这一段时间 疫情   工作到晚上十点回来  这两天中午打球出汗还感冒了  真是难受啊   明天继续!!!

精彩评论(0)

0 0 举报