JAVASE基础模块十(多态 抽象类 接口等)

JAVASE基础模块(多态 抽象类 接口等)

多态

  • 指的是一种事物 在不同时刻所表现出的不同状态

    1. 猫是猫类 也是动物类
    2. Cat cat=newCat(); Animal animal=new Animal();
  • 多态的前提

    1. 要有继承 没有继承 多态就不存在
    2. 要有方法重写 不重写多态就失去了意义
    3. 多态是父类引用指向子类对象
  • 多态的形式 来观察成员变量的特点

    • 编译看左边 运行看右边
    • 编译看父类有没有这个方法 有语法就报错 实际调用时 以子类重写过的方法为准
    public class DuoTai {
        public static void main(String[] args) {
            Cat a = new Cat();
            a.eat();
            a.show();
            System.out.println(a.age);
            Animal a1 = new Cat();
            a1.eat();
            System.out.println(a1.age);
            a1.show();
    
        }
    }
    
    class Animal {
        int age = 5;
    
        public void eat() {
            System.out.println("吃东子");
        }
    
        public void show() {
            System.out.println("爸爸");
        }
    }
    
    class Cat extends Animal {
        int age = 2;
    
        public void eat() {
            System.out.println("猫爱吃鱼");
        }
    
        @Override
        public void show() {
    
            System.out.println("儿子女儿");
        }
    }
    运行结果:
    猫爱吃鱼
    儿子女儿
    2
    猫爱吃鱼
    5
    儿子女儿
    
    Process finished with exit code 0
    
    1. 多态的形式访问成员变量 访问的都是父类的变量
    2. 静态方法多态 依然遵循父类
  • 多态的好处

    1. 提高代码的扩展性
    2. 提高代码的维护性
package com.westos.x0;
import com.westos.Test;
public class Dt {
    public static void main(String[] args) {
        C c = new C();
        Test.testAnimal(c);
        D d = new D();
        Test.testAnimal(d);
    }
}
package com.westos.x0;

public class A {
    public void eat() {
        System.out.println("吃东子");
    }
}
package com.westos.x0;
public class C extends A {
    @Override
    public void eat() {
        super.eat();
        System.out.println("猫爱吃鱼");
    }
}
package com.westos.x0;
public class D extends A {
    @Override
    public void eat() {
        super.eat();
        System.out.println("狗不理");
    }
}
package com.westos;
import com.westos.x0.A;
public class Test {
    private Test() {
    }
    public static void testAnimal( A an) {
        an.eat();
    }
}
运行结果:
吃东子
猫爱吃鱼
吃东子
狗不理

Process finished with exit code 0
  1. 父类引用指向了类对象
  2. 多态形式调用成员吃饭方法
  • 多态的弊端 不能调用子类特有的功能
    • 通过向下转型解决此问题

孔子装爹

  • Java培训特别火,很多人来请孔子爹去讲课,这一天孔子爹被请走了 但是还有人来请,就剩孔子在家玩游戏,价格还挺高。孔子一想,我是不是可以考虑去呢? 然后就穿上爹的衣服,带上爹的眼睛,粘上爹的胡子 就开始装爹 实际讲的是论语 讲完之后 回到家 觉得假扮太累了 所以卸下装扮 做回他自己 愉快的玩游戏去了
public class Die {
    int age=68;
    public void teach(){
        System.out.println("传授JAVA");
    }
}
public class KongZi extends Die{
    int age=68;
    public void teach(){
        System.out.println("贴胡子");
        System.out.println("换衣服");
        System.out.println("假装爹去传授lol");
    }
    public void game(){
        System.out.println("玩游戏");
    }
}
public class KunZiZhuangDie {
    public static void main(String[] args) {
        Die kongzi=new KongZi();
        System.out.println(kongzi.age);
        kongzi.teach();
        KongZi kz=(KongZi) kongzi;
        kz.game();
    }
}
运行结果:
68
贴胡子
换衣服
假装爹去传授lol
玩游戏

Process finished with exit code 0
  1. 向上转型 父类引用指向子对象

抽象类

  • 抽取所有子类的共性功能 但是不给出 共性功能的具体实现 而是交给子类根据自身的特性做不同的具体实现

  • abstract 抽象 可以修饰类 可以修饰方法

  • 抽象类的语法特点

    1. 抽象类中 可以没有抽象方法 也可以有抽象方法

    2. 一个类中 一旦有了抽象方法 此类就必须为抽象类

    3. 抽象类是不能直接实例化的 但是 我们可以采用多态的形式来间接实例化

      public class Test {
          public static void main(String[] args) {
           Fu fu=new Zi();
          }
      }
      abstract class Fu{
          int num=33;
          final int numx=777;
          public Fu(){
              System.out.println("爸爸的构造方法");
          }
      
      }
      class Zi extends Fu {
          public Zi() {
              System.out.println("爸爸的构造方法");
          }
      }
      运行结果:
      爸爸的构造方法
      儿子的构造方法
      
      Process finished with exit code 0
      
    4. 抽象类中的所有抽象方法 强制子类必须重写

    5. 抽象类的子类 有两种选择

      • 选择一 重写抽象类中的所有抽象方法
      • 选择二 将子类自身设为抽象类 不推荐
    6. 抽象方法有无都合理的原因

      • 非抽象方法 子类直接继承使用 提高代码的复用性
      • 抽象方法 子类必须重写 强制要求子类做的事情
    public class ChouXiang {
        public static void main(String[] args) {
    
            Cat cat = new Cat();
            cat.eat();
            cat.sleep();
            Dog dog = new Dog();
            dog.eat();
            dog.sleep();
    
        }
    }
    
    abstract class Animal {
        public abstract void eat();
    
        public abstract void sleep();
    }
    
    class Cat extends Animal {
        @Override
        public void eat() {
            System.out.println("探鱼");
        }
    
        @Override
        public void sleep() {
            System.out.println("白天睡觉");
        }
    }
    
    class Dog extends Animal {
        @Override
        public void eat() {
            System.out.println("排骨");
        }
    
        @Override
        public void sleep() {
            System.out.println("晚上睡觉");
        }
    }
    运行结果:
    探鱼
    白天睡觉
    排骨
    晚上睡觉
    
    Process finished with exit code 0
    
  • 抽象类有构造方法 作用:用于子类访问父类数据时的初始化

public abstract class Person {
    public abstract void  eat();
    public abstract void  sleep();
}
public class Teacher extends Person {
    @Override
    public void eat() {
        System.out.println("老师爱吃清汤面");
    }

    @Override
    public void sleep() {
        System.out.println("晚上早早睡觉");
    }
    public void zaoCan() {
        System.out.println("早起做早餐");
    }
}
public class Student extends Person {
    @Override
    public void eat() {
        System.out.println("学生爱吃排骨");
    }

    @Override
    public void sleep() {
        System.out.println("晚上不睡觉");
    }
    public void game() {
        System.out.println("熬夜打游戏");
    }
}
public class MyTest {
    public static void main(String[] args) {
        Person p=new Teacher();
        p.eat();
        p.sleep();
        ((Teacher)p).zaoCan();
        Person s=new Student();
        s.eat();
        s.sleep();
        ((Student)s).game();
    }
}
运行结果:
老师爱吃清汤面
晚上早早睡觉
早起做早餐
学生爱吃排骨
晚上不睡觉
熬夜打游戏

Process finished with exit code 0
  1. 父类并不清楚子类吃饭功能的具体实现 所以没必要给出共性功能的具体实现
  2. 抽象类无法实例化对象
  • 员工与经理实例

    public class Ren {
        public static void main(String[] args) {
            Person p = new Employee("马化某", 1001, 5000);
            System.out.println(p.getName());
            System.out.println(p.getNum());
            System.out.println(p.getSalary());
            ((Employee)p).lei();
            p.work();
            Person x = new Manager("丁某", 6666, 15000, 6000);
            System.out.println(x.getName());
            System.out.println(x.getNum());
            System.out.println(x.getSalary());
            ((Manager)x).hun();
            x.work();
        }
    }
    
    abstract class Person {
        private String name;
        private int num;
        private double salary;
        public Person() {
        }
        public Person(String name, int num, double salary) {
            this.name = name;
            this.num = num;
            this.salary = salary;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getNum() {
            return num;
        }
        public void setNum(int num) {
            this.num = num;
        }
        public double getSalary() {
            return salary;
        }
        public void setSalary(double salary) {
            this.salary = salary;
        }
        public abstract void work();
    }
    
    class Employee extends Person {
        public Employee(String name, int num, double salary) {
            super(name, num, salary);
        }
        @Override
        public void work() {
            System.out.println("上班混日子 就为拿工资");
        }
        public void lei() {
            System.out.println("累成傻狗");
        }
    }
    
    class Manager extends Person {
        private double bonus;
        public Manager(String name, int num, double salary, double bonus) {
            super(name, num, salary);
            this.bonus = bonus;
        }
        @Override
        public void work() {
            System.out.println("公司耍威风 舒服");
        }
        public void hun() {
            System.out.println("出差混日子");
        }
    }
    运行结果:
    马化某
    1001
    5000.0
    累成傻狗
    上班混日子 就为拿工资
    丁某
    6666
    15000.0
    出差混日子
    公司耍威风 舒服
    
    Process finished with exit code 0
    

一:一个类没有抽象方法设置成抽象类的原因是 不想让外界创建这个类的对象

二:final private static与abstract不能共存

  1. final 方法子类不能重写
  2. private 不能继承 无法重写
  3. static 方法不参与重写

接口

  • 接口 是为了定义一些额外扩展的的功能 哪些事物想要具备这些功能 可以对接口进行实现

  • 接口的特点

    1. 接口不能实例化
  • 接口的子类有两种选择

    1. 重写接口中的所有方法
    2. 可以是抽象类 但是意义不大
  • 接口中的成员特点

    1. 接口中的成员变量 全部都是公共的静态常量 前面存在默认修饰符 public static final

    2. JDK1.7之前接口中的方法 全部都是抽象方法 不存在非抽象方法 方法前面默认 public abstract

    3. JDK1.8之后 允许给出方法的具体实现 但是这个方法得用default来修饰 同时也允许接口中定义静态方法

      public interface MyInterface {
           public  default void game (){
               System.out.println("Tom猫打游戏很帅"); }}
      
    4. 接口中没有构造方法

    5. 接口不能实例化

  • 类与类之间的关系 extends 继承关系 并且是单继承

  • 类与接口之间的关系 implement 实现关系 并且可以多实现

public abstract class Animal {
    public abstract void eat();
    public abstract void sleep();
    public abstract void work();

}
public interface MyInterface {
     public abstract void game ();
}
public class TomCat extends Animal implements MyInterface {
    @Override
    public void eat() {
        System.out.println("Tom猫吃骨头");
    }

    @Override
    public void sleep() {
        System.out.println("Tom猫熬夜");
    }

    @Override
    public void work() {
        System.out.println("Tom猫懒得工作");
    }


    public void game() {
        System.out.println("Tom猫打游戏很帅");
    }
}
public class Cat extends Animal {

    @Override
    public void eat() {
        System.out.println("吃鱼");
    }

    @Override
    public void sleep() {
        System.out.println("睡觉");
    }

    @Override
    public void work() {
        System.out.println("被伺候");
    }

}
public class Testxdxd {
    public static void main(String[] args) {
        Animal a=new Cat();
        a.eat();
        a.work();
        a.sleep();
        Animal a1=new TomCat();
        a1.eat();
        a1.work();
        a1.sleep();
        MyInterface myInterface= (MyInterface) a1;
        ((MyInterface) a1).game();
    }
}
运行结果:
吃鱼
被伺候
睡觉
Tom猫吃骨头
Tom猫懒得工作
Tom猫熬夜
Tom猫打游戏很帅
Process finished with exit code 0

待续…

猜你喜欢

转载自blog.csdn.net/cx9977/article/details/107536139
今日推荐