• 抽象类


                                           抽象类

    一、抽象类的定义与使用

    1.抽象类的定义

         在普通类的基础上扩充一些抽象方法(抽象方法是只声明而未实现的方法,即没有方法体);所有的抽象方法用abstract关键字定义,并且抽象方法所在的类也要用abstract修饰表示抽象类。

        抽象类中包含抽象方法,抽象方法不包含方法体,所以抽象类不能直接产生实例化对象。

    abstract class Person{

    private String name;//属性

    //普通方法

    public void setName(String name){

    this.name = name;

    }

    public String getNmae(){

    return this.name;

    }

    //抽象方法,无方法体

    public abstract void getInfo();

    }

    使用原则:

    1.所有抽象类都必须含有子类;

    2.抽象类的子类不是抽象类,必须覆写抽象类的所有抽象方法;

    3.抽象类的子类可以使用对象多态性利用子类对其实例化;

    4.private和abstract 不能同时使用(因为private为私有变量不能被覆写,而abstract必须要被子类所覆写)。

     

    抽象类的使用:

    abstract class Person{

    private String name;//属性

    //普通方法

    public void setName(String name){

    this.name = name;

    }

    public String getNmae(){

    return this.name;

    }

    //抽象方法,无方法体

    public abstract void getInfo();

    }

    class Student extends Person{

    //对父类的getInfo()方法进行覆写

    public void getInfo(){

    System.out.println("我是一个学生");

    }

    }

    class Test6{

    public static void main(String[] args) {

    Person per = new Student();

    per.getInfo();//被子类所覆写的方法

    }

    }

     

     

    2.抽象类的相关规定

    a.抽象类只是比普通类多了抽象方法,所以在抽象类中也可包含构造方法,并且子类遵循对象实例化的流程实例化子类对象一定先调用父类对象

    //父类中只含无参构造

    abstract class Person{

    private String name;//属性

    //构造方法(无参构造)

    public Person(){

    System.out.println("我是Person类的无参构造");

    }

    //普通方法

    public void setName(String name){

    this.name = name;

    }

    public String getNmae(){

    return this.name;

    }

    //抽象方法,无方法体

    public abstract void getInfo();

    }

    class Student extends Person{

        ///无参构造

        public Student(){

         System.out.println("我是Student类的无参构造");

        }

    //对父类的getInfo()方法进行覆写

    public void getInfo(){

    //空实现

    }

    }

    class Test6{

    public static void main(String[] args) {

    new Student();

    }

    }

     

    若父类中不含无参构造,必须在子类构造中用super指明调用那个构造方法

        b.对象实例化操作:进行类加载->进行类对象的空间开辟->进行类对象中的属性初始化(构造方法)

    abstract class A{

    //A的无参构造函数

    public A(){//3、调用构造

    this.print();//4、调用被子类覆写的方法

    }

    //抽象方法

    public abstract void print();

    }

    class B extends A{

    private int num = 20;

    public B(int num){//2、调用子类的实例化对象

    super();//3、调用父类的无参构造

    this.num = num;//7、为类中属性初始化

    }

    public void print(){//5、此时子类对象的属性还没有被初始化

    System.out.println(this.num);//6、对应其数据类型的默认值

    }

    }

    public class Test6{

    public static void main(String[] args) {

    A a = new B(100);//1、对子类进行对象的实例化

    a.print();

    }

    }

     

    c.抽象类中允许不定义任何的抽象方法,但是此时的抽象类仍然无法创建实例化对象。

    abstract class A{

    public void print(){

    //普通方法,空实现

    }

    }

    public class Test6{

    public static void main(String[] args) {

    A a = new A();//错误,A是抽象类,无法实例化

    }

    }

     

    d.抽象类不能使用final修饰,因为final修饰的类不能有子类,而抽象类必须有子类;抽象方法也不能用private修饰,因为抽象方法需要被覆写。

    e.抽象类也可分为内部抽象类和外部抽象类,内部抽象类可以使用static定义来描述外部抽象类。

    //外部抽象类不可以使用static修饰

    static abstract class A{

    public abstract void Print1();

    abstract class B{

    public abstract void Print2();

    }

    }

     

    class C extends A{

    public void Print1(){

    //空实现

    }

    class D extends B{

    public void Print2(){

     

    }

    }

    }

    public class Test6{

    public static void main(String[] args) {

    A a = new C();

    }

    }

     

    //内部抽象类可以使用static修饰

    abstract class A{

    public abstract void Print1();

    static abstract class B{

    public abstract void Print2();

    }

    }

     

    class C extends A.B{

            //public void Print1(){

    //空实现}

    public void Print2(){

    System.out.println("haha");

    }

    }

    public class Test6{

    public static void main(String[] args) {

    A.B b = new C();

    b.Print2();

    }

    }

     

    二、抽象类的应用——模板设计模式

    抽象类的特点:

    强制规定了子类的实现结构

    还可起到模板的作用。

    例:人=吃饭+睡觉+工作

    =吃饭+睡觉

    机器人=吃饭+工作

    //模板设计模式

    //先定义行为类

    abstract class Action{

    public static final int EAT = 1;

    public static final int SLEEP = 2;

    public static final int WORK =3;

    public void command(int cmd){

    switch(cmd){

    case EAT:

          this.eat();

          break;

    case SLEEP:

          this.sleep();

          break;

    case WORK:

          this.work();

          break;

       case EAT+SLEEP+WORK:

             this.eat();

             this.sleep();

             this.work();

             break;

    }

    }

    public abstract void eat();

    public abstract void sleep();

    public abstract void work();

    }

    //定义子类实现

    //1、人的实现

    class Person extends Action{

    public void eat(){

    System.out.println("人吃干净的饭菜");

    }

    public void sleep(){

    System.out.println("人困了躺在床上睡觉");

    }

    public void work(){

    System.out.println("我们现在的工作就是好好学习");

    }

    }

    //2、猪的实现

    class Pig extends Action{

    public void eat(){

    System.out.println("猪吃糠");

    }

    public void sleep(){

    System.out.println("猪总是在地上睡觉");

    }

    public void work(){

    //猪不工作

    }

    }

    //3、机器人的实现

    class Robot extends Action{

    public void eat(){

    System.out.println("机器人充电补充能量");

    }

    public void sleep(){

    //机器人不睡觉

    }

    public void work(){

    System.out.println("机器人可以不停歇的工作");

    }

    }

    //定义具体操作

    public class Test6{

    public static void fun(Action action){

    action.command(Action.EAT+Action.SLEEP+Action.WORK);

    }

    public static void main(String[] args) {

    fun(new Person());

    fun(new Pig());

    fun(new Robot());

    }

    }

     



  • 相关阅读:
    MySQL查询缓存
    MySQL复制相关参数详解
    MySQL复制机制
    MySQL数据库的多表查询操作
    MySQL数据库单表查询基本操作及DML语句
    Hadoop大数据系列汇总
    MySQL数据库之日志功能详解
    MySQL数据库扫盲
    MySQL数据库之数据类型及基本使用详解
    MySQL数据库之日志管理
  • 原文地址:https://www.cnblogs.com/edda/p/12602176.html
Copyright © 2020-2023  润新知