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

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

  • 包含一个抽象方法的类必定是抽象类
  • 抽象类和抽象方法都要使用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. 前端性能优化成神之路--图片懒加载(lazyload image)

    图片懒加载(当然不仅限于图片,还可以有视频,flash)也是一种优化前端性能的方式.使用懒加载可以想要看图片时才加载图片,而不是一次性加载所有的图片,从而在一定程度从减少服务端的请求 什么是懒加载 懒 ...

  2. Linux基础第五课——用户管理

    用户管理 一个用户必须有一个主组 一个用户可以拥有多个组 但是必须一个主组 其它组是临时组 一个组可以拥有多个用户 用户的信息放到 /etc/passwd 用户的密码 存入 /etc/shadow 组 ...

  3. Javascript中的undefined、null、""、0值和false的区别总结

    在程序语言中定义的各种各样的数据类型中,我们都会为其定义一个"空值"或"假值",比如对象类型的空值null,.NET Framework中数据库字段的空值DBN ...

  4. Jmeter之mysql性能测试

    Jmeter官网地址:https://jmeter.apache.org/ 作为开发人员,必要的性能测试还是需要掌握的,虽然配置druid可以比较直观获得sql的执行时间,那些表被访问的比较多等等,但 ...

  5. 使用cmd导出mysql数据到excel

    windows环境 (有时候复制的不好使,最好可以手动输入一次试试) 1.windows + R 输入cmd弹出命令框 2.cd  C:\Program Files\MySQL\MySQL Serve ...

  6. Html5 标签二(超链接)

    1.五种超链接形式 2.超链接属性 一 五种超链接 <!DOCTYPE html> <html lang="en"> <head> <me ...

  7. 【Luogu P1074】靶形数独

    Luogu P1074 题意:给一个数独,问怎么填会使每个位置填的数乘以它的权值得到的和最大.其中每个位置的权值在题面中给出了. 思路:首先我们考虑搜索.由于我们不可能搜每个格子取太多的数,所以我们从 ...

  8. Identity(四)

    本文摘自:ASP.NET MVC 随想录——探索ASP.NET Identity 身份验证和基于角色的授权,中级篇 探索身份验证与授权 在这一小节中,我将阐述和证明ASP.NET 身份验证和授权的工作 ...

  9. (转)deb制作文件详解

    转自:http://blog.chinaunix.net/uid-16184599-id-3041024.html 如何制作Deb包和相应的软件仓库,其实这个很简单.这里推荐使用dpkg来进行deb包 ...

  10. mac brew update 报错

    环境为mac, 总共报了三种错误. 对应三种不同的解法. 1.   第一种如下, 提示 1.8 的版本找不到 $ brew update /usr/local/bin/brew: /usr/local ...