面试题:
面向对象的基本特征:封装、继承、多态
面向对象的特征:封装、继承、多态、抽象
类:一类具有相同特性的事物的抽象描述。
抽象:不明确,不清楚,不确定
反义词:具体
1、什么情况下会用到抽象?
- 我们要声明(1)圆类(2)矩形类等类型,发现这些子类中有共同的特征,需要提取到公共父类Graphic中,
- 但是在公共父类中又无法给出具体的方法的实现,那么这样的方法我们声明为抽象方法。
- 当一个类包含了抽象方法,这个类必须也是抽象的。
2、抽象有两种:
(1)抽象方法
(2)抽象类
3、抽象方法
语法格式:
【权限修饰符】 abstract 返回值类型 方法名(【形参列表】);
特点:没有方法体
4、抽象类
语法格式:
【权限修饰符】 abstract class 抽象类名{
}
5、抽象类的特点
(1)抽象类是不能直接创建对象
(2)一个类包含了抽象方法,这个类必须是抽象类;
但是反过来,一个抽象类中可能没有抽象方法。
(3)抽象类中有没有构造器?或者说是否需要构造器?
抽象类一定有构造器,目的是给子类调用的。
(4)抽象类的存在的意义就是用来被继承的,
子类继承抽象类时,必须实现(重写)父类的所有抽象方法,否则子类也得是一个抽象类。
抽象类和非抽象类的区别:就是抽象类不能直接创建对象
我们要声明(1)圆类(2)矩形类等类型,发现这些子类中有共同的特征,需要提取到公共父类Graphic中, 但是在公共父类中又无法给出具体的方法的实现,那么这样的方法我们声明为抽象方法。
public class TestAbstract {
public static void main(String[] args) {
//Graphic g = new Graphic();//抽象类不能直接创建对象
//注意,这里创建的不是对象,是对象数组,还没有进行对象初始化
Graphic[] g = new Graphic[2];
g[0] = new Circle(2);
System.out.println(g[0].getArea());
g[1] = new Rectangle(3,5);
System.out.println(g[1].getArea());
}
}
abstract class Graphic{
private String name;
public Graphic() {
super();
}
public Graphic(String name) {
super();
this.name = name;
}
//从子类重抽取出共同的特征,发现无法给出具体的合理实现
//因为我们无法实现方法体,那么干脆就省略了方法体{},即不写,使用;结束
public abstract double getArea();
public abstract double getPrimeter();
}
class Circle extends Graphic{
private double radius;
public Circle(double radius) {
this.radius = radius;
}
public Circle() {
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getArea(){
return Math.PI * radius * radius;
}
public double getPrimeter(){
return 2 * Math.PI * radius;
}
}
class Rectangle extends Graphic{
private double length;
private double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
public Rectangle() {
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getArea(){
return length * width;
}
public double getPrimeter(){
return 2 * (length + width);
}
}