zoukankan      html  css  js  c++  java
  • java基础(十一)之抽象类和抽象函数

    1、抽象函数的语法特征
    2、抽象类的语法特征
    3、抽象类的作用

    抽象函数

    只有函数的定义,没有函数体的函数被称为抽象函数;

    abstract void func();
    

      

    抽象类

    使用abstract定义的类称为抽象类。

    abstract class Person{}
    

      

    注意:
    1、抽象类不能够生成对象;
    2、如果一个类当中包含有抽象函数,那么这个类必须被声明为抽象类。
    3、如果一个类当中没有抽象函数,这个类也可以被声明为抽象类。

    下面来用一个例子说明下:

    Person.java:

    abstract class Person{
    	String name;
    	int age;
    	
    	void intruduce(){
    		System.out.println("My name is" + name + ",my age is " + age);
    	}
    	abstract void eat();
    	
    }
    

      

    Chinese.java
    class Chinese extends Person{
    	void eat(){
    		System.out.println("use chopsticks.");
    	}
    }
    

      

    Test.java:

    public class Test{
    	public static void main(String[] args){
    		Person p = new Chinese();
    		p.eat();
    	
    	}
    }
    

      

    输出结果:

    PS C:UsersadminDesktopjava_code练习八> java Test
    use chopsticks.
    

      

    抽象类可以有构造函数

     Person.java

    abstract class Person{
    	String name;
    	int age;
    	Person(){
    		System.out.println("Person");
    	}
    	void intruduce(){
    		System.out.println("My name is" + name + ",my age is " + age);
    	}
    	abstract void eat();
    	
    }
    

      

    Chinese.java

    class Chinese extends Person{
    	Chinese(){
    		System.out.println("Chinese");
    	}
    	void eat(){
    		System.out.println("use chopsticks.");
    	}
    }
    

      

    输出结果:

    PS C:UsersadminDesktopjava_code练习八> java Test
    Person
    Chinese
    use chopsticks.
    

      

    这是因为会自动加上super();

    class Chinese extends Person{
    	Chinese(){
    		super();
    		System.out.println("Chinese");
    	}
    	void eat(){
    		System.out.println("use chopsticks.");
    	}
    }
    

      

     那么为什么要使用抽象类呢?

    可以使语义和语法的错误达成统一。

    class Printer{
    	void open(){
    		System.out.println("open");
    	}
    	void close(){
    		System.out.println("close");
    	}
    	void print(){
    	}
    	
    }
    

      

    class HPPrinter extends Printer{
    	void print(){
    		System.out.println("Using HPPrinter.");
    	}
    	
    }
    

      

    class CanonPrinter extends Printer{
    	void print(){
    		System.out.println("Using CanonPrinter.");
    	}
    }
    

      



    PS D:Javacode练习七> java Test
    open
    Using HPPrinter.
    close
    open
    Using CanonPrinter.
    close
    

      

     这样写是没问题的,但是如果开发者不是一个人的话,那么就会产生一个问题,在子类中没有复写函数的话,编译器并不会报错。因此修改

    abstract class Printer{
    	void open(){
    		System.out.println("open");
    	}
    	void close(){
    		System.out.println("close");
    	}
    	abstract void print();
    	
    }
    

      

      

    如果子类中没有复写函数的话,就会报如下的错误:

    PS D:Javacode练习七> javac .Test.java
    .HPPrinter.java:1: 错误: HPPrinter不是抽象的, 并且未覆盖Printer中的抽象方法print()
    class HPPrinter extends Printer{
    ^
    1 个错误
    

      

  • 相关阅读:
    Ubuntu1404: 将VIM打造为一个实用的PythonIDE
    事前备份胜于事后恢复
    做事不应当拘泥于既定的循例
    简单生活
    《犹太人思考术》读后感
    产品开发与运维的中心准则
    Awk使用一例:获取ASCII可见字符
    使用Sed和Awk实现批量文件的文本替换
    编写更少bug的程序的六条准则
    【JS新手教程】JS中的split()方法,拆分字符串
  • 原文地址:https://www.cnblogs.com/endust/p/11823298.html
Copyright © 2011-2022 走看看