java 抽象类的实例详解
作者:可比克番茄 发布时间:2023-06-08 05:52:40
java 抽象类的实例详解
前言:
什么是抽象类?这名字听着就挺抽象的,第一次听到这个名字还真有可能被唬住。但是,就像老人家所说的,一切反动派都是纸老虎,一切有着装x名字的概念也是纸老虎。好吧,我们已经从战略上做到了藐视它,现在就要战术上重视它,如同要解决纸老虎,就要一个牙齿一个牙齿地敲,一个爪子一个爪子地拔;解决这种抽象概念也一样,先要把它具体化,细分化,然后一个一个地来。
我一般遇到新的概念都会问三个问题:
1.这个东西有什么用?用来干什么的?它的意义在哪里?(显然,如果是没用的东西,就没必要浪费时间了;其实,弄懂了这个问题,就掌握了60%)
2.这个概念或者技能点怎么用?也就是它的表现形式,如关键字、修饰词、语法什么的。。。(这个占20%)
3.这个东西在用的过程中,有哪些关键点和细节点?(是的,也占20%)
上面三个问题搞清楚了,剩下的就是去用了。。。“无他,但手熟尔。”
一、第一个问题:抽象类有什么用?它存在的意义是什么?
这回答这个问题之前,先看一下动物界里的一个例子:首先,有一个父类Animal,接着有两个子类,分别是鸟Bird和狗Dog,如下:
public class Animal{
public void bark(){}
}
public class Bird extends Animal{
public void bark(){
System.out.println("唧唧~唧唧~");
}
}
public class Dog extends Animal{
public void bark(){
System.out.println("汪汪~汪汪~");
}
}
可以看到,父类Animal有一个叫唤的方法bark(),两个子类都继承了这个方法,并进行了重写,Bird是唧唧叫,Dog是汪汪叫,现在的问题是Animal怎么叫?它的bark()方法体里应该输出什么样的叫声,是“汪汪”还是“唧唧”?
显然,动物是个抽象的集合名词,我们并不知道动物Animal怎么叫,所以,bark()方法在父类中实现不了,或者说实现了没有任何意义,bark()方法只能在子类中根据具体情况去实现。这样的话就可以把父类Animal中的bark()方法声明为abstract抽象方法,此时这个类也成了abstract抽象类。
至此,也就可以回答第一个问题,抽象类用来做什么的?抽象类自己并不能实例化,它存在的意义就是为了让子类继承。对于一个父类,它的某个方法在父类中实现没有任何意义,必需在子类中根据具体情况实现,那么这个方法可以声明为abstract抽象方法,此时这个父类也成了abstract抽象类。(当然,你也许会想,就像上面那样,函数的花括弧里为空不也可以?是的,语法上没毛病,甚至用法上也没毛病,但一般还是把它抽象成abstract方法。原因有三点:1.就像上面说的,这样弄“实现了没有任何意义”;2.Java里面不鼓励函数体的内容为空;3.用法上子类继承父类后,子类会被强制重写父类中的抽象方法,起到一个提醒和约束的作用。)
二、第二个问题:抽象类怎么用?表现形式是什么样的?
这个问题相对简单,就是语言设计者的一些规定,Java中规定用abstract来修饰抽象方法和抽象类。上面的Animal类写成如下形式:
public abstract class Animal{
public abstract void bark();
}
三、第三个问题:抽象类在用的过程中有哪些关键点?
抽象类并不是只能包含抽象方法,他也可以包含普通的成员方法和成员变量。它和普通类的区别主要有三点:
1.抽象类中的抽象方法只能用public或protected修饰。因为,抽象方法来到世间就是为了让子类继承重写的,而private属性的方法不能被子类继承,显然矛盾。
2.抽象类不能创建对象,即不能实例化。因为,抽象类中包含没有实现的抽象方法,是不完整的,所以不能用来创建对象。(有一种特殊情况,就是一个类中并没有抽象方法,但是类class有abstract修饰,被声明为抽象类,那么这个类也是抽象类,也不能实例化。)
3.如果一个类继承于一个抽象类,那么子类必须实现父类的抽象方法。否则,子类继承的方法还是抽象方法,子类也变成了抽象类,要用abstract修饰。(这就好比父母从小 have a dream,就是考大学,但是由于他们生活的年代、环境、个人能力等因素,总之没实现,于是他们将这个梦想让自己孩子继承,并要求他们实现,至于你具体是考清华大学,还是考长江大学,那就 Let it be 了。。。当然,如果儿子不实现,就会变成抽象类,再让孙子继承和实现。。。)
在其他方面,抽象类和普通类并无区别。最后,再来个例子:
public abstract class Animal { //抽象类中可以有非抽象方法,也可以有成员变量
private int a = 10;
public abstract void bark(); //如果没有此抽象方法,但是class前有absract修饰,也是抽象类,也不能实例化
public void say() { //普通成员方法
System.out.println("我是抽象类中的非抽象方法,此抽象类中的私有成员变量a= " + a);
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
}
public class Dog extends Animal{
public void bark() { //子类实现Animal的抽象方法
System.out.println("汪汪~汪汪~");
System.out.println("我是子类,不能直接调用父类的私有变量a :(");
System.out.println("我是子类,只有通过super.getA()调用父类的私有变量a:" + super.getA());
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.say(); //子类继承调用Animal的普通成员方法
dog.bark(); //子类调用已经实现过的方法
}
}
来源:http://www.cnblogs.com/419liu/archive/2017/09/03/7467331.html


猜你喜欢
- springboot集成开发实现商场秒杀加入主要依赖<dependency> <groupId>org.spring
- JAVA虽然是在C++基础上发展而来,但却对C++的许多缺陷有所改进,其中一个不得不提的就是字符串,我们知道,随着学习的深入,进入MFC时,
- HTTPS是HTTP的安全版本,旨在提供数据传输层安全性(TLS)。当你的应用不使用HTTP协议的时候,浏览器地址栏就会出现一个不安全的提示
- 我们首先看下BASEJDBC的写法实例:package com.dao;import java.sql.Connection;import
- 移除一段文字中的HTML标记,以消除其中包含的样式和段落等,最常用的办法可能就是正则表达式了。但是请注意,正则表达式并不能处理所有的HTML
- [java]public static Bitmap getBitmapFromServer(String imagePath) { &nb
- Gradle修改默认的Build配置文件名Gradle默认使用build.gradle作为默认的配置文件文件名。如果我们在build.gra
- 1,创建存储过程create proc Pro_Login(@UserName nvarchar(10),@PassWord nvarcha
- Java怎么自动添加重写的toString方法,这里我们将给大家介绍详细的解决方法。首先,添加一个任意的类,具体的类型没有要求,然后在主程序
- 前言本篇内容:提示语的国际化返回,自定义多语言。本文使用aop方式,拦截接口返回的数据,进行转换。正文 先看这次示例教
- Unity2018已经把打包过程简化很多了我们只需要关心两个API:1.BuildPipline.BuildAssetBundles() 打
- WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对
- 前言在实际开发中,大多数情况下都需要对 SQL 传入参数以获得想要的结果集,传入的情况分为两种情况:1、SQL语句的拼接,比如表名、like
- 之前项目总会遇到很多搜索框类的功能,虽然不是很复杂,不过每次都要去自己处理数据,并且去处理搜索框的变化,写起来也比较麻烦,今天来做一个比较简
- 配置文件中设置通常在公司级别的项目中,我们可能会写多个application- dev/prod.yml ,然后我们通常会在applicat
- 首先安装consul环境,参照之前的文章:https://www.jb51.net/article/141789.htm项目规划,2个服务端
- 一:将String字符串放在最前面防止发生NullPointerException异常,我们通常把String字符串放在equals方法的左
- 如下所示:class Program {
- 一、问题Spring2.1.5集成activiti7.1.24时访问要输入用户名和密码。 @Autowired private
- 第1类:嵌套模式package day14;import java.io.FileInputStream;import java.io.Fi