面向对象——抽象
Posted 果子儿酱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象——抽象相关的知识,希望对你有一定的参考价值。
1.抽象类
编写-个类时, 为该类定义-些方法, 这些方法用于描述该类的行为方式,这些方法都有具体的方法体,但在某些情况下,某个父类仅知道其子类应该包含哪些方法,却无法准确地知道子类实现这些方法的细节。如定义-个 图形类( Shape)作为诸如三角形、菱形以及矩形等图形的父类,在该父类中定义calcPerimeter()方法,该方法用于计算图形的周长,但不同的子类图形计算周长的方式大相径庭,所以导致Shape类的calcPerimeter()方法无法运用某个固定的计算图形周长的公式来计算其子类的周长。
在Java中,可以将calcPerimeter()方法定义为抽象方法,抽象方法没有具体的方法实现,该方法必须由其继承的子类重写,这样该方法就起到了约束规范的作用,又不影响类最初的设计思路。
2.抽象方法和抽象类
抽象类是专门设计用来让子类继承,抽象方法必须被子类重写。
在Java语言中,使用abstract关键字修饰一个类时 ,该类就是抽象类,使用abstract关键字修饰一个方法时该方法即为抽象方法。
抽象类和抽象方法的规则如下:
(1) -个抽象 类中可以不定义抽象方法,但是只要类中有一个抽象方法,则该类一定是抽象类。
(2)抽象类不能被实例化,即不能被new创建一个 实例对象。
(3)如果一个子类继承一 个抽象类, 则子类需要通过覆盖的方式来重写该抽象类中的所有抽象方法。如果子类没有完全重写抽象父类中所有的抽象方法,则子类仍是抽象的。
(4)抽象方法可以与public、protected 复合使用,但不能与final、private 和static复合使用。
使用抽象类和抽象方法的具体操作详见示例
(2)创建三角形类(ringle)
该类继承ShapeE public class Triangle extends Shapel
IIEXEFFil
private double х
private double у;
private double Z
//定义有参构造方法
public Triangle(String color,double x,double y,double z) (super(color);//调用父类构造器
this.setSide(x, y, z);
//设置三角形三边
public void setSide(double х, double y,double z)(
if(x>y+z ll y>x+Z ll z>x+y)f
System.out.printn("三角形两边之和必须大于第三边"); return
this.x=x;this.y=y;this.z=z;
//重写父类计算周长的方法
public double calcPerimeter() ( return x+y+z;
public String getType() l return 'EfJ ",
abstract不能用于修饰属性、修饰局部变量,也不能用于修饰构造器。
3. 抽象类的作用
抽象类不能被实例化,只能作为父类被继承。从语义的角度而言,抽象类是从多个具体类中抽象出来的父类,从多个具有相同特征的类中抽象出一个抽象类,以该抽象类作为其子类的模板,从而避免了子类设计时的随意性。 抽象类体现的就是一种模 板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。
编写个抽象父类 ,父类提供多个子类的通用方法,并且将 一个或多个 方法留给其子类实现, 这就是一种模板模式,模板模式是一种常见的设计模式。
(1)创建速度表类(SpeedMeter),作为抽象的模板父类,代码如下:
public abstract class SpeedMeter
private double trunRate; // 转速/1将返回车轮半径的方法定义为抽象方法 public abstract double "getRedius();
/1定义计算速度的通用算法
public double getSpeed()
//速度=车轮半径*2*π*转速
return 2*3.14*getRedius()*getTrunRatel
public double getTrunRate() l return trunRate;
public void setTrunRate(double trunRate) I this .trunRate = trunRate;
4. final 修饰符
final关键字可以用于修饰类、变量和方法。final 修饰变量时,表示该变量一旦获得了初始值就不可能被改变, final 修饰的类不能被继承,final 修饰的方法可以被继承但不能被重写。
4.2.1 final 成员变量
对于final修饰的成员变量而言,一 旦赋初始值就不能被重新赋值,如果既没有在定义成员变量时指定初始值,也 没有在构造器中为成员变量指定初始值,那么这些成员变量的值将一直 是系统分配的默认值,这些成员就失去了存在的意义。
final 修饰的类属性、实例属性可以指定初始值的部分如下:
(1)类属性:必须在静态初始化块或声明该属性时指定初始值。
(2)实例属性:必须在声明该属性或构造器中指定初始值。
final修饰成员变量的具体操作详见示例4.3。
public class FinalVariable
//定义成员变量时指定默认值
private final int index=6;
//在构造器中对成员变量赋初始值
private final String language;
//该静态变量在静态代码块中对成员变量赋初始值 private final static int length;
private final int size;
//构造器
public FinalVariable()
this.language="Java语言";
//final变量一旦赋初值,则不可修改
this.language="C语言";
//静态代码块static
length= 100;
//在普通方法中为final变量赋值
public void changeFinalVar()
//不能在普通方法中为final 变量赋初值this.size=10;
以上是关于面向对象——抽象的主要内容,如果未能解决你的问题,请参考以下文章