Java入门-08、接口、多态

接口、多态

接口是Java语言中的一种引用类型,是方法的集合
        接口内部主要封装了方法,包含抽象方法,默认方法,静态方法
        定义格式:
public interface 接口名{
//抽象方法
//默认方法
//静态方法
}

接口的使用,它不能创建对象,但是可以被实现(implements)

接口中的抽象方法需要在其实现类中实现,接口中的默认方法则可以不用重写默认方法,也可以重写

使用场景:添加新功能

public interface JieKou1 {

    public abstract void Print();//抽象方法  在继承类中实现其方法

    //静态方法
    public static void run(){
        System.out.println("接口中的静态方法");
    }

    public static void run1(){
        System.out.println("run1方法");
    }

    //默认方法在实现类中可以修改方法(重写)
    public default void Print1(){
        System.out.println("接口内的默认方法");
    }
}
public class Realize implements  JieKou1{
    //抽象方法的实现
    public void Print(){
        System.out.println("实现接口抽象类方法");
    }

    //默认方法的直接调用(直接调用则不需要些该方法体)或者重写
    //下面例子是重写Print1()
    public  void Print1(){
        System.out.println("重写接口内的默认方法");
    }

    //接口的静态方法无法修改
    public static void run(){
        System.out.println("静态run方法");
    }
}
public class Hello {
    public static void main(String[] args) {
        Realize jieKou2 = new Realize();
        jieKou2.Print();
        jieKou2.Print1();

        /*实现类中并没有重写其run1的静态方法
                在Realize中无法调用run1方法(报错)
                用接口名调用run1方法才可以
        Realize.run1();
        */

        JieKou1.run1();
    }

}

接口的多实现,以及接口与父类知识
1、多个接口中有重名抽象函数,在其实现类中只需要重写一次
2、默认方法有重名的,必须重写一次,不然程序报错
3、接口中出现重名的静态方法并不冲突,因为可以用接口名调用其静态方法
4、优先级问题,一个类既有父类也继承了多个接口,则就近原则选着父类的同名方法

5、一个类继承一个父类的同时实现一个或多个接口,要重写所有的抽象方法

(类不能多继承,只支持单继承)

interface A{
    public abstract void run();
    public abstract void run1();

    public default void Method1(){}
    public default void Method2(){
        System.out.println("A接口的Method2方法");
    }
}


interface B{
    public abstract void run();
    public abstract void run2();

    public default void Method1(){}
    public default void Method3(){}
}

class D{
    public void Method2(){
        System.out.println("父类中的Method2方法");
    }

    public void M(){
        System.out.println("aaa");
    }

}
class C extends D implements A,B {
    //多个接口中有重名抽象函数,在其实现类中只需要重写一次
    public void run(){
        System.out.println("多个父接口中有重名抽象函数只需要重写一次");
    }
      @Override
      public void run2() {
          System.out.println("run2");
      }
      @Override
      public void run1() {
          System.out.println("run1");
      }

    //默认方法有重名的,必须重写一次,不然程序报错
    public void Method1(){
        System.out.println("必须重写一次多接口重名的默认方法,不然报错");
    }
  }


public class JKandFLei {
    public static void main(String[] args) {

        C c = new C();
        //就近原则 选着父类同名方法执行
        c.Method2();

        //向上转型
        D d=new C();
        d.M();

        //向下转型
        C c1=(C)d;
        c1.M();
    }
}

接口中的成员变量

定义格式: 修饰符 static final 数据类型 变量名 = 值 --->常量

注意:不写static final 也默认有,需要手动赋值,且不能二次赋值,一般变量名为大写(规范)

//接口
public interface InterfaceDemo {
    public static final int NUM = 10;
    int I = 20;
}
//测试
public class Test {
    public static void main(String[] args) {

        int i;
        //接口中的i的值是20,将他变为30
        //InterfaceDemo.i=30;//报错,static final修饰的成员变量不能进行二次赋值
        i = InterfaceDemo.I;
        System.out.println(i);
        System.out.println(InterfaceDemo.NUM);
    }
}

多态

定义:是指同一行为,具有多个不同表现形式

注意:

1、必须子父类继承关系(接口、实现类关系)

2、必须有方法的重写

3、父类引用指向子类对象

访问特点:只能调用重写的方法,不能调用子类特有的方法

多态的优点是其扩展性强,缺点是不能调用子类特有的方法

interface JieKou {
    public void method();

    public void method1();
}


class A implements JieKou {

    @Override
    public void method() {
        System.out.println("实现类A方法1");
    }

    @Override
    public void method1() {
        System.out.println("实现类A方法2");
    }
}


class B implements JieKou {

    @Override
    public void method() {
        System.out.println("实现类B方法1");
    }

    @Override
    public void method1() {
        System.out.println("实现类B方法2");
    }
}

public class Demo {
    public static void main(String[] args) {
        A a = new A();
        method(a);
        B b = new B();
        method(b);
    }

    public static void method(JieKou jieKou) {
        jieKou.method();
        jieKou.method1();
    }
}
class Animal {
    public void eat() {
        System.out.println("动物要吃饭");
    }
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗啃骨头");
    }
    public void drink(){
        System.out.println("狗喝水");
    }
}

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃老鼠");
    }
}

public class DuoTai {
    public static void main(String[] args) {
        //向上转型(默认)
        Animal animal = new Dog();
        animal.eat();
        animal.drink();//报错,不能调用子类特有的方法
        Animal animal1 = new Cat();
        animal1.eat();

        //向下转型  可以调用子类特有的方法
        Dog dog =(Dog) animal;
        dog.drink();

    }

    public void method(Animal animal) {
        animal.eat();
    }
}

instanceof关键字用法:

instanceof是Java的一个运算符,也是Java的保留关键字。它的作用是判断其左边对象是否为其右边类的实例,返回的是boolean类型的数据。用它来判断某个对象是否是某个Class类的实例。

用法:boolean result = object instanceof class

class Animal {
    public void eat() {
        System.out.println("动物要吃饭");
    }
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗啃骨头");
    }

    public void drink() {
        System.out.println("狗喝水");
    }
}

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃老鼠");
    }

    public void drink() {
        System.out.println("猫喝奶");
    }
}

public class DuoTai {
    public static void main(String[] args) {

        Dog dog = new Dog();
        method(dog);

        Cat cat = new Cat();
        method(cat);

    }

    public static void method(Animal animal) {

        if (animal instanceof Dog) {
            animal.eat();
            Dog dog = (Dog) animal;
            dog.drink();
        }
        if (animal instanceof Cat) {
            animal.eat();
            Cat cat = (Cat) animal;
            cat.drink();
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TorlesseLiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值