基础部分的说明基本结束了。 从今天开始进入Java提升篇的部分。 这个部分的内容比之前的内容要复杂得多。 不明白的地方可以多次看,请做好这样的觉悟。 还不能理解的部分一定是我说话不生动。 我记得用信息提醒我。
是的,我没有时间。 快上车吧。
本文主要描述Java的抽象类。 抽象类是什么? 正如名字所示。 是非常“抽象”的类。 抽象是具体的代词。 就像上司对你说的,大家都说努力工作、努力工作就能涨工资,很多时候只是不说就很抽象。 (2333 ),说实话,是有抽象方法的类。 抽象的方法是什么? 是具有abstract关键字限定的方法,抽象方法并不是只通过声明来实现的,只能由子类继承来实现。 说了这么多,还是举个栗比较好:
//*
* @author Frank
* @create 2017/11/21
* @description
*/
公共适配器类指南{
abstract void print (;
}
这里也使用了Goods类,声明了抽象的商品类。 可以看出那里有用abstract关键字修饰的方法print。 因此,此方法是抽象方法。 具有抽象方法的Goods类也必须成为抽象类,并使用abstract关键字进行限定。
抽象类与普通类几乎相同,但不能实例化抽象类。
你可能会想,无法实例化的类带来了什么? 这个不知道吧。 很明显,抽象类是为了继承而产生的,继承了抽象类的非抽象类必须实现父类的抽象方法。 否则只能定义为抽象类。 那样有什么好处呢? 在这里设定一个剧本。 那是商品信息展示。 需要输出各商品的说明信息,例如标题、价格等各种参数。 其中的一部分参数并不是所有的商品都是通用的。 例如,画面尺寸、续航时间。 先得到商品的各项信息,再统一打印显然不容易,所以把这个打印的事情交给子类吧。 父类只需要声明一个抽象类。 这就相当于父亲给儿子一个任务:“继承我的财产,你们必须先完成这些任务。”
Goods等级下有手机、电视、电脑等商品,再定义三个等级,全部继承Goods等级,即可实现商品的统一管理。
公共类phone extends goods {
//手机类的输出
@Override
void print () }
system.out.println('phoneprint.' );
}
}
publicclasscomputerextendsgoods {
//计算机系统输出
@Override
void print () }
system.out.println (' computer print.' );
}
}
publicclasstelevisionextendsgoods {
//电视系统输出
@Override
void print () }
system.out.println (' television print.' );
}
}
定义了三个类。 接下来我们来测试一下:
公共类测试{
publicstaticvoidmain (string [ ] args ) {
Goods[] goodsList=new Goods[3];
goodsList[0]=new Phone (;
goodsList[1]=new Computer (;
goodsList[2]=new Television (;
谷歌:谷歌列表(for ) )。
g.print (;
}
}
输出如下。
手机打印。
计算机打印。
电话打印。
这一幕似乎很相似,还记得之前的继承和多态性的板栗吗? 嗯,是的抽象类与普通类相似。 继承的区别在于非抽象子类必须实现抽象父类的抽象方法,而普通父类则不需要。
也就是说,抽象类是对某一类事物的抽象,虽然在多个类中出现相同的功能,但是主体不同的话,上面的板栗、手机、电脑、电视这样的商品需要打印信息,因为它们有共同的属性,所以是用于统一管理这些商品输出信息的商品
现在,让我们上面的栗子变得完美,不要看起来像鸡肋。 抽象类定义公共属性和方法(如title和price ),并定义每个子类特有的属性和方法。
package com.frank.abstractclass;
//*
* @author Fran
k* @create 2017/11/21
* @description
*/
public abstract class Goods {
//定义各个类共有的属性
private String title;
private Double price;
//定义构造器
public Goods(String title, Double price) {
this.title = title;
this.price = price;
}
//定义设置器和访问器
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
//声明抽象打印方法
abstract void print();
}
ackage com.frank.abstractclass;
/**
* @author Frank
* @create 2017/11/21
* @description
*/
public class Phone extends Goods {
//定义私有的属性
private Double screenSize;//屏幕大小
private Double batteryLife;//续航时间
//重载构造器
public Phone(String title, Double price,Double screenSize,Double batteryLife) {
super(title, price);
this.screenSize = screenSize;
this.batteryLife = batteryLife;
}
//定义子类特有的方法
public Double getScreenSize() {
return screenSize;
}
public void setScreenSize(Double screenSize) {
this.screenSize = screenSize;
}
public Double getBatteryLife() {
return batteryLife;
}
public void setBatteryLife(Double batteryLife) {
this.batteryLife = batteryLife;
}
//手机类输出
@Override
void print() {
System.out.println("Phone print------");
System.out.println("Title:"+getTitle());
System.out.println("Price:$"+getPrice());
System.out.println("ScreenSize:"+getScreenSize()+" inches");
System.out.println("BatteryLife:"+getBatteryLife()+" h");
}
}
package com.frank.abstractclass;
/**
* @author Frank
* @create 2017/11/21
* @description
*/
public class Television extends Goods {
//定义子类特有属性
private Double screenSize;//屏幕尺寸
private String resolution;//分辨率
//重载构造器
public Television(String title, Double price, Double screenSize, String resolution) {
super(title, price);
this.screenSize = screenSize;
this.resolution = resolution;
}
public Double getScreenSize() {
return screenSize;
}
public void setScreenSize(Double screenSize) {
this.screenSize = screenSize;
}
public String getResolution() {
return resolution;
}
public void setResolution(String resolution) {
this.resolution = resolution;
}
//电视机类输出
@Override
void print() {
System.out.println("Television print------");
System.out.println("Title:"+getTitle());
System.out.println("Price:$"+getPrice());
System.out.println("ScreenSize:"+getScreenSize()+" inches");
System.out.println("Resolution:"+getResolution());
}
}
接下来测试一下:
package com.frank.abstractclass;
/**
* @author Frank
* @create 2017/11/21
* @description
*/
public class Test {
public static void main(String[] args) {
Goods[] goodsList = new Goods[3];
goodsList[0] = new Phone("IphoneX",9688.00,5.8,24.0);
goodsList[1] = new Computer("Alienware15C-R2738",17699.00,"i7-7700HQ","GTX1060");
goodsList[2] = new Television("SAMSUNG UA78KU6900JXXZ",21999.00,78.0,"4K");
for (Goods g:goodsList)
g.print();
}
}
输出如下:
Phone print------
Title:IphoneX
Price:$9688.0
ScreenSize:5.8inches
BatteryLife:24.0h
Computer print------
Title:Alienware15C-R2738
Price:$17699.0
CPU:i7-7700HQ
GraphicsCard:GTX1060
Television print------
Title:SAMSUNG UA78KU6900JXXZ
Price:$21999.0
ScreenSize:78.0inches
Resolution:4K
想必现在对于抽象类有了更好的理解了吧。
现在做一个小小的总结:
1,抽象方法一定在抽象类中。
2,抽象方法和抽象类都必须被abstract关键字修饰。
3,抽象类不可以用new创建对象,因为存在抽象方法,抽象方法没有具体实现,无法执行。
4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。
至此,抽象类讲解完毕,欢迎大家继续关注!
以上就是深入理解Java抽象类的详细内容,更多关于Java抽象类的资料请关注脚本之家其它相关文章!