java中抽象类与抽象方法的使用问题
从面向对象设计的角度来说,抽象类与抽象方法,接口都是必不可少的内容,正是这些概念以及实际运用,够成了java面向对象的核心与强大,抽象类,方法是和多态密不可分的设计范式....
何为多态?简单的说就是一类事物的多种形态,基本类型有多种形态(类型自动转换),方法有多种形态(重载:同名不同参),引用类型的多态则相对复杂,比如说,一个描述人类的类,里面有个方法叫说话,不同语言的人说出来是不一样的,中国人说汉语,外国人说我听不懂的鸟语...在人类这个类中怎么实现说话呢?可想而知是不现实的,最好的方法就是把这个说话的方法设计成抽象方法,不提供具体实现,让继承人类的子类去重写(重写:同名,同参,同返回,范围不能变小,异常不能变大)这个方法...
何为抽象类?抽象类是从其他若干个具有相同属性与行为的类中进一步抽象出来的类,可以设计方法,属性,如果把类设计为抽象类,那么这个类是不能被实例化的,只能被继承的子类(子类也可以为抽象类,也可以不是)间接使用,抽象类有构造,是一个完整的类,抽象类中可以包含抽象方法,也可以不含,那么问题来了,既然把类设计成抽象,肯定是用于设计多态用的,一般都会包含抽象方法:
子类继承了抽象类,如果抽象类中含有抽象方法,那么子类也继承了抽象方法,包含抽象方法的类必须是抽象类,不然子类就必须重写抽象方法,就是提供具体实现,完成多态,
下面3条原则保证了抽象方法必须重写:
1、必须用public abstract修饰抽象方法,private ,static 都不能用于修饰
2、包含抽象方法的类必须是抽象类
3、抽象类可以不含抽象方法
代码示例:
- <SPAN style="FONT-SIZE: 18px">package OOTest;
- public abstract class Human {//抽象父类
- private final int time=++count;//对象计数器
- private static int count;//静态池
- //属性封装
- private String name;//封装三步:隐藏属性,提供getter与setter方法,构造中调用setter初始化
- private int age;
- private String sex;
- //getter&&setter
- public String getName(){
- return this.name;
- }
- public void setName(String name){
- //处理代码:姓名不能为空,且不能包含数字
- if(name.length()==0){
- System.out.println("姓名不能为空");
- }
- else if(this.isWrongName(name)){//调用私有方法处理
- System.out.println("非法姓名,不能包含数字");
- }
- else{
- this.name=name;
- }
- }
- private boolean isWrongName(String name){//判断非法姓名输入(私有)
- char[] ch=name.toCharArray();
- for(int i=0;i<ch.length;i++){
- try{
- int s=Integer.parseInt(String.valueOf(ch[i]));
- s++;//废
- return true;
- }
- catch(Exception e){
- continue;//出错就继续下一次循环转换
- }
- }
- return false;//先返回错误
- }
- public int getAge(){
- return this.age;
- }
- public void setAge(int age){
- if(age<=0){
- System.out.println("年龄有误");
- }
- else{
- this.age=age;
- }
- }
- public String getSex(){
- return this.sex;
- }
- public void setSex(String sex){
- if(sex.length()>1||sex.length()==0){
- System.out.println("性别设定错误");
- }
- else if(sex.toCharArray()[0]=='男'||sex.toCharArray()[0]=='女'){
- this.sex=sex;
- }
- else{
- System.out.println("性别设定错误");
- }
- }
- //构造
- public Human(){//无参
- this("无1名氏",25,"男");
- }
- public Human(String name,int age,String sex){//全参
- this.setName(name);
- this.setAge(age);
- this.setSex(sex);
- }
- //抽象方法
- public abstract void speak();//说话
- public abstract void work();//工作
- public abstract void eat();
- //获取对象创建数目
- public int getHumanClassUseTimes(){
- return this.time;
- }
- }
- </SPAN>
package OOTest;
public abstract class Human {//抽象父类
private final int time=++count;//对象计数器
private static int count;//静态池
//属性封装
private String name;//封装三步:隐藏属性,提供getter与setter方法,构造中调用setter初始化
private int age;
private String sex;
//getter&&setter
public String getName(){
return this.name;
}
public void setName(String name){
//处理代码:姓名不能为空,且不能包含数字
if(name.length()==0){
System.out.println("姓名不能为空");
}
else if(this.isWrongName(name)){//调用私有方法处理
System.out.println("非法姓名,不能包含数字");
}
else{
this.name=name;
}
}
private boolean isWrongName(String name){//判断非法姓名输入(私有)
char[] ch=name.toCharArray();
for(int i=0;i<ch.length;i++){
try{
int s=Integer.parseInt(String.valueOf(ch[i]));
s++;//废
return true;
}
catch(Exception e){
continue;//出错就继续下一次循环转换
}
}
return false;//先返回错误
}
public int getAge(){
return this.age;
}
public void setAge(int age){
if(age<=0){
System.out.println("年龄有误");
}
else{
this.age=age;
}
}
public String getSex(){
return this.sex;
}
public void setSex(String sex){
if(sex.length()>1||sex.length()==0){
System.out.println("性别设定错误");
}
else if(sex.toCharArray()[0]=='男'||sex.toCharArray()[0]=='女'){
this.sex=sex;
}
else{
System.out.println("性别设定错误");
}
}
//构造
public Human(){//无参
this("无1名氏",25,"男");
}
public Human(String name,int age,String sex){//全参
this.setName(name);
this.setAge(age);
this.setSex(sex);
}
//抽象方法
public abstract void speak();//说话
public abstract void work();//工作
public abstract void eat();
//获取对象创建数目
public int getHumanClassUseTimes(){
return this.time;
}
}
子类:
- <SPAN style="FONT-SIZE: 18px">package OOTest;
- public class Chinese extends Human {
- public Chinese() {
- // TODO Auto-generated constructor stub
- }
- public Chinese(String name, int age, String sex) {
- super(name, age, sex);
- // TODO Auto-generated constructor stub
- }
- public void eat() {
- System.out.println(this.getName()+"中国人用筷子吃饭");
- }
- public void speak() {
- System.out.println("中国人说汉语"+this.getSex());
- }
- public void work() {
- System.out.println("中国人干活踏实勤快"+this.getAge());
- }
- }
- </SPAN>
package OOTest;
public class Chinese extends Human {
public Chinese() {
// TODO Auto-generated constructor stub
}
public Chinese(String name, int age, String sex) {
super(name, age, sex);
// TODO Auto-generated constructor stub
}
public void eat() {
System.out.println(this.getName()+"中国人用筷子吃饭");
}
public void speak() {
System.out.println("中国人说汉语"+this.getSex());
}
public void work() {
System.out.println("中国人干活踏实勤快"+this.getAge());
}
}
测试类:
- <SPAN style="FONT-SIZE: 18px">package OOTest;
- public class Test {
- public static void main(String[] args) {
- Human h=new Chinese();
- h.eat();
- h.speak();
- h.work();
- System.out.println("Human类被实例化:"+h.getHumanClassUseTimes()+"次");
- Human h1=new Chinese();
- System.out.println("Human类被实例化:"+h1.getHumanClassUseTimes()+"次");
- }
- }</SPAN>
package OOTest;
public class Test {
public static void main(String[] args) {
Human h=new Chinese();
h.eat();
h.speak();
h.work();
System.out.println("Human类被实例化:"+h.getHumanClassUseTimes()+"次");
Human h1=new Chinese();
System.out.println("Human类被实例化:"+h1.getHumanClassUseTimes()+"次");
}
}
运行结果:
非法姓名,不能包含数字
null中国人用筷子吃饭
中国人说汉语男
中国人干活踏实勤快25
Human类被实例化:1次
非法姓名,不能包含数字
Human类被实例化:2次
java中抽象类与抽象方法的使用问题相关推荐
- java中抽象类继承抽象类_用Java中的抽象类扩展抽象类
java中抽象类继承抽象类 示例问题 当我创建Java :: Geci抽象类AbstractFieldsGenerator和AbstractFilteredFieldsGenerator我遇到了一个不 ...
- Java中抽象类和接口在概念、语法和应用上的区别和关系
2019独角兽企业重金招聘Python工程师标准>>> 春招开始了,盆友们都忙着准备笔试.准备面试,复习学过的知识点,当然我也不例外,在这里祝每一个"有心人"心想 ...
- 关于Java中抽象类和接口的一点思索
Java中抽象类和接口的一点思索 成员方法上的区别: 1. java中的抽象类可以提供成员方法的实现细节,抽象方法只能是被public和protected来修饰 配合abstract关键字,子类需要实 ...
- java中抽象类(abstract class)
抽象类(abstract class) 随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用.类的设计应该保证父类和子类能够共享特征.有时将一个父类设计得非常抽象,以至于它没有具 ...
- java中抽象类继承抽象类_Java中的抽象类用示例解释
java中抽象类继承抽象类 Abstract classes are classes declared with abstract. They can be subclassed or extende ...
- java中抽象类 接口_java中的抽象类与接口
1.抽象类的定义 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 2.简单实例 ...
- Java 中抽象类与接口
Java 抽象类: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这个类就是抽象类. 抽象类不能创 ...
- Java中抽象类和接口
一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有具体的实现.抽象方法的声明格式为: 1 abstract void fun(); 抽象方法必须用abst ...
- java中抽象类的定义_Java中抽象类的定义和使用
Java虽然比较简单,但是细节的知识点还是很多的,现在,介绍一下抽象类的定义和实现基础.指的是在类中定义方法,而不去实现它,而在它的子类中去具体实现,继承抽象类的子类必须实现父类的抽象方法,除非子类是 ...
最新文章
- 进一步封装axios并调用其读取数据(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)
- python多元线性回归模型_python – 使用Tensorflow的多元线性回归模型
- windows mysql dump_mysql在Windows下使用mysqldump命令手动备份数据库和自动备份数据库...
- Make Games with Python Pygame (2)
- windows2003的一些设置之一
- 负载均衡设备oracle,Oracle RAC 服务器端联接负载均衡(Load Balance)
- JS进阶 你真的掌握变量和类型了吗?
- HTML+CSS制作漂浮的对话框
- [转]Oracle SQL 日期的應用
- java 时间戳验证_关于Java:在时间戳服务器上使用时间戳和身份验证对jar进行签名...
- python 抽签程序_抽签程序源码
- Weblogic部署项目
- 【dos命令--教程】批量修改文件后缀
- 微信html5 video自动播放,【微信H5开发】audio/video标签的自动播放
- ios android 录音格式,Audio模块录音格式汇总(aac、mp3)
- tensorflow配置默认工作路径
- SRAM和DRAM的真正区别
- 用php表示掷骰子两次比大小,[宜配屋]听图阁
- 【Pytorch】torch. bmm()
- C语言布斯乘法算法,布斯Booth算法带符号位的乘法verilog语言实现booth算法
热门文章
- 谁将引领新一代视频编码标准:HEVC、AVS2和AV1性能对比报告
- C++模板的那丢丢事儿
- SRS流媒体服务器——Forward集群搭建和源码分析
- AVIO内存输入模式
- 「递归」第2集 | 变得了魔术,解得了高数,这届鹅厂程序员有点酷
- 网络编程(32)—— linux中销毁僵尸进程的四种方法
- 大剑无锋之Spark中的Driver是什么?【面试推荐】
- 没有 root 权限如何使用 pip?How to install python modules without root access?
- 【Vue】脚手架 Vue CLI 的使用
- 看动画学算法之:栈stack