什么是抽象类

  抽象类是相同概念实体的一种抽象,Java中用关键字abstract来定义抽象类和抽象方法。

什么是抽象方法

  只有方法的声明,没有方法的具体实现的方法。

抽象类和抽象方法的特点

  1. 抽象类和抽象方法必须用abstract关键字来修饰,抽象方法没有方法体,即不能有{};
  2. 抽象类中不一定要有抽象方法,即也可以都是非抽象方法或两者并存,但是拥有抽象方法的类一定要定义为抽象类;
  3. 抽象类不能被实例化,但是抽象类依然有构造方法,抽象类的构造方法用于子类访问父类数据的初始化。
  4. 抽象类的子类可以是抽象类,但如果不是抽象类,必须重写抽象类中定义的所有抽象方法。

抽象类成员的特点

  1. 成员变量:可以为常量(例如final修饰的常量),也可以为变量;
  2. 静态成员变量:可以有,可以被继承,但是不会被重写
  3. 构造方法:上面提到过,可以有,用于子类访问父类时数据初始化;
  4. 成员方法:可以是抽象的成员方法(子类必须要实现重写的),也可以是非抽象的成员方法
  5. 静态成员方法:抽象类中可以有静态成员方法,可以被继承但不能被子类重写

下面是一些说明上面问题的示例代码:


/**
* 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和其他关键字的冲突关系

  1. 不能和private一起使用:private修饰的方法不被继承,而抽象的方法必须要继承,所以会冲突报错。
  2. 和static一起使用无意义:static修饰的方法可以通过类名去访问,而抽象的方法没有实现方法体,所以无意义。
  3. 不能和final一起使用:final修饰的方法不被重写,而抽象的方法必须被非抽象子类重写,所以会报错。

【Java基础】抽象类和抽象方法的总结的更多相关文章

  1. Java基础-抽象类和接口

    抽象类与接口是Java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 抽象定义: 抽象 ...

  2. Java基础—抽象类和接口

    1.抽象类 在Java语言中使用abstrac关键字来定义抽象类和抽象方法,抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号. public abstract class Employee { ...

  3. java基础-抽象类与接口(转)

    抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 一.抽象类    ...

  4. Java基础——抽象类

    一.概述: 在Java中,一个没有方法体的方法应定义为抽象方法在public 修饰符后加 abstract修饰符,而类中如果有抽象方法,该类必须定义为抽象类在public 修饰符后加 abstract ...

  5. 关于Java 实现抽象类的抽象方法的特性的利用---面向切面

    今天看工作看代码突然有了以下设想: /** * Created by zq on 2017/5/25. * 抽象类 */ public abstract class AbstractC { publi ...

  6. 【Java】抽象类与抽象方法

    文章目录 抽象类与抽象方法 abstract关键字的使用 abstract修饰类:抽象类 abstract修饰方法:抽象方法 abstract使用上的注意点: 抽象类的匿名子类 模板方法设计模式 抽象 ...

  7. java中抽象类和抽象方法到底什么关系?请举例说明!

    抽象类和抽象方法什么关系?抽象类中可能有抽象方法,也可能没有抽象方法.那位说,就跟没说一样,那抽象类和抽象方法都叫抽象,他们必定有关系,那关系是什么呢?如果一个类中有抽象方法,它必须得是抽象类. An ...

  8. java中抽象类和抽象方法到底有什么用呢?

    抽象类和抽象方法有什么用呢?马克-to-win:当初sun公司为什么要设计抽象类和抽象方法呢?当你在做车的系统设计时,当你设计车这个通用类时,假如你确认别人实例化车这个通用类没有意义时(不知道是bik ...

  9. Java基础——抽象类和接口

    之所以将抽象类和接口放在一起做笔记,是因为他们之间很难区分又各自独立.在学习完Java程序设计的三大特点(封装.继承.多态)之后,我最大的收获是,慢慢理解了Java语言这种面向对象程序设计的优越性,它 ...

  10. 详解java基础--抽象类、接口与多态

    抽象类.接口.多态都是面向对象中很基础的东西,我相信看到能本篇博客的人本不会再纠结它的基本定义了,本篇文章将尽量的更加深层次的挖掘其内涵,希望能对大家有帮助. 一.抽象类 1.形式 abstract ...

随机推荐

  1. Sublime Text 3插件之Emmet:HTML/CSS代码快速编写神器

    一.快速编写HTML代码 1.  初始化 HTML文档需要包含一些固定的标签,比如<html>.<head>.<body>等,现在你只需要1秒钟就可以输入这些标签. ...

  2. 蜗牛历险记(二) Web框架(下)

    Web框架第三篇--缓存篇 缓存的优劣很大程度上决定了框架的效率,一个有节操的缓存它应该是高效的,利用率高的,具备更多扩展功能的. 一.介绍之前 计算机各个硬件的运行效率是不一样的,CPU>&g ...

  3. CGRectOffset与CGRectInset的计算公式

    (1)CGRectInset CGRect CGRectInset ( CGRect rect, CGFloat dx, CGFloat dy ); 该结构体的应用是以原rect为中心,再参考dx,d ...

  4. java-development.sh

    vi /etc/profile.d/java-development.sh export JAVA_HOME=/usr/local/java/jdk1..0_55 export JRE_HOME=$J ...

  5. BIOS

    转自BIOS BIOS(Basic Input/Output System的缩写.中文:基本输入输出系统),在IBM PC兼容机上,是一种业界标准的固件接口.BIOS这个字眼是在1975第一次由CP/ ...

  6. Eclipse 安装Activiti 插件失败解决方法

    遇到的错误为:1.4.0' but it could not be found等.

  7. 简单讨论数据类型(byte)强制转化后的数值变化规律

    package com.wangzhu.datatype; /** * Java基本数据类型练习 * * @ClassName: DataTypes * @Description: TODO * @a ...

  8. Windows 内核(WRK)编译

    引子 WRK 是微软于 2006 年针对教育和学术界开放的 Windows 内核的部分源码, WRK(Windows Research Kernel)也就是 Windows 研究内核, 在 WRK 中 ...

  9. Android RelativeLayout

    RelativeLayout为相对布局,这种布局内的组件总是相对兄弟组件.父容器来确定的,在定义控件的位置时,需要参照其他控件的位置. 这个程序实现了一个梅花的相对布局 <?xml versio ...

  10. velocity-1.7中vm文件的存放位置

    velocity-1.7中关于vm文件存放 demo: public class App_example1 { public App_example1() { String propfile=&quo ...