抽象类、多态

本文探讨了Java中的抽象类和多态概念。抽象类是含有抽象方法的类,不能实例化,主要用来被继承。抽象方法只有声明,没有实现。抽象类必须作为父类存在,且`abstract`关键字不能与`private`或`static`一起使用。多态则是指一个对象在继承体系中可以有多种状态,允许父类引用指向子类对象,增强了代码的可扩展性。多态的前提是继承和重写,成员变量只能访问父类中的,成员函数则根据是否重写决定调用哪个类的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

抽象类

多态


抽象类

所谓抽象,就是模糊不清的,那么抽象类就是模糊不清的类、不具体的类。

当我们在抽取一个父类的时候,发现子类当中的一些共同方法在父类中无法实现,并且这些方法只能在子类中具体实现时,父类当中这些函数就只保留函数的声明即可,不必写函数体。那么此时这个函数就是抽象函数!有抽象函数就有抽象类!

特点:   

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;
	}
}

结果展示:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值