目录
抽象类
所谓抽象,就是模糊不清的,那么抽象类就是模糊不清的类、不具体的类。
当我们在抽取一个父类的时候,发现子类当中的一些共同方法在父类中无法实现,并且这些方法只能在子类中具体实现时,父类当中这些函数就只保留函数的声明即可,不必写函数体。那么此时这个函数就是抽象函数!有抽象函数就有抽象类!
特点:
1.抽象类能否创建对象?不能 对象本身是一个具体的东西 而抽象类中含有不具体的内容
2.抽象类必须作为父类存在吗?必须 抽象类就等着被继承呢!
3.抽象类和一般类有什么区别?就是一般类的特殊情况,唯一的区别只在于抽象类中有抽象函数!
4.抽象类中必须有抽象函数吗?不一定 AWT界面开发
5.abstract这个关键字不能和那些关键字共存?
private 抽象函数就等着被子类重写实现呢!
static 静态是优先于对象存在的,在加载静态数据的时候,肯定是具体的数据。类名.抽象函数 很尴尬!
如果抽象函数可以被静态 那么我们还需要对象干什么?
多态
多种状态:就是指一个对象可以有多种状态(他在继承体系中的位置变化) D->C->B->A->Animal
位置的变化只能是向上变 但不能低于自身
对于C而言 可以当做B来看 也可以当做A来看 也可以当成Animal 小明 男人 人 动物
小明的学校开家长会,小明不想让他爸爸去,他让大明去,那大明就是小明他哥。大明冒充Dad去参加家长会的话,那么所表现出来的行为应该符合他爸行为
所以不同的视角,不同的角色。对象本身并没有变,只不过我们需要对象在不同的场合表现出相对应的行为
在Java当中,多态代码表现就是父类引用指向子类的对象
多态的前提:继承 重写
多态的好处:对代码的功能进行了可扩展性
子类对象可以当做父类对象去使用 但是有限制 只能调用父类函数或重写的函数
不能使用子类特有的行为
多态当中 成员变量的特点:只能访问父类中的成员变量
多态当中 成员函数的特点:
如果子类没有重写 且父类中有 调用父类的
如果子类有重写 调用子类重写的
如果不存在重写 父类没有 那就报错了!
下面我们来个小例题,写一写三角形,矩形,圆形的面积。
具体来看代码实现
public class GraphicDemo {
/*
主函数
*/
public static void main(String[] args){
/**
多态——父类引用指向子类对象
*/
Graphic g1=new Triangle();
System.out.println("三角形的面积:"+g1.getArea());
System.out.println("三角形的周长:"+g1.getLength());
Graphic g2=new Rectangle();
System.out.println("矩形的面积:"+g2.getArea());
System.out.println("矩形的周长:"+g2.getLength());
Graphic g3=new Triangle();
System.out.println("圆形的面积:"+g3.getArea());
System.out.println("圆形的周长:"+g3.getLength());
}
}
/*
抽象类——父类
关键字——abstract
*/
abstract class Graphic{
//面积
public abstract double getArea();
//周长
public abstract double getLength();
}
/**
求两点之间的距离
*/
class Point{
private double x;
private double y;
private double r;
/**
构造函数——初始化成员数据
*/
public Point(double x,double y){
this(x,y,0);
}
public Point(double r){
this(0,0,r);
}
public Point(double x,double y,double r){
this.x=x;
this.y=y;
this.r=r;
}
public double getR(){
return this.r;
}
public double distance(Point p){
return Math.pow((this.x-p.x)*(this.x-p.x)+(this.y-p.y)*(this.y-p.y),0.5);
}
}
/**
求三角形的周长
*/
class Triangle extends Graphic{
//三个点 //三个边
@Override
public double getArea(){
Point p1=new Point(0,0);
Point p2=new Point(4,0);
Point p3=new Point(0,4);
return p1.distance(p2)*p1.distance(p3)*0.5;
}
@Override
public double getLength(){
Point p1=new Point(0,0);
Point p2=new Point(4,0);
Point p3=new Point(0,4);
return p1.distance(p2)+p1.distance(p3)+p2.distance(p3);
}
}
/**
求矩形的面积周长
*/
class Rectangle extends Graphic{
//四个点 //四个边
@Override
public double getArea(){
Point p1=new Point(0,0);
Point p2=new Point(4,0);
Point p3=new Point(0,4);
return p1.distance(p2)*p1.distance(p3);
}
@Override
public double getLength(){
Point p1=new Point(0,0);
Point p2=new Point(4,0);
Point p3=new Point(0,4);
return (p1.distance(p2)+p1.distance(p3))*2;
}
}
/**
求圆的面积和周长
*/
class Circle extends Graphic{
//半径
@Override
public double getArea(){
Point p1=new Point(0,0,4);
return p1.getR()*3.14*p1.getR();
}
@Override
public double getLength(){
Point p1=new Point(0,0,4);
return p1.getR()*3.14*2;
}
}
结果展示: