抽象
一 面向对象的四大特征之一 抽象(abstract)
1.其中abstract 表示该类或该方法是抽象的,抽象方法只有声明没有实现。需要注意的是 abstract 关键字只能用于普通方法,不能用于 static 方法或者构造方法中。
2.抽象方法的 三个特征如下:
*抽象方法没有方法体
*抽象方法必须存在于抽象类中
*子类重写父类时,必须重写父类所有的抽象方法
3.注意
在使用 abstract 关键字修饰抽象方法时不能使用 private 修饰,因为抽象方法必须被子类重写,而如果使用了 private 声明,则子类是无法重写的。抽象方法也不能用final修饰(不能被重写),而抽象方法必须被重写。抽象类也不能用final修饰,用final修饰的类是不允许被继承的。
4.抽象类的定义和使用规则如下:
*抽象类和抽象方法都要使用 abstract 关键字声明。例:public abstract void eat();
*如果一个方法被声明为抽象的,那么这个类也必须声明为抽象的。
*抽象类不能实例化,也就是不能使用 new 关键字创建对象。
5.抽象方法存在的意义是什么?
根本意义:约定,自定义的规则。
约定:约定了返回值,访问权限,参数列表,需要在重写的时候去定义方法体。
6.抽象类可以有那些结构?
结构:属性,成员方法,构造器,抽象方法,常量。
7.抽象类里能不能没有抽象方法?
抽象类可以没抽象方法。但是不能被实例化,不能创建对象。
8.抽象类的构造器存在的意义:
为了约定子类的构造器必须和父类匹配。
*抽象方法的总结:
-
1.抽象方法必须是public或者是protected因为如果是private,不饿能被子类继承
-
子类便无法实现方法,默认情况下是可以的。默认情况是public
-
2.抽象类是不能被直接实例化,需要靠子类采用向上转型的方法处理。
-
3.抽象类必须有子类,使用extends继承,一个类只能继承一个抽象类。
-
4.子类(如果不是抽象类)则必须重写抽象类中的所有方法。
-
(如果子类没有实现父类的抽象方法)必须将子类也定义为abstract类。
例一:不同几何图形的面积计算公式是不同的,但是它们具有的特性是相同的,都具有长和宽这两个属性,也都具有面积计算的方法。那么可以定义一个抽象类,在该抽象类中含有两个属性(width 和 height)和一个抽象方法 area( ),具体步骤如下。
1.首先创建一个表示图形的抽象类 Shape,代码如下所示。
public abstract class Shape {
public int width; // 几何图形的长
public int height; // 几何图形的宽
public Shape(int width, int height) {
this.width = width;
this.height = height;
}
public abstract double area(); // 定义抽象方法,计算面积
}
2.定义一个正方形类,该类继承自形状类 Shape,并重写了 area( ) 抽象方法。正方形类的代码如下
public class Square extends Shape { //正方形继承图形
public Square(int width, int height) {
super(width, height);
}
// 重写父类中的抽象方法,实现计算正方形面积的功能
@Override
public double area() {
return width * height;
}
}
3.定义一个三角形类,该类与正方形类一样,需要继承形状类 Shape,并重写父类中的抽象方法 area()。三角形类的代码实现如下:
public class Triangle extends Shape {
public Triangle(int width, int height) {
super(width, height);
}
// 重写父类中的抽象方法,实现计算三角形面积的功能
@Override
public double area() {
return 0.5 * width * height;
}
}
4.最后创建一个测试类,分别创建正方形类和三角形类的对象,并调用各类中的 area() 方法,打印出不同形状的几何图形的面积。测试类的代码如下:
public class ShapeTest {
public static void main(String[] args) {
Square square = new Square(5, 4); // 创建正方形类对象
System.out.println("正方形的面积为:" + square.area());
Triangle triangle = new Triangle(2, 5); // 创建三角形类对象
System.out.println("三角形的面积为:" + triangle.area());
}
}
在该程序中,创建了 4 个类,分别为图形类 Shape、正方形类 Square、三角形类 Triangle 和测试类 ShapeTest。其中图形类 Shape 是一个抽象类,创建了两个属性,分别为图形的长度和宽度,并通过构造方法 Shape( ) 给这两个属性赋值。
在 Shape 类的最后定义了一个抽象方法 area( ),用来计算图形的面积。在这里,Shape 类只是定义了计算图形面积的方法,而对于如何计算并没有任何限制。也可以这样理解,抽象类 Shape 仅定义了子类的一般形式。
正方形类 Square 继承抽象类 Shape,并实现了抽象方法 area( )。三角形类 Triangle 的实现和正方形类相同,这里不再介绍。
在测试类 ShapeTest 的 main( ) 方法中,首先创建了正方形类和三角形类的实例化对象 square 和 triangle,然后分别调用 area( ) 方法实现了面积的计算功能。
二.接口(更高级的抽象)
1.接口的声明:使用interface关键字,直接代替class。例:public interface ch00();
2.Jdk1.7之前,接口中只能定义抽象方法,不能有属性,不能有方法,可以放静态常量,静态方法
3.jdk8以后,接口中也只能定义抽象方法,不能有属性,可以有默认的方法和静态方法。
*静态常量:public static final String NAME=" ...";
静态方法:public static void show();
抽象方法:public abstract void eat();
默认方法:public default void info();
4.接口中结构的特点:
-
接口中的方法默认为public abstract我们推荐就省略了,
-
接口中的常量默认是 public static final ,我们推荐就省略了。
5.接口存在的意义:约定,(比抽象类更加严格)
总结:
接口中的结构必须是public
接口可以被实现,实现类
例: 比如说A类 implements 接口,那么我们就说A是这个接口的实现类。
如果一个类实现了一个接口,他就需要重写接口中的所用方法。
实现接口时可以多实现的,继承只能是单继承的
开发中,如果一件事情可以通过继承和实现接口来解决,优先使用接口解决。
例:public class cat extends Animal implements Biology{
cat类同时继承了Animal并实现了Biology接口,
cat类可以叫Animal的子类 也可以叫Biology的实现类。
三.面试题
1. 继承抽象类和实现接口的异同?
异:继承只能单继承,但是接口可以多实现
同:都要重写
2.Java中只有单继承吗?
Java与类之间只有单继承,与接口之间有多继承。
四.匿名实现类
Abstr01 a01 = new Abstr01() {
@Override
public void show() {
System.out.println("重写过后的show方法");
}
};
a01.show();
学习情况:不太掌握



