abstract关键字

abstract抽象的意思。想一个银行的账户系统(定期账户和活期账户)。对于定期活期账户来说,它们都有不同的利息计算方式。我们如何来实现呢?

一种解决的方式是:写一个账户类,写两个子类,一个定期账户子类,一个活期账户子类。但是父类账户中的方法有该如何来写呢?即使可以写,很显然不可能写所有子类满足子类的方法吧!如果让子类重写父类的方法,很显然也得满足重写的条件。就是方法名相同,返回类型相同,参数列表相同。试想一下,两个之类能够重写同样一个父类的某个方法吗?在某种意义下,这种参数列表相同的概率是很小的啊,如果还有其他的账户,有该如何呢?显然这种方式是不行的啊。毕竟在写当前的账户的时候,还要考虑的将来的是否会有新的账户,如何能够扩展,而不至于影响到当前的账户。一定要符合开闭原则。

既然父类中写计算利息的方法是不好写的。那就索性不写了。这时候我们引入abstract关键字。这个关键字的引入,很好地解决的上述的问题。

abstract 可以修饰类和方法,代表未实现的方法或者不可实现的类。类的不可实现就是用该类的方法无法创建对象。

抽象类的写法

public abstract class  A{ }


抽象方法的写法

public abstract 返回值类型  方法名(参数列表)[抛出异常];


抽象方法的结束是以分号结束的而不是大括号,也就是说是用分号代替大括号。抽象的方法是没有内容的,所以抽象的方法不能够调用。因为调用的时候,虚拟机不知道该做什么。

抽象类的两个特点:

        1)可以申明抽象类型的变量。

        2)抽象类不能用new来调用构造,创建对象(抽象类的构造是存在的)。

顺便提一下,只有匿名内部类没有构造。

上面提到了两点,抽象类不能创建对象,抽象的方法没有构造。

例如A一个抽象类,B是抽象类的一个子类。

A  s = new B();  //这是一段发生多态的代码,但是跟平常的多态不一样

抽象类的一个引用执行的是一个非抽象子类的对象。抽象类中抽象方法的实现一定要依赖与之类重写来实现。

现在有两句非常重要的话,他告诉了我们抽象类和抽象方法的一些约定:

       1)抽象类当中未必含有抽象的方法。

        2)抽象的方法所在的类一定是抽象类。

我们可以证明第二点:实现一个抽象的方法,是不能够呗虚拟机调用的。如果他写在了非抽象类当中。显然这个类可以通过new关键字来创建一个对象。而创建的这个对象,是可以调用类里面的说有public方法的,但是调用了这个抽象的方法的时候,虚拟机去不知道要做什么,很显然这是不符合逻辑的。所以抽象方法一定放在抽象的类中。

我们用图类描述一下类和方法的关系:

抽象的类就是用来被继承的,抽象的方法是用来被重写的。

抽象的好处:

     1)定义了一种规范。

     2)抽象具有强制性。在子类重写抽象父类的抽象方法是时候是有体现的。

所有的抽象类的引用都指向了一个非抽象子类的一个对象。

//模板设计模式
public abstract class Account {  //含有抽象方法的类,是抽象类
	private double money = 1000;
	public abstract double get();//抽象类中可以没有抽象方法
	public double getMoney() {
		return money;
	}
	public void setMoney(double money) {
		this.money = money;
	}
	
}
public class DAccount extends Account{
	public double get(){
		return getMoney()*0.03;
	}

}
public class HAccount extends Account{
	public double get(){
		return getMoney()*0.02;
	}

}

public class Test1 {

	public static void main(String[] args) {
		Account s1 = new DAccount();
		Account s2 = new HAccount();
		System.out.println(s1.get());
		System.out.println(s2.get());
	}

}
上边的代码编写格式被称为是模版设计模式。
abstract不能与static同时来修饰一个方法。因为static修饰的一些东西都是在类加载的时候放到内存中的,是先与对象的穿件的。而abstract修饰的方法是用来呗子类重写的,想想。static修饰的东西先于对象的创建,而子类重写该方法的时候,很想让子类得继承抽象的父类。而 子类中的方法只有在创建对象的时候才放在内存当中。由于时间上有很大的差异,所以,static和abstract是不能同时修饰一个方法的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值