zoukankan      html  css  js  c++  java
  • Java笔记(08):面向对象--抽象类

    1、抽象类概述:

     1 /*
     2     抽象类的概述:
     3         动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的。
     4         我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须是抽象类。
     5         
     6     抽象类的特点:
     7         A:抽象类和抽象方法必须用abstract关键字修饰
     8         B:抽象类中不一定有抽象方法,但是有抽象方法的类必须定义为抽象类
     9         C:抽象类不能实例化
    10             因为它不是具体的。
    11             抽象类有构造方法,但是不能实例化?构造方法的作用是什么呢?
    12             用于子类访问父类数据的初始化
    13         D:抽象的子类
    14             a:如果不想重写抽象方法,该子类是一个抽象类。
    15             b:重写所有的抽象方法,这个时候子类是一个具体的类。
    16             
    17         抽象类的实例化其实是靠具体的子类实现的。是多态的方式。
    18             Animal a = new Cat();
    19 */
    20 
    21 //abstract class Animal //抽象类的声明格式
    22 abstract class Animal {
    23     //抽象方法
    24     //public abstract void eat(){} //空方法体,这个会报错。抽象方法不能有主体
    25     public abstract void eat();
    26     
    27     public Animal(){}
    28 }
    29 
    30 //子类是抽象类
    31 abstract class Dog extends Animal {}
    32 
    33 //子类是具体类,重写抽象方法
    34 class Cat extends Animal {
    35     public void eat() {
    36         System.out.println("猫吃鱼");
    37     }
    38 }
    39 
    40 class AbstractDemo {
    41     public static void main(String[] args) {
    42         //创建对象
    43         //Animal是抽象的; 无法实例化
    44         //Animal a = new Animal();
    45         //通过多态的方式
    46         Animal a = new Cat();
    47         a.eat();
    48     }
    49 }

    2、抽象类的成员特点:

     1 /*
     2     抽象类的成员特点:
     3         成员变量:既可以是变量,也可以是常量。
     4         构造方法:有。
     5                     用于子类访问父类数据的初始化。
     6         成员方法:既可以是抽象的,也可以是非抽象的。
     7         
     8     抽象类的成员方法特性:
     9         A:抽象方法 强制要求子类做的事情。
    10         B:非抽象方法 子类继承的事情,提高代码复用性。
    11 */
    12 abstract class Animal {
    13     public int num = 10;
    14     public final int num2 = 20;
    15 
    16     public Animal() {}
    17     
    18     public Animal(String name,int age){}
    19     
    20     public abstract void show();
    21     
    22     public void method() {
    23         System.out.println("method");
    24     }
    25 }
    26 
    27 class Dog extends Animal {
    28     public void show() {
    29         System.out.println("show Dog");
    30     }
    31 }
    32 
    33 class AbstractDemo2 {
    34     public static void main(String[] args) {
    35         //创建对象
    36         Animal a = new Dog();
    37         a.num = 100;
    38         System.out.println(a.num);
    39         //a.num2 = 200;
    40         System.out.println(a.num2);
    41         System.out.println("--------------");
    42         a.show();
    43         a.method();
    44     }
    45 }

    案例:猫狗

      1 /*
      2     猫狗案例
      3         具体事物:猫,狗
      4         共性:姓名,年龄,吃饭
      5 
      6     分析:从具体到抽象
      7         猫:
      8             成员变量:姓名,年龄
      9             构造方法:无参,带参
     10             成员方法:吃饭(猫吃鱼)
     11             
     12         狗:
     13             成员变量:姓名,年龄
     14             构造方法:无参,带参
     15             成员方法:吃饭(狗吃肉)
     16             
     17         因为有共性的内容,所以就提取了一个父类。动物。
     18         但是又由于吃饭的内容不一样,所以吃饭的方法是抽象的,
     19         而方法是抽象的类,类就必须定义为抽象类。
     20         
     21         抽象动物类:
     22             成员变量:姓名,年龄
     23             构造方法:无参,带参
     24             成员方法:吃饭();
     25     
     26     实现:从抽象到具体
     27         动物类:
     28             成员变量:姓名,年龄
     29             构造方法:无参,带参
     30             成员方法:吃饭();
     31             
     32         狗类:
     33             继承自动物类
     34             重写吃饭();
     35             
     36         猫类:
     37             继承自动物类
     38             重写吃饭();
     39 */
     40 //定义抽象的动物类
     41 abstract class Animal {
     42     //姓名
     43     private String name;
     44     //年龄
     45     private int age;
     46     
     47     public Animal() {}
     48     
     49     public Animal(String name,int age) {
     50         this.name = name;
     51         this.age = age;
     52     }
     53     
     54     public String getName() {
     55         return name;
     56     }
     57     
     58     public void setName(String name) {
     59         this.name = name;
     60     }
     61     
     62     public int getAge() {
     63         return age;
     64     }
     65     
     66     public void setAge(int age) {
     67         this.age = age;
     68     }
     69     
     70     //定义一个抽象方法
     71     public abstract void eat();
     72 }
     73 
     74 //定义具体的狗类
     75 class Dog extends Animal {
     76     public Dog() {}
     77     
     78     public Dog(String name,int age) {
     79         super(name,age);
     80     }
     81     
     82     public void eat() {
     83         System.out.println("狗吃肉");
     84     }
     85 }
     86 
     87 //定义具体的猫类
     88 class Cat extends Animal {
     89     public Cat() {}
     90     
     91     public Cat(String name,int age) {
     92         super(name,age);
     93     }
     94     
     95     public void eat() {
     96         System.out.println("猫吃鱼");
     97     }
     98 }
     99 
    100 //测试类
    101 class AbstractTest {
    102     public static void main(String[] args) {
    103         //测试狗类
    104         //具体类用法
    105         //方式1:
    106         Dog d = new Dog();
    107         d.setName("旺财");
    108         d.setAge(3);
    109         System.out.println(d.getName()+"---"+d.getAge());
    110         d.eat();
    111         //方式2:
    112         Dog d2 = new Dog("旺财",3);
    113         System.out.println(d2.getName()+"---"+d2.getAge());
    114         d2.eat();
    115         System.out.println("---------------------------");
    116         
    117         Animal a = new Dog();
    118         a.setName("旺财");
    119         a.setAge(3);
    120         System.out.println(a.getName()+"---"+a.getAge());
    121         a.eat();
    122         
    123         Animal a2 = new Dog("旺财",3);
    124         System.out.println(a2.getName()+"---"+a2.getAge());
    125         a2.eat();
    126         
    127         //练习:测试猫类
    128     }
    129 }

    3、abstrace不能和哪些关键字共存:

     1 /*
     2 一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
     3     A:可以。
     4     B:不让创建对象。
     5 
     6 abstract不能和哪些关键字共存?
     7     private    冲突
     8     final    冲突    
     9     static    无意义
    10 */
    11 abstract class Fu {
    12     //public abstract void show();
    13     //非法的修饰符组合: abstract和private
    14     //private abstract void show();
    15     
    16     //非法的修饰符组合
    17     //final abstract void show();    
    18     
    19     //非法的修饰符组合
    20     static abstract void show();
    21     
    22     public static void method() {
    23         System.out.println("method");
    24     }
    25 }
    26 
    27 class Zi extends Fu {
    28     public void show() {}
    29 }
    30 
    31 class AbstractDemo3 {
    32     public static void main(String[] args) {
    33         Fu.method();
    34     }
    35 }
    如欢如殇 授以青春鲜活肢体奔忙 如思如忘 驱以老朽深沉灵魂冥想 始自情热激荡 从未敢终于世事炎凉 无能执手相望 无法去尝试结发同床 无力至心死身僵 一息坚强 ------ 我一直没有放弃,如果你也能看到 修身 修禅
  • 相关阅读:
    Data Structure 之 KMC字符串匹配算法
    网站建站流程
    常用算法稳定性分析
    VSS错误:The Sourcesafe Web service cannot be accessed at the specified address
    Data Struture 之 指针
    Windows 之 CMD命令
    Data Structure 之 算法设计策略
    Data Structure 之 最优二叉树
    板级支持包(BSP)
    JPEG
  • 原文地址:https://www.cnblogs.com/lz2lhy/p/6883573.html
Copyright © 2011-2022 走看看