JAVA面对对象(四)——抽象类
抽象类的作用类似“模板”,可以根据它的格式来修改、创建新的类;但是不能直接由抽象类创建对象只能通过抽象类派生出新的类,再由它来创建对象;抽象类的使用同样是单继承,即一个子类只能继承一个抽象类
抽象类的定义及使用规则:
- 包含一个抽象方法的类必定是抽象类
- 抽象类和抽象方法都要使用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面对对象(四)——抽象类的更多相关文章
- java 面对对象(抽象 继承 接口 多态)
什么是继承? 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 多个类可以称为子类,单独这个类称为父类.超类或者基类. 子类可以直接 ...
- Java笔记(十四)……抽象类与接口
抽象类概念 抽象定义: 抽象就是从多个事物中将共性的,本质的内容抽取出来. 例如:狼和狗共性都是犬科,犬科就是抽象出来的概念. 抽象类: Java中可以定义没有方法体的方法,该方法的具体实现由子类完成 ...
- java面对对象 关键字this super
this:this是指向对象本身的一个指针,成员函数内部指向当前类的对象 其实this主要要三种用法: 1.表示对当前对象的引用! 2.表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是 ...
- java面对对象(六)--内部类、匿名内部类
内部类 可以在一个类的内部定义另一个类这种类成为内部类或嵌套类,比如: class Outer{ … class Inner{ …. } } class Outer1{} // 这个Inner1不是O ...
- java面对对象入门(4)-程序块初始化
Java实例初始化程序是在执行构造函数代码之前执行的代码块.每当我们创建一个新对象时,这些初始化程序就会运行. 1.实例初始化语法 用花括号创建实例初始化程序块.对象初始化语句写在括号内. publi ...
- JAVA面对对象(五)——接口
接口由全局常量和公共的抽象方法组成,接口的定义格式: interface 接口名称{ 全局常量; 抽象方法; } 接口中的抽象方法必须定义为public访问权限,在接口中如果不写也默认是public访 ...
- JAVA面对对象(三)——Super、static、final关键字
Super 使用super关键字可以直接调用父类中的构造方法.属性.普通方法 super调用父类构造方法的操作,与this调用构造方法一样,语句必须放在子类构造方法的首行 public class P ...
- JAVA面对对象(二)——继承、方法的覆写
1.继承就是基于已存在的类构造一个新类,继承已存在的类就能复用类的方法和属性,并且能够添加新的方法和属性.也就是子类和父类 2.一个父类可以拥有多个子类,一个子类只允许有一个父类 3.用extends ...
- JAVA面对对象(一)——封装
1.封装思想:将对象的属性和行为封装起来的载体是类,类通常对客户隐藏其实现的细节 2.封装就是将属性私有化(private),并提供公共的方法(public)访问私有属性 3.通过封装,实现对属性数据 ...
随机推荐
- Go学习笔记01-环境搭建
最近想学学Go语言,就在笔记本上配置了Go的环境. 本人的运行环境为:Windows 10 1709. 1.下载安装包 到官网下载安装包,官网网址为:Go安装包下载地址 现在Go的最新版本为1.9.2 ...
- iframe无刷新跨域上传文件并获得返回值
原文:http://geeksun.iteye.com/blog/1070607 需求:从S平台上传文件到R平台,上传成功后R平台返回给S平台一个值,S平台是在一个页面弹出的浮窗里上传文件,所以不能用 ...
- JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配
Java栈与堆 堆:顺序随意 栈:后进先出(Last-in/First-Out). Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new.newarray.anewarray和mu ...
- python之面向对象进阶
接口类 抽象类 钻石继承 多态 鸭子类型 接口类 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface, ...
- swift class的虚函数表、扩展、@objc修饰、虚函数的派发方式研究
swift class的虚函数表.扩展.@objc修饰的研究 工具: swiftc -emit-sil BaseClass.swift | xcrun swift-demangle > Clas ...
- PHP 用 fsockopen()、fputs() 来请求一个 URL,不要求返回
项目需要,场景如下: 某个条件下需要调用接口发送多个请求执行脚本,但是由于每个请求下的脚本执行时间在半个小时左右,所以 就放弃返回执行结果,只要求能秒发送所以就可以. 代码如下: /** * 发起异步 ...
- rac添加新节点的步骤与方法
[转载] https://www.cnblogs.com/hankyoon/p/5174465.html OS: [root@rac ~]# more /etc/oracle-releaseOracl ...
- MATLAB——神经网络pureline激活函数
- 理解JSON.stringify()高级用法
一:JSON.stringify() 该方法是把javascript对象转换成json字符串. 基本语法:JSON.stringify(value, [, replacer], [, space]) ...
- Android popupMenu
popupMenu = new PopupMenu(ActivityHousesNumList.this, imageViewhousesnum1); popupMenu.getMenuInflate ...