美文网首页
Java 基础 23 抽象类

Java 基础 23 抽象类

作者: 小熊先生很不开心 | 来源:发表于2018-02-01 10:47 被阅读2次

1.1 抽象类概述

  当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具回想前面我们的猫狗案例,提取出了一个动物类,这个时候我们是可以通过Animal a = new Animal()来创建动物对象的,其实这是不对的。为什么呢?因为,我说动物,你知道我说的是什么动物吗?只有看到了具体的动物,你才知道,这是什么动物。 所以说,动物本身并不是一个具体的事物,而是一个抽象的事物。只有真正的猫,狗才是具体的动物。同理,我们也可以推想,不同的动物吃的东西应该是不一样的,所以,我们不应该在动物类中给出具体体现,而是应该给出一个声明即可。在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。

1.1.1 案例代码

package com.itheima_01;

public class AnimalDemo {
    public static void main(String[] args) {
        /*
        Animal a = new Animal();
        a.eat();
        */
    }
}


package com.itheima_01;

public abstract class Animal {
    /*
    public void eat() {
        System.out.println("吃东西");
    }
    */
    
    //抽象方法
    public abstract void eat();
}

1.2 抽象类的特点

  抽象类和抽象方法必须用abstract关键字修饰

格式:

public abstract class 类名 {}
public abstract void eat();

抽象类不一定有抽象方法,有抽象方法的类一定是抽象类

抽象类不能实例化

那么,抽象类如何实例化呢?

按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。

抽象类的子类

要么是抽象类

要么重写抽象类中的所有抽象方法

2.2.1 案例代码

package com.itheima_02;
/*
 * 抽象类的特点:
 *      A:抽象类和抽象方法必须使用abstract关键字修饰
 *      B:抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
 *      C:抽象类不能实例化
 *          抽象类如何实例化呢?
 *          参照多态的方式,通过子类对象实例化。
 *      D:抽象类的子类
 *          要么重写抽象类中的所有抽象方法
 *          要么是抽象类
 */
public class AnimalDemo {
    public static void main(String[] args) {
        //创建对象
        //Animal a = new Animal();
        //按照多态的形式实例化抽象类
        Animal a = new Cat();
        a.eat();
        a.sleep();
    }
}
package com.itheima_02;

public abstract class Dog extends Animal {
    
}

package com.itheima_02;

public class Cat extends Animal {

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

}
package com.itheima_02;
//抽象类
public abstract class Animal {
    //抽象方法
    public abstract void eat();
    
    public void sleep() {
        System.out.println("睡觉");
    }
}

1.3 抽象类的成员的特点

  • 成员变量
    • 可以是变量
    • 也可以是常量
  • 构造方法
    • 有构造方法,但是不能实例化
    • 那么,构造方法的作用是什么呢?
  • 用于子类访问父类数据的初始化
  • 成员方法
    • 可以有抽象方法 限定子类必须完成某些动作
    • 也可以有非抽象方法 提高代码复用性

1.3.1案例代码

package com.itheima_03;
/*
 * 抽象类的成员特点:
 *      成员变量:
 *          有成员变量,成员变量可以是变量,也可以是常量。
 *      构造方法:
 *          有构造方法。
 *          抽象类中构造方法的作用?
 *              用于子类访问父类数据的初始化。
 *      成员方法:
 *          有成员方法,成员方法可以是抽象的,也可以是非抽象的。
 *          抽象方法:限定子类必须完成某些动作
 *          非抽象方法:提高代码的复用性
 */
public class PersonDemo {
    public static void main(String[] args) {
        Person p = new Student();
        p.show();
    }
}
package com.itheima_03;

public class Student extends Person {

    @Override
    public void eat() {
        System.out.println("学生吃米饭");
    }
    
}

package com.itheima_03;

public abstract class Person {
    private int age = 20;
    private final String country = "中国";
    
    public Person() {}
    
    public Person(int age) {
        this.age = age;
    }
    
    public void show() {
        age = 30;
        System.out.println(age);
        //country = "美国";
        System.out.println(country);
    }
    
    public abstract void eat();
}

1.4抽象类的练习之老师案例

  • 老师案例
    • 具体事物:基础班老师,就业班老师
    • 共性:姓名,年龄,讲课。

1.4.1案例代码


package com.itheima_04;
/*
 * 分析:从具体到抽象
 * 实现:从抽象到具体
 * 使用:使用的是具体的类的对象
 * 
 * 分析:
 * package com.itheima_04;
/*
 * 分析:从具体到抽象
 * 实现:从抽象到具体
 * 使用:使用的是具体的类的对象
 * 
 * 分析:
 *      基础班老师:
 *          成员变量:name,age
 *          构造方法:无参,带参
 *          成员方法:getXxx(),setXxx(),teach(){}
 *      就业班老师:
 *          成员变量:name,age
 *          构造方法:无参,带参
 *          成员方法:getXxx(),setXxx(),teach(){}
 * 
 *      抽象的老师类:
 *          成员变量:name,age
 *          构造方法:无参,带参
 *          成员方法:getXxx(),setXxx(),teach();
 */
public class TeacherDemo {
    public static void main(String[] args) {
        //使用的是具体的类的对象
        //BasicTeacher
        
        //多态形式的测试
        Teacher t = new BasicTeacher();
        t.setName("林青霞");
        t.setAge(30);
        System.out.println(t.getName()+"---"+t.getAge());
        t.teach();
        System.out.println("---------------------------");
        
        t = new BasicTeacher("林青霞", 30);
        System.out.println(t.getName()+"---"+t.getAge());
        t.teach();
    }
}       基础班老师:
 *          成员变量:name,age
 *          构造方法:无参,带参
 *          成员方法:getXxx(),setXxx(),teach(){}
 *      就业班老师:
 *          成员变量:name,age
 *          构造方法:无参,带参
 *          成员方法:getXxx(),setXxx(),teach(){}
 * 
 *      抽象的老师类:
 *          成员变量:name,age
 *          构造方法:无参,带参
 *          成员方法:getXxx(),setXxx(),teach();
 */
public class TeacherDemo {
    public static void main(String[] args) {
        //使用的是具体的类的对象
        //BasicTeacher
        
        //多态形式的测试
        Teacher t = new BasicTeacher();
        t.setName("林青霞");
        t.setAge(30);
        System.out.println(t.getName()+"---"+t.getAge());
        t.teach();
        System.out.println("---------------------------");
        
        t = new BasicTeacher("林青霞", 30);
        System.out.println(t.getName()+"---"+t.getAge());
        t.teach();
    }
}

package com.itheima_04;
//就业班老师
public class WorkTeacher extends Teacher {

    public WorkTeacher() {}
    
    public WorkTeacher(String name,int age) {
        super(name,age);
    }
    
    @Override
    public void teach() {
        System.out.println("就业班老师讲解JavaEE的内容");
    }

}

package com.itheima_04;
//基础班老师
public class BasicTeacher extends Teacher {

    public BasicTeacher() {}
    
    public BasicTeacher(String name,int age) {
        super(name,age);
    }
    
    @Override
    public void teach() {
        System.out.println("基础班老师讲解JavaSE的内容");
    }

}

package com.itheima_04;
//抽象的老师类
public abstract class Teacher {
    private String name;
    private int age;
    
    public Teacher() {}
    
    public Teacher(String name,int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
    //抽象方法
    public abstract void teach();
}

相关文章

  • Java 基础 23 抽象类

    1.1 抽象类概述   当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具回想前面我们的...

  • 学习笔记(一)

    Java基础 抽象类的意义http://blog.csdn.net/fengxuezhiye/article/de...

  • 2019Java工程师面试题汇总,全会的话月薪至少3W+

    Java基础知识 Java中==和equals和hashCode的区别int与integer的区别抽象类的意义接口...

  • Java 学习之路

    我认为的基础部分: java 基本的数据类型和循环,遍历等基础语句 java 的类与对象,还有对抽象类和接口的理解...

  • 近期Java高级工程师面试总结

    近期Java高级工程师面试总结 面试总结 Java基础 Hashtable和HashMap的区别。 抽象类与接口的...

  • 接口和抽象类有什么区别

    学习Java基础知识,打通面试关~十三接口与抽象类面试常客:谈谈你对抽象类和接口的理解 接口用interface修...

  • Java基础——抽象类

    参考资料 《Java语言程序设计(基础篇)》—— Y.Daniel Liang 前言 本人菜鸟,入IT只为当鼓励师...

  • Java基础-抽象类

    1.什么是抽象类: 我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须是抽象类。 2.抽...

  • Java基础---抽象类

    抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类...

  • 抽象画你是不可能会了 抽象类你还可以争取一下

    java零基础入门-面向对象篇(十二) 抽象类 抽象类这个玩意,理解起来费点劲。我们从字面意思开始吧。 抽象一词的...

网友评论

      本文标题:Java 基础 23 抽象类

      本文链接:https://www.haomeiwen.com/subject/uotdzxtx.html