Java中abstract是什么?作用是什么?如何使用? ——关键字abstract

abstract

引出-案例

public class Demo1 {
    public static void main(String[] args) {
        Shape shape = new Shape();//对象 在现实生活中存在吗? 高度抽象的类

        //在现实中 存在的对象都是其 子类的对象
    }
}

abstract class  Shape{
    //图形类
    // 以下的这两个方法 的方法实现 不写不行 写了没有 --> 尴尬

    //抽象方法
    public abstract double area();
    public abstract   double girth();

    //非抽象方法
    public void m(){
        System.out.println("我是一个非抽象方法");
    }

    //构造方法
    public Shape(){
        System.out.println("我是抽象类中的构造方法");
    }
}

概述

 抽象的意思

可以修饰的内容

  1、类

  2、方法

抽象类

概念: 被 abstract 修饰的类称为抽象类
语法: 
public abstract class 抽象类类名{}

抽象方法

抽象⽅法 : 被abstract 修饰的⽅法
语法: 
  访问修饰符 abstract 返回值类型 ⽅法名(参数列表);
  abstract 访问修饰符 返回值类型 ⽅法名(参数列表);

特点

 1、当⼀个类中存在抽象⽅法 那么这个类也必须是抽象的

 2、⼀个抽象类中可以有抽象⽅法也可以有⾮抽象⽅法(抽象类中可以定义任何的成员  属性  构造方法  成员方法 抽象方法)

 3、如果⼀个类继承了抽象类,这个类如果不想成为抽象类,那么这个类必须实现抽象类中的所有抽象⽅法

 4、抽象类不能创建对象,但是可以声明引⽤,抽象类的对象是存在的,是由⼦类创建⼦类对象时调⽤⽗类构造⽅法创建的,是⽆法⾃⼰⼿动去new 抽象类的对象的

 5、private 和 abstract 不同同时修饰方法 因为矛盾 

特点-案例

  //案例1: 关于特点3;

  public class Demo1 {
      public static void main(String[] args) {
  
    }
  }
  
  //定义一个抽象类
  abstract  class  TestAbstract{
  
      //构造方法
  
      public TestAbstract() {
          System.out.println("我是抽象类中的构造方法");
      }
  
  
      //定义抽象方法
  
      public abstract void m1();
  
      public abstract void m2();
  
      //定义非抽象方法
      public void m3(){
          System.out.println("我是抽象类中的非抽象方法 m3");
      }
  
  }
  
  //定义一个类 继承 抽象类
  abstract class TestClass extends  TestAbstract{
      //当子类成为抽象类的时候 就没有必要去实现 m1 和 m2 这两个抽象方法了
  }
  
  //案例2: 关于特点3
  
  public class Demo1 {
      public static void main(String[] args) {
          TestClass testClass = new TestClass();
  
          testClass.m3();//m3 非抽象方法被继承了
      }
  }
  
  //定义一个抽象类
  abstract  class  TestAbstract{
  
      //构造方法
  
      public TestAbstract() {
          System.out.println("我是抽象类中的构造方法");
      }
  
  
      //定义抽象方法
  
      public abstract void m1();
  
      public abstract void m2();
  
      //定义非抽象方法
      public void m3(){
          System.out.println("我是抽象类中的非抽象方法 m3");
      }
  
  }
  
  //定义一个类 继承 抽象类
  class TestClass extends  TestAbstract{
  
      public  TestClass(){
          super();
      }
  
      @Override
      public void m1() {
          System.out.println("我是子类重写抽象类后的m1");
      }
  
      @Override
      public void m2() {
          System.out.println("我是子类重写抽象类后的m3");
      }
  
      //重写 m3 方法
  
      @Override
      public void m3() {
          System.out.println("我是子类重写抽象类的非抽象方法 m3");
      }
  }
  
  //案例3: 关于特点4
  public class Demo1 {
      public static void main(String[] args) {
         //TestAbstract testAbstract;//声明引用
          // TestAbstract testAbstract = new TestAbstract();// 不能创建抽象类的对象
  
          //抽象类的对象存在
  
          TestClass testClass = new TestClass();
          testClass.m3();
      }
  }
  
  //定义一个抽象类
  abstract  class  TestAbstract{
      int a = 10;
  
      //构造方法
  
      public TestAbstract() {
          System.out.println("我是抽象类中的构造方法");
      }
  
  
      //定义抽象方法
  
      public abstract void m1();
  
      public abstract void m2();
  
      //定义非抽象方法
      public void m3(){
          System.out.println("我是抽象类中的非抽象方法 m3");
      }
  
  }
  
  //定义一个类 继承 抽象类
  class TestClass extends  TestAbstract{
      int a = 20;
  
      public  TestClass(){
          super();
      }
  
      @Override
      public void m1() {
          System.out.println("我是子类重写抽象类后的m1");
      }
  
      @Override
      public void m2() {
          System.out.println("我是子类重写抽象类后的m3");
      }
  
      //重写 m3 方法
  
      @Override
      public void m3() {
          System.out.println(a);
          System.out.println(super.a);//super 当前类的直接父类对象的引用
          System.out.println("我是子类重写抽象类的非抽象方法 m3");
      }
  }
  
  //案例4:
 
  public class Demo1 {
      public static void main(String[] args) {
         //TestAbstract testAbstract;//声明引用
          // TestAbstract testAbstract = new TestAbstract();// 不能创建抽象类的对象
  
          //抽象类的对象存在
  
  //        TestClass testClass = new TestClass();
  //        testClass.m3();
  
          TestAbstract testAbstract = new TestClass();// 父类引用指向子类对象
  
          testAbstract.m1();
          testAbstract.m2();
          testAbstract.m3();
      }
  }
  
  //定义一个抽象类
  abstract  class  TestAbstract{
      int a = 10;
  
      //构造方法
  
      public TestAbstract() {
          System.out.println("我是抽象类中的构造方法");
      }
  
  
      //定义抽象方法
  
      public abstract void m1();
  
      public abstract void m2();
  
      //定义非抽象方法
      public void m3(){
          System.out.println("我是抽象类中的非抽象方法 m3");
      }
  
  }
  
  //定义一个类 继承 抽象类
  class TestClass extends  TestAbstract{
      int a = 20;
  
      public  TestClass(){
          super();
      }
  
      @Override
      public void m1() {
          System.out.println("我是子类重写抽象类后的m1");
      }
  
      @Override
      public void m2() {
          System.out.println("我是子类重写抽象类后的m2");
      }
  
      //重写 m3 方法
  
      @Override
      public void m3() {
          System.out.println(a);
          System.out.println(super.a);//super 当前类的直接父类
          System.out.println("我是子类重写抽象类的非抽象方法 m3");
      }
  
      public void m4(){
          System.out.println("我是子类特有的方法m4");
      }
  }
  
  

模版设计模式

设计模式

设计模式: 就是在实际开发中,总结的一套解决问题的固定套路,经过总结,最后就形成了设计模式  23种.

模版设计模式

把抽象类整体看成是一个模板,模板中不能决定的东西使用抽象方法表示,让使用模板的类【抽象类的子类】去重写抽象方法实现需求
设计模式案例
    模拟一个用天然气做热菜的场景  
    
    	开火 
    	
    		//确定不了  ----> 使用抽象方法表示
    	关火 
    
 
    public class Demo1 {
        public static void main(String[] args) {
            Case tomatoEgg = new TomatoEgg();
            tomatoEgg.doFood();
        }
    }
    
    abstract  class Case{
        //做菜的方法
        public void doFood(){
            onFire();
            // 不能确定的步骤
            perpareVegetable();
            shaoYou();
            makeType();
            offFire();
    
        }
    
        // 备菜
        public abstract void perpareVegetable();
        // 烧油
        public abstract  void shaoYou();
        // 做法
        public abstract  void makeType();
    
    
        //做热菜 确定的方法
        public void onFire(){
            System.out.println("开火");
        }
    
        public void offFire(){
            System.out.println("关火");
        }
    }
    
    //做不同的菜
    class TomatoEgg extends  Case{
    
        @Override
        public void perpareVegetable() {
            System.out.println("准备西红柿 切成块");
            System.out.println("准备鸡蛋 打成蛋液");
            System.out.println("准备葱姜蒜");
        }
    
        @Override
        public void shaoYou() {
            System.out.println("使用的是橄榄油加 500g");
        }
    
        @Override
        public void makeType() {
            System.out.println("使用的是爆炒的方法");
        }
    }
    
posted @ 2021-04-13 19:17  泰初  阅读(3911)  评论(0编辑  收藏  举报