转:二十、java的抽象类
http://blog.csdn.net/liujun13579/article/details/7737667
现实世界中,人们表征世界时,会把现实世界中的很多类具有相同特征的事物归为一个抽象类。比如水果是许多植物果实的总称,我们可以定义一个苹果类、定义一个西瓜类,可以实例化一个苹果对象,可以实例化一个西瓜对象,我们也可以定义一个水果类,但是你无法实例化一个水果对象,因为水果的实例必定是某个具体的植物果实,这时候,水果类就是一个抽象类,水果类可以被苹果类继承扩展,可以被西瓜类继承扩展,这是水果类的唯一用途。
又比如,如果进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
抽象类的定义形式:
一般格式如下:
abstract class 类名{
类体
}
说明:
l 抽象类是不能直接实例化对象的类。也即抽象类不能使用new运算符去创建对象。
l 抽象类一般包括一个或几个抽象方法。所谓抽象方法需在abstract修饰符进行修饰,抽象方法只有方法的声明部分,没有具体的方法实现部分。抽象类的子类必须重写父类的抽象方法,才能实例子化,否则子类也是一个抽象类。
l 抽象类中不一定包含抽象方法,但是包含抽象方法的类必须说明为抽象类。
举例:Dog类继承于抽象类Animal。
abstract class Animal{
String name;
Animal(Stringname){ //非抽象方法
this.name=name;
}
void getname(){ //非抽象方法
System.out.println("Animal's name is"+name);
}
abstract void move(); // 抽象方法,用abstract 修饰
}
class Dog extends Animal{
intage;
Dog(String name,int age){
super(name);
this.age=age;
}
void move(){
System.out.println("Dog is running!");
}
void getage(){
System.out.println("Dog is"+age+" years old");
}
}
Public class AbstractDemo{
public static void main(String args[]){
Dogd=new Dog("wangwang",5);
d.move();
d.getname();
d.getage();
}
}
程序运行结果:
Dog is running!
Animal's name is wangwang
Dog is 5 years old
举例二、具有启动(startUp)方法的抽象车辆类Car,其每种具体子类都必须实现其自己的、专属于某种类型车辆的具体启动(startUp)方法
//定义抽象类Car
abstract class Car {
//定义抽象方法startUp
public abstract void startUp();
}
//定义抽象类Audi并使该类继承自Car
abstract class Audi extends Car{
//定义抽象方法turbo
public abstract void turbo();
}
//定义非抽象类Audi_A6继承自Audi
class Audi_A6 extends Audi{
//实现startUp方法
public void startUp() {
System.out.println("调用了奥迪A6的启动功能!!!");
}
//实现turbo方法
public void turbo() {
System.out.println("调用了奥迪A6的加速功能!!!");
}
}
//定义非抽象类Audi_A8继承自Audi
class Audi_A8 extends Audi{
//实现startUp方法
public void startUp(){
System.out.println("调用了奥迪A8的启动功能!!!");
}
//实现turbo方法
public void turbo(){
System.out.println("调用了奥迪A8的加速功能!!!");
}
}
public class AbstractClassDemo{
public static void main(String[] args) {
//创建Audi_A6对象并使该类引用a6指向该对象
Audi_A6 a6=new Audi_A6();
//调用Audi_A6对象中的方法
a6.startUp();
a6.turbo();
//创建Audi_A8对象并使该类引用a8指向该对象
Audi_A8 a8=new Audi_A8();
//调用Audi_A8对象中的方法
a8.startUp();
a8.turbo();
}
}
程序执行结果:
调用了奥迪A6的启动功能!!!
调用了奥迪A6的加速功能!!!
调用了奥迪A8的启动功能!!!
调用了奥迪A8的加速功能!!!
转:二十、java的抽象类的更多相关文章
- Java学习笔记二十:Java中的内部类
Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...
- day 25 二十五、抽象类、多态、鸭子、反射、异常处理
一.接口思想 1.接口:建立关联的桥梁,方便管理代码 python中没有接口语法 def jiao(): pass def chi(): pass def pao(): pass # 清晰知道操作的功 ...
- PHP学习笔记二十八【抽象类】
<?php //定义一个抽象类.主要用来被继承 //如果一个类继承了抽象类,则它必须实现该抽象类的所有抽象方法(除非它自己也是抽象类) // abstract class Animal{ pub ...
- 聊聊高并发(二十五)解析java.util.concurrent各个组件(七) 理解Semaphore
前几篇分析了一下AQS的原理和实现.这篇拿Semaphore信号量做样例看看AQS实际是怎样使用的. Semaphore表示了一种能够同一时候有多个线程进入临界区的同步器,它维护了一个状态表示可用的票 ...
- 【Java学习笔记之二十六】深入理解Java匿名内部类
在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
- JAVA基础知识总结:一到二十二全部总结
>一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...
- 转:二十一、详细解析Java中抽象类和接口的区别
转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...
- 三十二、Java图形化界面设计——布局管理器之CardLayout(卡片布局)
摘自 http://blog.csdn.net/liujun13579/article/details/7773945 三十二.Java图形化界面设计--布局管理器之CardLayout(卡片布局) ...
- 聊聊高并发(二十九)解析java.util.concurrent各个组件(十一) 再看看ReentrantReadWriteLock可重入读-写锁
上一篇聊聊高并发(二十八)解析java.util.concurrent各个组件(十) 理解ReentrantReadWriteLock可重入读-写锁 讲了可重入读写锁的基本情况和基本的方法,显示了怎样 ...
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...
随机推荐
- 理解C#中的“静态”
一.静态成员 1.通过static关键字修饰,是属于类,实例成员属于对象,在这个类第一次加载的时候,这个类下面的所有静态成员会被加载. 2.静态成员只被创建一次,所以静态成员只有一份,实例成员有多少个 ...
- sqlserver临时表排序问题
在2005和2008中,如果将有序的记录插入临时表,则从临时表查看出来的记录是有序的(不使用Order by也是有序状态) 但从2012开始,即使插入的记录集是有序的,查看出来的结果变得无序了,需要依 ...
- 浅谈Javase内存流程图
最近接触OOP面向对象,学习了OOP.this.super.package.extends还有override,整体来说如果不清楚内存的流程的话,对这些知识会很混淆,在老师的帮助下,花了一张图,能清楚 ...
- iOS 指纹解锁
目前常用的App支持指纹解锁的还不是很多,如果在你的项目中用一下是不是显得高大上呢? 废话不说多,干货- 1.在工程中添加LocalAuthentication.framework 2.在需要验证的c ...
- C语言-求1-20的阶乘的和(函数的递归)
// // main.c // C语言 // // Created by wanghy on 15/9/5. // Copyright (c) 2015年 wanghy. All rights ...
- JavaScript学习笔记--ES6学习(四) 字符串的扩展
ES6对字符串进行了一些扩展,主要表现在对Unicode 大于\uFFFF的字符的处理上. 1. ES6中字符的Unicode表示方法 在ES5中,字符串的Unicode表示方法: \uxxxx . ...
- 02_天气查询_socket方式模拟_单线程
[远程请求的B/S模式(客户端/服务器)] TCP: 是一种传输层协议,一种面向连接的协议.经过三次握手客户端和服务器端连接一个连接(通道).提供可靠的数据传输,该协议一般服务质量要求比较高的情况,T ...
- atc游戏bot
游戏玩起来太虐心了,就写了个bot来玩, 代码在此: git clone https://github.com/chenfengyuan/atc-bot-new.gitgit clone https: ...
- zlib压缩解压示例
#include <stdio.h> #include <string.h> #include <assert.h> #include "zlib.h&q ...
- c++ primer复习(三)
1 istream.ostream类型,cin.cout.cerr是istream或ostream类型的具体的对象,<<和>>是操纵符 getline函数的参数是istream ...