菜鸟入坑程序员,的第一篇博客文。为什么入了程序坑,哎,往事休提,只能一路走到黑了。
问题发现:
做银行系统练习时,账户是个基本类做为父类。可银行并不会直接用账户(class Account)。银行只存在其子类储蓄卡账户(class SavingAccount)或信用卡账户(class CreditAccount)。
1.储蓄卡账户和行用卡账户都继承了账户。
2.为了管理,账户都存放进ArrayList<Account>中,方便易用
3.根据条件判断开一个新账户时,是new 一个SavingAccount 或者new一个CreditAccount
4.新增账户:
Account newAccount=new SavingAccount()或者Account newAccoutn=new CrediAccount();
添加到列表
ArrayList.add(newAccount);
5.使用时,从列表中取出,调用账号实例对象的方法
for(Account acc:ArrayList)
{
acc.get();
acc.save();
}
就是这里出了疑惑,列表的数据类型是父类Account,而其中的每个元素对象实例却是子类SavingAccount或CreditAccount.但是从代码上看,不就成了父类acc调用子类实例SavingAccount的方法了吗,居然正常运行?
后来进行了摸索得出结论:
a1.子类继承了(非abstract)父类的属性和方法(非private的),否则不会继承别想用。
a2.子类应实现(abstract)父类中的抽象方法(abstract function()),否则编译都报错。
a3.子类可以调用父类的属性和方法,就是说可以直接.出来。
a4.一般父类不能调用子类的属性和方法,就是说.不出来子类的东西,只能.自己的属性和方法,即使子类的属性是public。
那么问题来了,上面的代码为什么能正确运行?以下是研究成果:
父类可以调用子类方法的情况:
b1.父类(非abstract),子类重写了父类的方法。对于这个子类的重写方法,父类可以调用。
b2.父类(abstract),在子类中去实现了父类的抽象方法。对于这个子类中实现的方法,父类可以调用。
b3.上面两条总结是,父类中声明过(定义过/出现过/注册过)的方法,才能在父类中调用子类的方法。
b4.方法可以abstract,然而属性是不能abstract的,所以set,get的重要性就体现出来了,想父类调用子类的属性?要么子类重写set,get,或者去实现父类的abstract void set,get吧。