【Java基础】抽象类和抽象方法的总结
什么是抽象类
抽象类是相同概念实体的一种抽象,Java中用关键字abstract来定义抽象类和抽象方法。
什么是抽象方法
只有方法的声明,没有方法的具体实现的方法。
抽象类和抽象方法的特点
- 抽象类和抽象方法必须用abstract关键字来修饰,抽象方法没有方法体,即不能有{};
- 抽象类中不一定要有抽象方法,即也可以都是非抽象方法或两者并存,但是拥有抽象方法的类一定要定义为抽象类;
- 抽象类不能被实例化,但是抽象类依然有构造方法,抽象类的构造方法用于子类访问父类数据的初始化。
- 抽象类的子类可以是抽象类,但如果不是抽象类,必须重写抽象类中定义的所有抽象方法。
抽象类成员的特点
- 成员变量:可以为常量(例如final修饰的常量),也可以为变量;
- 静态成员变量:可以有,可以被继承,但是不会被重写
- 构造方法:上面提到过,可以有,用于子类访问父类时数据初始化;
- 成员方法:可以是抽象的成员方法(子类必须要实现重写的),也可以是非抽象的成员方法
- 静态成员方法:抽象类中可以有静态成员方法,可以被继承但不能被子类重写
下面是一些说明上面问题的示例代码:
/**
* Created by lili on 15/10/21.
*/ abstract class Person {
public int age = 1;
public final int PerID = 2; public Person() { } public Person(int age) {
this.age = age;
} abstract void show();//定义子类必须要重写的,即必须要做的事 //子类必须要继承的,但不一定要重写
public void play() {
System.out.println("抽象类中的非抽象方法");
} //子类必须继承且不能重写
public final void talk() {
System.out.println("talk like a person");
} public static void think() {
System.out.println("think like a person");
} } class Student extends Person{
public int age = 10;
public final int PerID = 20;//注释后向下转型后的看成员变量访问的结果中PerID打印的是2,说明可被继承 public Student() { } //必须要重写
void show() {
System.out.println("子类中重写抽象类中的抽象方法");
System.out.println("子类内部访问age:" + age);//打印的是10,成员变量可以被重写
System.out.println("子类内部访问PerID:" + PerID);//打印的是20,说明静态成员变量可以被"重写";
} // public final void talk() { //报错,被覆盖的方法为final
// System.out.println("talk like a student");
// } public static void think() {
System.out.println("think like a student");
}
} public class PolymorphismTest {
public static void main(String[] args) {
Person person = new Student();
person.show();//方法被重写,访问的是重写后的方法
System.out.println(person.age);//打印1,打印的是父类的age
System.out.println(person.PerID);//打印2,打印的是父类的PerID
person.talk();//talk like a person,调用的是父类的访问,静态方法,不被重写
person.think(); System.out.println("--------向下转型后的看成员变量访问的结果-----------");
Student student = (Student)person;
student.show();//方法被重写,访问的是重写后的方法
System.out.println(student.age);//打印10,成员变量被重写了
System.out.println(student.PerID);//打印20,成员方法被重写了
student.talk();//talk like a person,静态方法,不被重写,但被继承
student.think();
}
}
运行结果:
子类中重写抽象类中的抽象方法
子类内部访问age:10
子类内部访问PerID:20
1
2
talk like a person
think like a person
--------向下转型后的看成员变量访问的结果-----------
子类中重写抽象类中的抽象方法
子类内部访问age:10
子类内部访问PerID:20
10
20
talk like a person
think like a student
Process finished with exit code 0
注释子类中的PerID定义,则运行结果为:
子类中重写抽象类中的抽象方法
子类内部访问age:10
子类内部访问PerID:2
1
2
talk like a person
think like a person
--------向下转型后的看成员变量访问的结果-----------
子类中重写抽象类中的抽象方法
子类内部访问age:10
子类内部访问PerID:2
10
2
talk like a person
think like a student
Process finished with exit code 0
抽象关键字abstract和其他关键字的冲突关系
- 不能和private一起使用:private修饰的方法不被继承,而抽象的方法必须要继承,所以会冲突报错。
- 和static一起使用无意义:static修饰的方法可以通过类名去访问,而抽象的方法没有实现方法体,所以无意义。
- 不能和final一起使用:final修饰的方法不被重写,而抽象的方法必须被非抽象子类重写,所以会报错。
【Java基础】抽象类和抽象方法的总结的更多相关文章
- Java基础-抽象类和接口
抽象类与接口是Java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 抽象定义: 抽象 ...
- Java基础—抽象类和接口
1.抽象类 在Java语言中使用abstrac关键字来定义抽象类和抽象方法,抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号. public abstract class Employee { ...
- java基础-抽象类与接口(转)
抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 一.抽象类 ...
- Java基础——抽象类
一.概述: 在Java中,一个没有方法体的方法应定义为抽象方法在public 修饰符后加 abstract修饰符,而类中如果有抽象方法,该类必须定义为抽象类在public 修饰符后加 abstract ...
- 关于Java 实现抽象类的抽象方法的特性的利用---面向切面
今天看工作看代码突然有了以下设想: /** * Created by zq on 2017/5/25. * 抽象类 */ public abstract class AbstractC { publi ...
- 【Java】抽象类与抽象方法
文章目录 抽象类与抽象方法 abstract关键字的使用 abstract修饰类:抽象类 abstract修饰方法:抽象方法 abstract使用上的注意点: 抽象类的匿名子类 模板方法设计模式 抽象 ...
- java中抽象类和抽象方法到底什么关系?请举例说明!
抽象类和抽象方法什么关系?抽象类中可能有抽象方法,也可能没有抽象方法.那位说,就跟没说一样,那抽象类和抽象方法都叫抽象,他们必定有关系,那关系是什么呢?如果一个类中有抽象方法,它必须得是抽象类. An ...
- java中抽象类和抽象方法到底有什么用呢?
抽象类和抽象方法有什么用呢?马克-to-win:当初sun公司为什么要设计抽象类和抽象方法呢?当你在做车的系统设计时,当你设计车这个通用类时,假如你确认别人实例化车这个通用类没有意义时(不知道是bik ...
- Java基础——抽象类和接口
之所以将抽象类和接口放在一起做笔记,是因为他们之间很难区分又各自独立.在学习完Java程序设计的三大特点(封装.继承.多态)之后,我最大的收获是,慢慢理解了Java语言这种面向对象程序设计的优越性,它 ...
- 详解java基础--抽象类、接口与多态
抽象类.接口.多态都是面向对象中很基础的东西,我相信看到能本篇博客的人本不会再纠结它的基本定义了,本篇文章将尽量的更加深层次的挖掘其内涵,希望能对大家有帮助. 一.抽象类 1.形式 abstract ...
随机推荐
- Python设计模式——模版方法模式
1.模版方法模式 做题的列子: 需求:有两个学生,要回答问题,写出自己的答案 #encoding=utf-8 __author__ = 'kevinlu1010@qq.com' class Stude ...
- lua中的时间函数
-- 获取当前的格林尼治时间print(os.time())-- 获取当前时间的字符串表示,形如:11/28/08 10:28:37print(os.date())-- 获取当前日期的字符串表示,形如 ...
- CODEVS 3000公路修建问题
题目描述 Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Associat ...
- ExtJS4加载FormPanel数据的几种方式
我们做web应用最多的就是处理表单,extjs为我们提供了很多处理表单的功能,很多初学者疑惑怎么加载表单数据,到底能用什么方式加载?本文中,我将我自己实验过的进行一下总结,自己备忘,也希望能帮助到其他 ...
- cocos2d lua的cclog 在logcat中显示
-- cclog cclog = function(...) release_print(string.format(...)) end 改成这样就可以了
- 扩展pl0编译器设计——总述
所谓编译器,实际上就是我们编程时将输入的高级语言代码转换成相应的目标代码,从而实现将目标代码转换成汇编码的一种过渡工具. 这种工具根据具体情况不同,可以将不同的高级语言代码转换成不同的目标代码,例如将 ...
- web前端开发分享-css,js进阶篇
一,css进阶篇: 等css哪些事儿看了两三遍之后,需要对看过的知识综合应用,这时候需要大量的实践 经验, 简单的想法:把qq首页全屏另存为jpg然后通过ps工具切图结合css转换成html,有无 从 ...
- BZOJ 3993 [SDOI 2015] 星际战争 解题报告
首先我们可以二分答案. 假设当前二分出来的答案是 $Ans$ ,那么我们考虑用网络流检验: 设武器为 $X$,第 $i$ 个武器的攻击力为 $B_i$: 设机器人为 $Y$,第 $i$ 个机器人的装甲 ...
- android ListView内数据的动态添加与删除
main.xml 文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns ...
- Maven内置变量
1.Maven内置变量说明: ${basedir} 项目根目录 ${project.build.directory} 构建目录,缺省为target ${project.build.outputDire ...