抽象类和抽象方法
Java 中,抽象类不能产生对象的实例。定义抽象类需要使用abstract
关键字。
语法:
[权限修饰符] abstract class
类名{
类体
}
使用abstract关键字定义的类叫抽象类;abstract关键字修饰的方法叫抽象方法。
语法:
[权限修饰符] abstract 方法返回值类型 方法名(参数列表);
说明:抽象方法时直接以分号结尾的,没有方法体,抽象方法本身没有任何意义,除非被重写,而承载这个抽象方法的抽象类必须被继承。也就是説,抽象类除了被继承之外,没有任何的意义。
总结:
使用抽象类和抽象方法时,需要遵从以下原则;
1) 在抽象类中,可以包含抽象方法,也可以不包含抽象方法,但是包含了抽象方法的类必须被定义为抽象类。
2) 抽象类不能被直接实例化,即使抽象类中没有声明抽象方法,也不能被实例化
3) 抽象类被继承后,子类需要重写抽象类中所有的抽象方法
4) 如果继承抽象类的子类也被声明抽象类,则可以不用重写父类中所有的抽象方法
5) 使用抽象类可能会出现这样的问题:程序中会有太多的冗余代码,同时父类的局限性很大
例:
Shape类:
package way_of_Class_practice;
public abstract class Shape {
public int length;
public int width;
public abstract void Area();
}
Circle类:
package way_of_Class_practice;
public class Circle extends Shape {
int r;
@Override
public void Area() {
// TODO Auto-generated method stub
double area = 3.14 * r * r;
System.out.println("输入半径为:" + r + " 的圆面积为" + area);
}
public static void main(String[] args) {
Circle circle = new Circle();
circle.r = 10;
circle.Area();
}
}
接口的声明及实现
接口是抽象类的延伸,可以将它看做一个纯粹的抽象的类,接口中所有的方法都是没有方法体的。
接口使用interface
关键字进行定义
语法:
[修饰符] interface 接口名 [extends 父接口名列表]{
[public] [static] [final] 常量;
[public] [abstract] 方法;
}
修饰符:可选,用于指定接口的访问权限
接口名:必选参数,用于指定接口的名称,接口名必须是合法的Java标志符。一般情况下,要求首字母大写
一个类实现一个接口可以使用implements关键字。
注意:在接口中定义的任何变量都自动是static和final的。因此,在接口定义变量时,必须进行初始化,而且,实现接口的子类不能对接口中的变量进行重新赋值
。
DrawImage接口:
package way_of_Class_practice;
public interface DrawImage {
public void show();
public void draw();
}
Rectangle1类:
package way_of_Class_practice;
public class Rectangle1
implements DrawImage {
public void show() {
System.out.println("你要画的是长方形");
}
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("画长方形");
}
}
Square类:
package way_of_Class_practice;
public class Square implements DrawImage {
public void show() {
System.out.println("您要画的是正方形");
}
public void draw() {
System.out.println("画正方形");
}
}
Main类:
package way_of_Class_practice;
public class main {
public static void main(String[] args) {
DrawImage[] image = { new Rectangle1(),
new Square() };
for (int i = 0; i < image.length; i++) {
image[i].show();
image[i].draw();
}
}
}
多重继承
在Java类中不允许多重继承,但使用接口可以实现多重继承
,因为一个类可以实现多个接口,这样可以将所有需要实现的接口放在implements关键字后,并使用英文“,”隔开。但这可能会在一个类中产生庞大的代码量
,因为实现一个接口时需要实现接口中所有的方法。
语法:
class 类名 implements 接口1,接口2,….,接口n
注意:使用多重继承时,可能出现变量或者方法名冲突的情况,若变量冲突,则需要明确指定变量的接口,即通过“接口名.变量”实现;而如果出现方法冲突时,则只要实现一个方法即可。
区分抽象类和接口
抽象类和接口类都包含可以由子类继承实现的成员,但抽象类是对根源的抽象,而接口是对动作的抽象。抽象类与接口的区别如下:
1) 子类只能继承一个抽象类,但是可以实现任意多个接口
2) 接口中的方法都是抽象方法,抽象类中可以有非抽象方法
3) 抽象类中的成员变量可以是各种类型,接口中的成员变量只能是静态常量
4) 抽象类中可以有静态方法和静态代码块等,接口中不可以
5) 接口没有构造方法,抽象类可以有构造方法