赵雅智_java抽象类

  • 抽象方法:基类中定义的方法,有时候只有在派生类中才能写出方法体。

    • 抽象方法声明格式: [修饰符] abstract  返回值类型 方法名([形式参数表]);
    • 抽象方法的特点
      • 抽象方法的返回值类型前有关键字abstract;
      • 抽象方法没有方法体;
      • 抽象方法的定义是一行单独语句,以分号结束;
      • 在抽象方法声明中使用static修饰符是错误的。
        例如,public abstract double area();
  • 抽象类:定义了抽象方法,这个类必须定义为抽象类。
    • 声明格式:[public]  abstract  class 类名{
                                    //类体(属性、非抽象方法、抽象方法、构造方法)
                                    //类体(初始化块、内部类、枚举类)   
                           }
    • 特点:
      • 抽象类不能创建自己的对象,使用new创建抽象类对象将产生错误。
      • 子类继承抽象类时,应该覆盖抽象类中的所有抽象方法,否则子类也必须定义为抽象类。
      • 构造方法不用于创建实例,用于被其子类调用
      • 含有抽象方法的类(直接定义抽象方法;继承抽象父,但没完全实现父包含的抽象方法)只能被定义成抽象类。抽象类中却并一定包含抽象方法。
  • 抽象方法和空方法体的方法不是同一个概念 public void test(){}
    • public abstract void test();是一个抽象方法,它根本没有方法体,即方法定义后面没有一对花括号
    • public void test(){}              一个普通方法,定义了方法体,只是方法体为空,因此这个方法不可以使用abstract来修饰
public abstract class Shape{//抽象类不能实例化
{
	private static double calcArea();//抽象方法
	private Shape(){}
	public Shape(String name){
		System.out.println(name+"Shape Created");
	}
	public String toString(){
		return "this is shape"
	}
}

public class Circle extends Shape{
{
	public float r;
	private final float P1 = 3.14;
	public Circle(String name,float r){
		super(name);
		this.r=r;
	}
		
	public double calcArea(){//子类Circle,必须重写Shape类中的抽象方法 ,否则Circle就是一个抽象类
		return P1*r*r;
}

public class Rectangle extends Shape{
{
	public float width;
	public float height;
	public Rectangle(String name,float width,float height){
		super(name);
		this.width = width;
		this.height = height;
	}	
	public double calcArea(){
		return width*height;
	}
	public static void main(String[] args){
		Shape s1 = new Circle("圆形,32.5f");
		Shape s2 = new Rectangle("矩形,3,5");
		System.out.println(s1.calcArea);
		System.out.println(s2.cilcArea);
}
  • 注意:
    • final和abstract永远不能同时使用。
    • abstract不能用于修饰属性、局部变量、饰构造方法,。抽象类里定义的构造方法只能是普通构造方法。
    • static和abstract不能同时修饰某个方法,即没有所谓的类抽象方法。
    • abstract关键字修饰的方法必须被其子类重写才有意义,否则这个方法将永远不会有方法体,因此abstract方法不能定义为private访问权限。
  • 抽象类的作用
    • 代码重用--子类可以重用抽象父类中的属性和非抽象方法;
    • 规划--抽象类中通过定义抽象方法规划了其所有子类必须要实现的功能。
    • 模板模式:抽象类作为多个子类的通用模板,子类在抽象类的基础上扩展、改造,但子类总体上会保留抽象类的行为方式。
    • 抽象类不能实例化,但抽象类可作为变量的类型和方法形参类型,可将抽象类子类的对象赋给该变量或做方法的实参。
      Shape s=new Rectangle();
      public static String ShowShapinfo(Shape item){ 
      if(item instanceof Rectangle){
      	Rectangle r=(Rectangle)item; 
      	//其他代码 } 
      }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值