java面向对象(下)-抽象类
抽象类和抽象方法
抽象类和抽象方法必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法
抽象类和抽象方法的规则如下
1.抽象类和抽象方法必须要用abstract来修饰,抽象方法里可以没有方法体.
2.抽象类不能实例化,无法使用new关键字来调用构造器创建抽象类的实例.
3.抽象类可以包含成员变量,方法(普通方法和抽象方法都可以),构造器,初始化块,内部类(接口,枚举)5种成分,抽象类的构造器不能用与创建实例,主要用于被其子类调用.
4.含有抽象方法的类(包括直接定义了一个抽象方法;或者是继承了一个抽象父类,但是没有完全实现父类包含的抽象方法;或者是实现了一个接口,但是没有完全实现接口包含的抽象方法三种情况)只能被定义成抽象类.
定义抽象类只需要在类上面加关键字abstract,定义抽象方法只需要在普通方法上增加abstract修饰符,并把普通方法的方法体(也就是方法后面的花括号括起来的部分)全部去掉,并在方法后面增加分号即可.
抽象方法:public abstract void test();
普通方法:public void test(){}
示例代码:
package com.j1803.abstractTest;
public abstract class Shape {
{
System.out.println("执行Shape的初始化块");
}
private String color;
//定义计算周长的抽象方法
public abstract double calPerimeter();
//定义一个返回形状的抽象方法
public abstract String getType();
//构造函数,用于被子类调用.
public Shape() {}
public Shape(String color) {
System.out.println("执行Shape的构造器");
this.color=color;
}
}
package com.j1803.abstractTest;
public class Triangle extends Shape{
//定义三角形的三边
private double a;
private double b;
private double c;
//构造方法
public Triangle(String color, double a, double b, double c) {
super(color);
System.out.println("执行Triangle构造器");
this.a = a;
this.b = b;
this.c = c;
}
public static void main(String[] args) {
Shape s1=new Triangle("黑色",3,4,5);
System.out.println(s1.getType());
System.out.println(s1.calPerimeter());
}
//重写Shape类的计算周长公式
@Override
public double calPerimeter(){
return a+b+c;
}
//重写Shape类的返回形状的抽象方法
@Override
public String getType() {
return "三角形";
}
}
当使用abstract修饰时表明这个类只能被继承;当使用abstract修饰方法时,表明这个类必须由子类提供实现(即重写).final修饰的类和方法不能被继承和重写,因此final和abstract永远不能同时使用
abstract不能用于修饰成员变量,不能用于修饰局部变量,即没有抽象变量,没有抽象成员变量说法.
abstract不能用于修饰构造器,没有抽象构造器,抽象类里定义构造器只能是普通构造器
,static修饰一个方法时,表明这个方法属于这个类,通过类就可以调用这个方法,但如果该方法被定义成抽象方法,则将导致通过该类来调用该方法时出现错误(调用了一个没有方法体的方法肯定会引起错误),因此,static和abstract不能同时修饰某个方法,即没有所谓的类抽象方法..注:static和abstract并不是绝对互斥的,static和abstract虽然不能同时修饰某个方法,但它们可以同时修饰内部类
abstract关键字修饰的方法必须被其子类重写才有意义,否则这个方法将永远不会有方法体,因此abstract方法不能定义为private访问权限,即private和abstract不能同时修饰方法
======================================================
抽象类的作用:
抽象类作为子类的模板,避免了子类设计的随意性,抽象类体现的就是一种模板模式的设计.
模板模式范例2:抽象父类中,父类的普通方法依赖于一个抽象方法,而抽象方法则推迟到子类中提供实现
package com.j1803.abstractTest;
public abstract class SpeedMeter {
//转速
private double turnRate;
//无参构造方法
public SpeedMeter() {}
//把计算车轮周长的方法定义成抽象方法
public abstract double calGirth();
public double getTurnRate() {
return turnRate;
}
public void setTurnRate(double turnRate) {
this.turnRate = turnRate;
}
//定义计算速度的通用算法
public double getSpeed() {
//速度等于 周长*转速=============calGirth()为抽象方法
return calGirth()*turnRate;
}
}
package com.j1803.abstractTest;
public class CarSpeedMeter extends SpeedMeter{
private double radius;
public CarSpeedMeter(double radius) {
super();
this.radius = radius;
}
public static void main(String[] args) {
CarSpeedMeter csm=new CarSpeedMeter(0.34);
csm.setTurnRate(15);
System.out.println(csm.getSpeed());
}
@Override
public double calGirth() {
return radius*2*Math.PI;
}
}
SpeedMeter类提供了速度表的通用算法,但一些具体的实现细节则推迟到其子类CarSpeedMeter类中实现.这也是一种典型的模板模式
模板模式在面向对象的软件中很常见,其原理简单,实现也很简单,下面是两条简单规则.
1.抽象父类可以只定义需要使用的某些方法,吧不能实现的部分抽象成抽象方法,留给其子类去实现
2.父类中可能包含需要调用其他系列的方法,这些被调用方法既可以有父类实现,也可以由其子类实现,父类里提供的方法只是定义了一个通用算法,其实现也许并不完全由自身实现,而必须依赖于其子类的辅助
java面向对象(下)-抽象类的更多相关文章
- Java面向对象之抽象类,接口
抽象类: 含有抽象方法的类被声明为抽象类 抽象方法由子类去实现 含有抽象方法的类必须被声明为抽象类 抽象类被子类继承,子类(如果不是抽象类)必须重写抽象类中的所有抽象方法 抽象方法: 声明而未被实现的 ...
- Java面向对象之抽象类
内容: 1.抽象类的产生 2.抽象类和抽象方法的定义与使用 3.抽象类和抽象方法的注意事项 4.实例分析 1.抽象类的产生 当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具 ...
- Java面向对象_抽象类、接口
一.抽象类 概 念:很多具有相同特征和行为的对象可以抽象为一个类:很多具有相同特征和行为的类可以抽象为一个抽象类 关键字:abstract 规 则:1.抽象类可以没有抽象方法,有抽象方法的类必 ...
- Java 面向对象编程 抽象类 抽象方法 abstract
抽象类 通过abstract定义的方法是抽象方法,它只有定义,没有实现.抽象方法定义了子类必须实现的接口规范: 定义了抽象方法的class必须被定义为抽象类,从抽象类继承的子类必须实现抽象方法: 如果 ...
- Java面向对象13——抽象类
抽象类 package oop.demon01.demon08; //abstract 抽象类: 类 extends: 类---单继承 (接口可以多继承) public abstract c ...
- 浅谈Java面向对象之抽象类(abstract)
java语言,声明类时格式为: abstract class Db{} 说明Db类为抽象类.抽象方法是说没有方法的实现(方法体)此方法为抽象方法,只有抽象类和接口中才可以有抽象方法.简而言之,含有抽象 ...
- java面向对象_抽象类和接口
一.抽象类 1.抽象方法:由abstract修饰.只有定义没有方法体.用一个分号结尾. 2.抽象类: 1)包含抽象方法的类必须是抽象类 2)由abstract修饰 3)不能被实例化 4)抽象类如果不被 ...
- java面向对象下:Java数据库编程
19.Java数据库编程: JDBC概述: JDBC(Java Database Connection)是java中提供的一套数据库编程API,它定义了一套用来访问数据库的标准Java类 ...
- java面向对象下:JavaXML解析技术
20.JavaXML解析技术: XML概述: XML可扩展标记性语言,用于数据表达和数据传递. XML语法规则: 合法DTDXML:1.内部DTD(和XML一起):2.外部 ...
随机推荐
- springboot 搭配redis缓存
1.引入依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId&g ...
- Xilinx FPGA全局介绍
Xilinx FPGA全局介绍 现场可编程门阵列 (FPGA) 具有诸多特性,无论是单独使用,抑或采用多样化架构,皆可作为宝贵的计算资产:许多设计人员并不熟悉 FPGA,亦不清楚如何将这类器件整合到设 ...
- AJAX第二天笔记
AJAX day1 jquery中的ajax 拦截请求: $.ajaxPrefilter() jquery方法请求参数的本质: 无论我们填写的何种形式的参数,都会被jQuery转换成查询字符串形式传 ...
- wrk(1)- 详细使用
介绍 wrk 是一个类似 ab(apache bench).jmeter 的压力测试工具,官方称它为:现代的 HTTP 基准测试工具 用 C 编写的 HTTP 协议压测工具 底层基于 epoll 和 ...
- 循序渐进BootstrapVue,开发公司门户网站(2)--- 使用wow.js动画组件以及自定义的CSS样式处理动态效果
在我们开发的页面中,让页面有一些动画效果,可以让页面更加有吸引力,只要不是处理太过,一般人还是希望有一些动态效果,如滚动动画加载,悬停处理变化等效果,本篇随笔介绍使用wow.js动画组件以及自定义的C ...
- 从谭浩强的《C语言程序设计》到《电容应用分析精粹》
不记得具体从什么时候开始(反正很多年前的事了)的,不少人都陆续批评过谭浩强的<C语言程序设计>,各方面都有扒过.例如,与实践脱节,很多例子在不同编译器上运行是错误的,代码风格糟糕等等方面. ...
- Windows下安装kubectl及Node和Pod操作常用命令
kubernetes通过kube-apiserver作为整个集群管理的入口.Apiserver是整个集群的主管理节点,用户通过Apiserver配置和组织集群,同时集群中各个节点同etcd存储的交互也 ...
- 7、解决windows10家庭版无法远程连接服务器的问题
(1)方法一: 升级windows10为专业版,因为win10家庭版没有组策略: (2)方法二:通过远程命令: 同时按住"win+r"键调出"运行",在方框内输 ...
- 使用VS2017开发APP中使用VUE.js开发遇到打包出来的android文件 在低版本的android(4.3)中无法正常使用
使用VS2017开发VUE的APP应用遇到的问题集合 1, 打包出来的apk文件在Android 6.0版本以上手机可以正常打开,在Android 4.3版本手机上无法打开 原因:一开始猜测是不是V ...
- Visual Studio 2010 SP1 中文升级补丁ISO完整版下载 (含多国语言)
最近事情比较多,差点忘记了这个VS2010 SP1的升级补丁更新了,程序员们赶快更新吧!这次发布的SP1包含了下列语言:英文,简体中文,繁体中文,法语,德语,印度语,日语,韩语,俄语以及西班牙语. V ...