标签:
前言
在java中,有时候需要对类的行为进行提取,因此也就有了抽象类和接口的概念,这篇博客,小编来剖一下java中的抽象类和接口。
抽象方法和抽象类
抽象方法和抽象类的规则如下:
1.抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽线方法不能有方法体
2.抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。即使抽象类里不可包含抽象方法,这个抽象类也不能被创建实例。
3.抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。
4.含有抽象方法的类(包括直接定义了一个抽象方法;或继承实现了一个抽象父类,但没有完全实现父类包含的抽象方法;或实现了一个接口,但没有完全实现接口包含的抽象方法三种情况)能被定义成抽象类。
这四点特别的重要,需要反复看,反复的理解。
注意:需要注意的是抽象方法和空方法体不是同一个概念,例如public abstract void test();是一个抽象方法,它根本没有方法体,即方法定义后面没有一对花括号;但是public void test(){}方法是一个普通方法,它已经定义了方法体,只是方法体为空,因此这个方法不可使用abstract来修饰。
并且当使用abstract修饰类时,表明这个类只能被继承;当使用abstract修饰方法时,表明这个方法只能被实现即重写。而final修饰的类不能被继承,修饰的方法不能被重写。因此final和abstract永远不能同时使用。
并且当static修饰一个方法时,表明这个方法依托于类存在,通过类就可以访问到该方法,因此static不能和abstract同时存在。
下面来看一个实例,理解一下上面所说的理论知识
Shape抽象类
package com.test;
public abstract class Shape
{
{
System.out.println("执行Shape的初始化块...");
}
private String color="颜色";
// 定义一个计算周长的抽象方法
public abstract double calPerimeter();
// 定义一个返回形状的抽象方法
public abstract String getType();
// 定义Shape的构造器,该构造器并不是用于创建Shape对象,
// 而是用于被子类调用
public Shape(){}
public Shape(String color)
{
System.out.println("执行Shape的构造器...");
this.color = color;
}
// 省略color的setter和getter方法
public void setColor(String color)
{
this.color = color;
}
public String getColor()
{
return this.color;
}
}
Circle类
package com.test;
public class Circle extends Shape
{
private double radius;
public Circle(String color , double radius)
{
super(color);
this.radius = radius;
}
public void setRadius(double radius)
{
this.radius = radius;
}
// 重写Shape类的的计算周长的抽象方法
public double calPerimeter()
{
return 2 * Math.PI * radius;
}
// 重写Shape类的的返回形状的抽象方法
public String getType()
{
return getColor() + "圆形";
}
public static void main(String[] args)
{
Shape s2 = new Circle("黄色" , 3);
System.out.println(s2.getType());
System.out.println(s2.calPerimeter());
}
}
标签:
原文地址:http://blog.csdn.net/luckyzhoustar/article/details/50127353