zoukankan      html  css  js  c++  java
  • JAVA_SE基础——43.抽象类

    高手勿喷~

    抽象类:当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法的实现方式是无法确定的。例如定义Animal类时,shout()方法用于表示动物的叫声,但是针对不同的动物,叫声也是不同的,因此在shout()方法中无法准确描述动物的叫声。


    针对上面的情况,Java允许在定义方法时不写方法体,不包含方法体的方法为抽象方法,抽象方法必须使用abstract关键字来修饰,格式如下:

    abstract void shout();   //定义抽象方法shout()


    abstract表示抽象的,是最重要的一个修饰符,可以修饰类和方法。它们分别叫抽象方法抽象类,人们在认识事物的时候,会把具有相同特征和行为的事物归为一个抽象类。。  比如动物就是一个很抽线的概念。当得到动物的实例时,总是某个具体物种的实例。所以说,在需要某个抽象类的实例时,只能够用某个具体类的实例来代替。


    抽象类的应用场景:
    我们在描述一类事物的时候,发现该种事物确实存在着某种行为,
    但是这种行为目前是不具体的,那么我们可以抽取这种行为 的声明,但是
    不去实现该种行为,这时候这种行为我们称作为抽象的行为,我们就需要使用抽象类。

    抽象类的好处: 强制要求子类一定要实现指定的方法。


    抽象类要注意的细节:
    1. 如果一个函数没有方法体,那么该函数必须要使用abstract修饰,把该函数修饰成抽象 的函数。。
    2. 如果一个类出现了抽象的函数,那么该类也必须 使用abstract修饰。
    3. 如果一个非抽象类继承了抽象类,那么必须要把抽象类的所有抽象方法全部实现。
    4. 抽象类可以存在非抽象方法,也可以存在抽象的方法.
    5. 抽象类可以不存在抽象方法的。 
    6. 抽象类是不能创建对象的。
    疑问:为什么抽象类不能创建对象呢?
    因为抽象类是存在抽象方法的,如果能让抽象类创建对象的话,那么使用抽象的对象
    调用抽象方法是没有任何意义的。
    7. 抽象类是存在构造函数的,其构造函数是提供给子类创建对象的时候初始化父类的属性的。


    abstract不能与以下关键字共同修饰一个方法:
    1. abstract不能与private共同修饰一个方法。
    2. abstract 不能与static共同修饰一个方法。
    3. abstract 不能与final共同修饰一个方法。



    白话解释:说到明就是不具体的总类写成抽象类就可以了,例如有个动物园,里面有着各种各样的动物,有狗,有猫等等,,,你能让它们叫吗?它们的叫声一样吗?怎么具体让什么动物叫?


    这时,就应该想到abstract关键字,用来定义抽象类。。见实例1

    实例1

    //定义抽象类Zoo
    abstract Zoo{
    	//定义抽象方法shout()
    	abstract void shout();
    }


    P.S.

    在定义抽象类的时候要注意,包含抽象方法的类必须声明为抽象类,但是抽象类可以不包含任何抽象方法,只需使用abstract关键字即可。。  最值得注意的是:抽象类不可以被实例化的,因为抽象类中有可能包含抽象方法,抽象方法时没有方法体的,不可以被调用。如果真的想调用抽象类定义的方法,则需要创建一个子类,在子类中将抽象类中的抽象方法进行实现。     见实例2


    实例2

    //定义抽象类Zoo
    abstract class Zoo{
    	//定义抽象方法shout()
    	abstract void shout();
    }
    //定义Dog类继承抽象类Zoo
    class Dog extends Zoo{
    	String name = "狗" ; 
    	//实现抽象方法shout()
    	public void shout(){
    		System.out.println(name+"的叫声:汪汪汪~~~");
    	}
    }
    //定义Cat类继承抽象类Zoo
    class Cat extends Zoo{
    	String name = "猫" ; 
    	//实现抽象方法shout()
    	public void shout(){
    		System.out.println(name+"的叫声:喵喵喵~~~");
    	}
    }
    //定义测试类
    class Demo1 
    {
    	public static void main(String[] args) 
    	{
    		System.out.println("welcome to Zoo");
    	 	//创建Dog类的实例对象
    		Dog dog = new Dog();
    		//调用dog对象的shout()方法
    		dog.shout();
    		//创建Cat类的实例对象
    		Cat cat = new Cat();
    		//调用cat对象的shout()方法
    		cat.shout();
    	}
    }
    运行结果:


     


    从运行结果可以看出,子类实现了父类的抽线方法后,可以正常进行实例化,并通过实例化对象调用方法。。


    交流学习企鹅:654249738



  • 相关阅读:
    JSP—简介
    Dream
    树状数组模板
    夜未央Test1题解
    夜未央Test1
    并查集模板
    给即将面临Noip的二班同学
    USACO chapter1
    二叉堆模板
    线段树模板
  • 原文地址:https://www.cnblogs.com/Jhaiha0/p/8465300.html
Copyright © 2011-2022 走看看