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

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

  • 包含一个抽象方法的类必定是抽象类
  • 抽象类和抽象方法都要使用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. DataStream_操作基本类型数据的流对象

    import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; imp ...

  2. File类_常见的方法(获取目录内容)

    获取当前目录下的文件以及文件夹,包含隐藏文件 调用list方法的File对象中封装的必须是目录否则会发生空指针异常,如果封装的是系统级的目录也会发生空指针异常(因为数组根本就没有创建成功) 如果目录存 ...

  3. 控件_DatePicker

    import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view ...

  4. P2665 [USACO08FEB]连线游戏Game of Lines

    本着dp的心情,结果是道水题STL  set就行了 题意:看有多少种斜率(题在那里半天说多少直线(不平行的)),其实就是找斜率的种类 #include<cstdio> #include&l ...

  5. python3 练习题 day01

    #练习题:'''1.简述变量命名规范'''#变量名由数字.字母.下划线组成#变量名可以字母和下划线开头,不能以数字开头,并且不能全为数字#变量名不能太长,且要有意义#最好使用驼峰或下划线格式命令#变量 ...

  6. nodejs写入json文件,格式化输出json的方法

    假如我需要把data序列化成json字符串,然后写入data.json文件中,代码如下: let str = JSON.stringify(data) fs.writeFile('data.json' ...

  7. DRF跨域,简单请求和复杂请求

    跨域就是跨域名,跨端口 - 为什么会有跨域? 浏览器有同源限制策略 - 绕过浏览器同源策略就可以跨域 -  方式一: jsonp(利用浏览器特性) 在html动态创建script标签 同源策略会阻止a ...

  8. 用Qt程序打开.txt 文件的时候,出现乱码的情况

    打开*.txt 文件出现乱码的情况,说明编码格式不对,一般的Windows下创建的txt 文件,到ubuntu 系统中打开会出现乱码的情况, 下面的代码读取文件,并且转化编码格式 void MainW ...

  9. Android学习之基础知识八—Android广播机制实践(实现强制下线功能)

    强制下线功能算是比较常见的了,很多的应用程序都具备这个功能,比如你的QQ号在别处登录了,就会将你强制挤下线.实现强制下线功能的思路比较简单,只需要在界面上弹出一个对话框,让用户无法进行任何操作,必须要 ...

  10. java 文件夹的复制

    复制文件夹字节流BufferedInputStream,BufferedOutputStreamFileInputStream,FileOutputStream问题分解(1) 复制一个文件 copyF ...