zoukankan      html  css  js  c++  java
  • 抽象类的基本使用(基本概念)

    抽象类的定义语法

    抽象类可以直接产生实例化对象,并且在普通类之中包含有构造方法、普通方法、static方法、常量、变量的内容。而所谓的抽象类就是指在普通类的结构里面增加抽象方法的组成部分
    所有的普通方法上面都会有一个"{}",这个表示方法体,有方法体的方法一定可以被对象直接使用。而抽象方法指的是没有方法体的方法,同时抽象,现时抽象方法还必须使用abstract关键字进行定义
    拥有抽象方法的类一定属于抽象类,抽象类要使用abstract声明

    定义抽象类

    abstract class A{ // 定义一个抽象类
    	public void print(){ // 普通方法
    		System.out.println("存在普通方法");
    	}
    	// 此方法并没有方法体的声明,并且存在有abstract关键字,表示抽象方法
    	public abstract void func();
    }
    
    
    public class testDemo{
    	public static void main(String args[]){
    		A a = new A(); // A是抽象的,无法被实例化
    		a.print();
    		a.func();
    	}
    }
    

    使用抽象类

    root@079a25844567:/opt/lixinghua/OOP# javac testDemo.java 
    Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
    testDemo.java:12: error: A is abstract; cannot be instantiated
    		A a = new A();
    		      ^
    1 error
    

    类A 是抽象的,不能被实例化
    不能实例化原因:当一个类的对象被实例化之后,就意味着这个对象可以调用类中的属性和方法了,但是在抽象类里面存在抽象方法,抽象方法没有方法体,没有方法体的方法不能被调用,不能被调用就无法产生实例化对象
    对于抽象类的使用原则如下:
    抽象类必须有子类,即:每一个抽象类一定要被子类所继承
    抽象类的子类必须要覆写抽象类之中的全部抽象方法(强制子类覆写)
    抽象类的对象实例化需要依靠子类完成,采用向上转型的方式处理

    实例化子类(错误示例)

    abstract class A{ // 定义一个抽象类
    	public void print(){ // 普通方法
    		System.out.println("存在普通方法");
    	}
    	// 此方法并没有方法体的声明,并且存在有abstract关键字,表示抽象方法
    	public abstract void func();
    }
    
    // 一个子类只能够继承一个抽象类,属于单继承局限
    class B extends A{ // B类是抽象类的子类并且是一个普通类
    
    }
    
    public class testDemo{
    	public static void main(String args[]){
    	}
    }
    

    子类报错

    B不是抽象的,未覆写A中的抽象方法func()

    root@079a25844567:/opt/lixinghua/OOP# javac testDemo.java
    Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
    testDemo.java:10: error: B is not abstract and does not override abstract method func() in A
    class B extends A{ // B类是抽象类的子类并且是一个普通类
    ^
    1 error
    

    实例化子类(正确示例)

    abstract class A{ // 定义一个抽象类
    	public void print(){ // 普通方法
    		System.out.println("存在普通方法");
    	}
    	// 此方法并没有方法体的声明,并且存在有abstract关键字,表示抽象方法
    	public abstract void func();
    }
    
    // 一个子类只能够继承一个抽象类,属于单继承局限
    class B extends A{ // B类是抽象类的子类并且是一个普通类
    	public void func(){
    		System.out.println("Hello world");
    	}
    
    }
    
    public class testDemo{
    	public static void main(String args[]){
    		A a = new B(); // 向上转型
    		a.func(); // 被子类所覆写过的方法
    	}
    }
    

    输出结果

    root@079a25844567:/opt/lixinghua/OOP# javac testDemo.java
    Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
    root@079a25844567:/opt/lixinghua/OOP# java testDemo     
    Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
    Hello world
    

    总结

    1.抽象类的继承子类里面会有明确的方法覆写要求,而普通类并没有
    2.抽象类只比普通类多了一些抽象方法定义,其它的组成部分与普通类完全一样
    3.普通类对象可以直接实例化,但是抽象类的对象必须经过向上转型才可以得到实例化对象
    虽然一个子类可以继承任意的一个普通类,可是从开发的实际要求来讲,普通不要继承另外一个普通类,只能继承抽象类
  • 相关阅读:
    浏览网页时看到一个把字符串偶数位转化为大写字母的问题,小小白也来班门弄斧尝试一下。
    MFC的连续存储 永久保存(串行化)两篇
    MFC打印和打印预览功能
    桌面linux系统和嵌入式linux系统的不同点
    Ubuntu 和linux的关系
    YUV YPbPr YCbCr CCIR 601 CCIR 656
    推荐几个学习linux的国外著名论坛网站
    使Android开发方便快捷的8个好工具
    VMware网络配置详解
    DSP 定点小数运算
  • 原文地址:https://www.cnblogs.com/anyux/p/11939874.html
Copyright © 2011-2022 走看看