day03(接口,多态)

时间:2023-03-10 04:29:18
day03(接口,多态)

接口:
            概念:是功能的集合,可以当做引用数据类型的一种。比抽象类更加抽象。

接口的成员:
               成员变量:必须使用final修饰 默认被 public & static & final修饰 不允许修改

成员方法:必须是抽象方法 默认是抽象方法 创建方法时可以省略。(开发时建议写上,好辨识)
              构造方法:没有
  

public interface Inter01 {
public static final int NUM=10;
public abstract void eat();

特点:

 1.打破了常规的单继承,接口可以多继承,也可以多层继承

2.成员方法都是抽象方法,成员变量必须被final修饰。

        3.不能创建对象(因为接口里面都是抽象方法,调用没有意义)
     4.子类必须实现所有成员方法。

public interface Inter01 {
public static final int NUM=10;
public abstract void eat();
public abstract void sleep();
}
interface Inter03{
}
//体现了多继承 打破了类的单继承
interface Inter02 extends Inter01,Inter03{
}
class Test implements Inter01{//实现接口的所有方法
@Override
public void eat() {
}
@Override
public void sleep() {
}
}

  

接口和类的关系
     A:类与类之间:继承关系,一个类只能直接继承一个父类,但是支持多重继承
     B:类与接口之间:只有实现关系,一个类可以实现多个接口
     C:接口与接口之间:只有继承关系,一个接口可以继承多个接口
  接口的优点
     1.类与接口的关系,实现关系,而且是多实现,一个类可以实现多个接口,类与类之间是继承关系,java中的继承是单一继承,一个类只能有一个父类,打破了继承的局限性。
     2.对外提供规则(USB接口)

     3.降低了程序的耦合性(可以实现模块化开发,定义好规则,每个人实现自己的模块,提高了开发的效率)

day03(接口,多态)

多态:

   概念:父类在不同的时候表现出不同的状态。

   实现多态的前提:1.继承

           2.重写

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

   实现多态的三种格式

      普通类实现多态

class Fu{
public void eat(){
System.out.println("Fu 吃饭");
}
}
class Zi extends Fu{
@Override
public void eat(){
System.out.println("Zi 吃饭");
}
}
public class Inter01{
public static void main(String[] args) {
Fu f=new Zi();//父类引用指向子类对象
f.eat();//Zi 吃饭
}
}

      抽象类实现多态

abstract class Fu{
public abstract void method();
}
class Zi extends Fu{
@Override
public void method(){
System.out.println("子类重写了父类的方法method");
}
}
public class Inter01{
public static void main(String[] args) {
Fu f=new Zi();//父类引用指向子类对象
f.method();//子类重写了父类的方法method
}
}

      接口实现多态

interface Inter02{
public abstract void jump();
}
class Cat implements Inter02{
public void jump() {
System.out.println("猫可以调高");
}
}
class tiger implements Inter02{ @Override
public void jump() {
System.out.println("老虎会调高");
} }
public class Class01{
public static void main(String[] args) {
Inter02 i=new tiger();
i.jump();
}
}

  多态的成员特点

           成员变量:  仅仅只是该事物的外在特征描述

          编译时看左边  运行时看左边

      成员方法:  功能描述     

          编译时看左边 运行数看右边

        静态方法:不能被重写

          编译时看左边  运行时看左边

  

public class PoymorphicDemo2 {
public static void main(String[] args) {
Dad d = new Kid();
//System.out.println(d.num); //d.method();
d.function();//使用变量去调用静态方法,其实相当于用变量类型的类名去调用
}
} class Dad {
int num = 20; public void method() {
System.out.println("我是父类方法");
} public static void function() {
System.out.println("我是父类静态方法");
}
} class Kid extends Dad {
int num = 10; public void method() {
System.out.println("我是子类方法");
} public static void function() {
System.out.println("我是子类静态方法");
}
}

  多态中的向上转型和向下转型

      向上转型  自动转型

            父类     父=new   子类();

      向下转型   子类   子=(子类)父;

      举例:孔子装爹

        向上转型     孔子装他爹

        向下转型     孔子脱了衣服

/*
*
* 多态中的向上转型和向下转型:
*
* 引用类型之间的转换
* 向上转型
* 由小到大(子类型转换成父类型)
* 向下转型
* 由大到小
* 基本数据类型的转换
* 自动类型转换
* 由小到大
* byte short char --- int --- long --- float --- double
* 强制类型转换
* 由大到小
*
*
*
*/
public class PoymorphicDemo3 {
public static void main(String[] args) {
Animal2 a = new Dog();//向上转型
//a.eat(); Dog d = (Dog)a;//向下转型
d.swim(); }
} class Animal2 {
public void eat() {
System.out.println("吃东西");
}
} class Dog extends Animal2 {
public void eat() {
System.out.println("啃骨头");
} public void swim() {
System.out.println("狗刨");
}
}

  

 多态内存图

day03(接口,多态)

    类转化异常

      day03(接口,多态)