抽象类的作用类似“模板”,可以根据它的格式来修改、创建新的类;但是不能直接由抽象类创建对象只能通过抽象类派生出新的类,再由它来创建对象;抽象类的使用同样是单继承,即一个子类只能继承一个抽象类

抽象类的定义及使用规则:

  • 包含一个抽象方法的类必定是抽象类
  • 抽象类和抽象方法都要使用abstract关键字声明
  • 抽象方法只用声明不用实现
  • 抽象类必须被子类继承,子类(如果不是抽象类)必须覆写抽象类中的全部抽象方法

抽象类的定义格式:

 abstract class 抽象类名称{
属性;
访问权限 返回值类型 方法名称(参数){ //普通方法
[return 返回值];
}
访问权限 abstract 返回值类型 方法名称(参数); //抽象方法
}

从上述格式中看出,抽象类的组成比普通类多了静态方法,其他地方和普通类基本一致

 abstract class A {
public static final String FLAG="China";
private String name = "张三";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void print(); //定义抽象方法
}
class B extends A{ //继承抽象类,覆写全部抽象方法
@Override
public void print() {
System.out.println("FLAG="+FLAG);
System.out.println("姓名:"+super.getName());
}
}
public class Demo1 {
public static void main(String[] args) {
B b=new B();
b.print();
}
}

从上面的示例中可以看出,抽象类A中定义了抽象方法print(),但是抽象方法并不能被外部直接调用,类B继承类A,并覆写了抽象类A的print()方法;不过需要注意几点:

  • 抽象类不能用final关键字声明,因为final关键字声明的类子类不能继承,而抽象类必须被子类覆写
  • 抽象方法不要使用private修饰,同样因为子类必须覆写抽象方法,如果使用则无法覆写

抽象类使用的依然是类的继承关系,存在构造方法和各个属性,所以子类实例化之前必须先对父类进行实例化


抽象类中定义了抽象方法,但是定义的抽象方法不能被外部直接调用;在子类对象实例化前同样也会默认调用父类中的无参构造也就是说此时子类实际隐含了一个super关键字调用构造方法的语句:

 class B extends A{
public B() {
super(); //隐含此语句
System.out.println("B、子类中的构造方法");
}
}

既然可以调用抽象类中的构造方法,那么也可以直接在子类指定调用父类中的指定参数的构造方法:

 abstract class Person {
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public abstract String getInfo(); //取得信息,抽象方法
}
class Student extends Person{
private String school;
public Student(String name, int age, String school) {
super(name, age);
this.school = school;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
@Override
public String getInfo() { //覆写抽象类中抽象方法
return "姓名:"+super.getName()+
"年龄:"+super.getAge()+
"学校:"+this.getSchool();
}
}
public class Demo {
public static void main(String[] args) {
Student stu = new Student("Tom", 19, "北京大学");
System.out.println(stu.getInfo());
}
}

JAVA面对对象(四)——抽象类的更多相关文章

  1. java 面对对象(抽象 继承 接口 多态)

    什么是继承? 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 多个类可以称为子类,单独这个类称为父类.超类或者基类. 子类可以直接 ...

  2. Java笔记(十四)……抽象类与接口

    抽象类概念 抽象定义: 抽象就是从多个事物中将共性的,本质的内容抽取出来. 例如:狼和狗共性都是犬科,犬科就是抽象出来的概念. 抽象类: Java中可以定义没有方法体的方法,该方法的具体实现由子类完成 ...

  3. java面对对象 关键字this super

    this:this是指向对象本身的一个指针,成员函数内部指向当前类的对象 其实this主要要三种用法: 1.表示对当前对象的引用! 2.表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是 ...

  4. java面对对象(六)--内部类、匿名内部类

    内部类 可以在一个类的内部定义另一个类这种类成为内部类或嵌套类,比如: class Outer{ … class Inner{ …. } } class Outer1{} // 这个Inner1不是O ...

  5. java面对对象入门(4)-程序块初始化

    Java实例初始化程序是在执行构造函数代码之前执行的代码块.每当我们创建一个新对象时,这些初始化程序就会运行. 1.实例初始化语法 用花括号创建实例初始化程序块.对象初始化语句写在括号内. publi ...

  6. JAVA面对对象(五)——接口

    接口由全局常量和公共的抽象方法组成,接口的定义格式: interface 接口名称{ 全局常量; 抽象方法; } 接口中的抽象方法必须定义为public访问权限,在接口中如果不写也默认是public访 ...

  7. JAVA面对对象(三)——Super、static、final关键字

    Super 使用super关键字可以直接调用父类中的构造方法.属性.普通方法 super调用父类构造方法的操作,与this调用构造方法一样,语句必须放在子类构造方法的首行 public class P ...

  8. JAVA面对对象(二)——继承、方法的覆写

    1.继承就是基于已存在的类构造一个新类,继承已存在的类就能复用类的方法和属性,并且能够添加新的方法和属性.也就是子类和父类 2.一个父类可以拥有多个子类,一个子类只允许有一个父类 3.用extends ...

  9. JAVA面对对象(一)——封装

    1.封装思想:将对象的属性和行为封装起来的载体是类,类通常对客户隐藏其实现的细节 2.封装就是将属性私有化(private),并提供公共的方法(public)访问私有属性 3.通过封装,实现对属性数据 ...

随机推荐

  1. UVA548-Tree(二叉树数组表示)

    Problem UVA548-Tree Accept: 2287  Submit: 13947 Time Limit: 3000 mSec Problem Description You are to ...

  2. [转]qtcreator中常用快捷键总结

    F1 查看帮助 F2 跳转到函数定义(和Ctrl+鼠标左键一样的效果) Shift+F2 声明和定义之间切换 F4 头文件和源文件之间切换 Ctrl+ 欢迎模式 Ctrl+ 编辑模式 Ctrl+ 调试 ...

  3. 升级pip后出现ImportError: cannot import name main

    https://blog.csdn.net/accumulate_zhang/article/details/80269313

  4. vue-resource get/post请求如何携带cookie的问题

    vue-resource get/post请求如何携带cookie的问题 当我们使用vue请求的时候,我们会发现请求头中没有携带cookie传给后台,我们可以在请求时添加如下代码:vue.http.o ...

  5. Luogu4345 SHOI2015 超能粒子炮·改 Lucas、数位DP

    传送门 模数小,还是个质数,Lucas没得跑 考虑Lucas的实质.设\(a = \sum\limits_{i=0}^5 a_i 2333^i\),\(b = \sum\limits_{i=0}^5 ...

  6. Ionic App之国际化(1)单个参数的处理

    最近的app开发中需要考虑多语言国际化的问题,经查资料,目前大部分使用的是angular-translate.js这个组件,网站说明是这个:https://angular-translate.gith ...

  7. 【LGR-049】洛谷7月月赛

    Preface Luogu八月月赛都结束了我才来补七月月赛 这次月赛还是很狗的,在绍一的晚上恰逢刮台风,然后直接打到一半断网了 结果都没有交上去GG 感觉这次难度适中,解法也比较清新自然吧,十分给个九 ...

  8. @Vue/Cli 3 关于 render 空的处理

    问题场景 vue-cli 3 在打包部署时候会出现 dist folder not working "Uncaught TypeError: Cannot set property 'ren ...

  9. System.Data.SqlClient.SqlException:“对象名 'customer' 无效。"

    连接数据库出错, 错误原因:表名错误.

  10. 对于ps基本操作的归纳

    1.开始新的制作 1)新建 快捷键:Ctrl+n      格式:宽高根据要求自选:颜色模式常用R(红)G(绿)B(蓝) 2)打开电脑上的图片 快捷键:Ctrl+o 2.选框工具 快捷键:M 作用:能 ...