今天分享一篇PM撸代码系列Android之【绝顶高手排行榜】
这是Android系列的第七篇文章了,也是关于Java语言的最后一篇文章了。这一篇后,我们将正式开始Android的学习。不过这一篇大家还是要好好地学一下,把Java的基础打好,那么学Android将会事半功倍的。
不久前,公众号的文章已经突破20万字了,我还是挺高兴的,一共发了80多篇文章了。规划中的文章还有很多,希望我能一直写下去吧,没有你们的支持,我是不可能有动力码那么多字的。接下来也不会一直发布Android的教程,而是会穿插地发表文章,还希望大家继续支持!
今天这篇文章的主要内容如下,我将继续用我的方式为你讲述原本枯燥的编程,今天将会加入金庸武侠绝顶高手排行榜哦,请耐心读完吧 ┑( ̄。。 ̄)┍
1 抽象类
2 接口
3 包及访问权限
【抽象类】
Java可以专门创建一个类来做父类,这种类叫做抽象类。抽象类很奇怪,咋一看,根本不明白它到底有什么用。因为它只声明了方法,而没有实现。。。
首先说明几个注意事项:
1 抽象类和抽象方法都必须使用abstract关键字声明
2 抽象类不能直接实例化,也就是不能直接用new关键字去产生对象
3 抽象方法只需声明,不需实现
4 抽象类的子类必须重写所有的抽象方法后,才能实例化,不然,这个子类还是个抽象类
5 特别注意,抽象类里的方法,既可以是抽象方法(加了关键字abstract),又可以是一般方法(不加abstract)
经过深入分析和类比,我发现,抽象类还是有一定作用的。抽象类就像“模(mu)板”,它可以让设计者根据它的格式来创建和修改新的类。
举个栗子你就懂了:
金庸武侠世界,被一代又一代的国人深深地喜爱,特别像《天龙》、《射雕》、《神雕》、《倚天》等优秀作品,大家耳熟能详。这么多作品,出了很多个大侠,而中国人又喜欢凡是排个座次,好吧,那我今天就借这个机会,给大家排一排,说得不好,求轻拍。。。
(1)绝顶高手排行榜
既然我要做排行榜,肯定是要先出一个进入排行榜的标准,换句话说,就是要出一个绝顶高手入榜模板。So,Let‘s do it.
绝顶高手的模板,需要了解该大侠是哪个门派的,然后再由各个门派推选出他们眼中的门派第一人(门派实例化对象)。首先,我们应该抽象出一个武林门派排行榜的模板。可能包含的信息有:大侠的名字,大侠出自那一部金庸小说,还得有他功夫的描述,就像下面:
抽象的武林门派 { 大侠的名字; 大侠的出处; 大侠的绝世武功; 对大侠的描述(){ } }
因为这个申请入榜的大侠还没确定是谁、也不知道是哪个门派的,所以“对大侠武功的描述”这个方法是空的、抽象的,必须要等具体的申请人来了之后,才能确定这里面的内容是什么。
写成程序语言是下面这样的:
abstract
class WuLinMenPai
{
String DaXiaName;//大侠的名字
String FromWhere;//大侠的出处
String JueShiKongFu;//大侠的绝世武功描述
public abstract String Description();//入榜申请描述
}
(2)踊跃申请入榜的大侠们
自从听说有一个绝顶高手排行榜的申请活动,金庸系列里的各个门派跃跃欲试,纷纷给出了自己门派的申请模板,举两个栗子:
少林派 { 少林派申请的大侠(名字,出处,绝世武功) { 大侠的名字=名字; 大侠的出处=出处; 大侠的绝世武功=绝世武功; } 对申请人的描述(){ 说出“大侠:”+名字+“出处:”+出处+“我的绝世武功有:”+绝世武功; } } ---------------------- 逍遥派 { 逍遥派申请的大侠(名字,出处,绝世武功) { 大侠的名字=名字; 大侠的出处=出处; 大侠的绝世武功=绝世武功; } 对申请人的描述(){ 说出“大侠:”+名字+“出处:”+出处+“我的绝世武功描述:”+绝世武功; }
程序版是这样子滴,对比一下,方便你理解:
少林派
class ShaoLin extends WuLinMenPai
{
public ShaoLin(String DaXiaName,String from,String JueShiKongFu){
DaXiaName=name;
FromWhere=from;
JueShiKongFu=kongfu;
}
public String Description()
{
return "大侠:"+DaXiaName+",出处:"+FromWhere+"我的绝世神功"+JueShiKongFu;
}
}
---------------------
逍遥派
class XiaoYao extends WuLinMenPai
{
public XiaoYao(String DaXiaName,String from,String JueShiKongFu){
DaXiaName=name;
FromWhere=from;
JueShiKongFu=kongfu;
}
public String Description()
{
return "大侠:"+DaXiaName+"出处:"+FromWhere+"我的绝世神功描述:"+JueShiKongFu;
}
}
然后,各门派都在自己门派内部给出了这个评判大侠的标准,于是就有很多门派大侠踊跃提出了申请,经过Glen武侠专家科学评审委员会的评定,
绝顶高手排行榜入围名单 { 少林派 达摩=少林派申请的大侠("达摩","我来自金庸系列的很多地方,基本有少林的地方,就会提到我","《九阳神功》、《易筋经》、《少林72绝技》"); 逍遥派 逍遥老祖=逍遥派申请的大侠("逍遥老祖","来自天龙八部","《北冥神功》、《小无相功》、《凌波微步》、《八荒六合唯我独尊功》、《天山六阳掌》等,同时还精通医术、奇门遁甲,还长得帅。。。"); 对外宣传 达摩的描述(); 对外宣传 逍遥老祖的描述(); } ----------- 程序版 class JueDingGaoShouRuWei { public static void main(String[] args) { ShaoLin DaMo=new ShaoLin("达摩","我来自金庸系列的很多地方,基本有少林的地方,就会提到我","《九阳神功》、《易筋经》、《少林72绝技》,中国佛教的开山祖师爷"); XiaoYao XiaoYaoLaoZu=new XiaoYao("逍遥老祖","来自天龙八部","《北冥神功》、《小无相功》、《凌波微步》、《八荒六合唯我独尊功》、《天山六阳掌》等,同时还精通医术、奇门遁甲,还长得帅。。。"); } System.out.println(DaMo.Description()); System.out.println(XiaoYaoLaoZu.Description()); } --------------- 输出的结果像下面这样,然后加上一些我个人认为顶尖武林高手的私人排行榜: (排名第1) 大侠:达摩 出处:我来自金庸系列的很多地方,基本有少林的地方,就会提到我 我的绝世武功描述:《九阳神功》、《易筋经》、《少林72绝技》,中国佛教的开山祖师爷 (排名第2) 大侠:逍遥老祖 出处:来自天龙八部 我的绝世武功描述:《北冥神功》、《小无相功》、《凌波微步》、《八荒六合唯我独尊功》、《天山六阳掌》等,同时还精通医术、奇门遁甲,还长得帅。。。 (排名第3) 大侠:黄裳 出处:射雕英雄传 我的绝世武功描述:武林至尊典籍《九阴真经》的撰写者 (排名第4) 大侠:独孤求败 出处:神雕侠侣和笑傲江湖 我的绝世武功描述:《独孤九剑》、一生用剑至臻化境,利剑无意、软剑无常、重剑无锋、木剑无滞、无剑无招。。。 (排名第5) 大侠:前朝太监 出处:笑傲江湖 我的绝世武功描述:《葵花宝典》的原创者,东方不败仅仅练了12年一部分的《葵花宝典》,已经厉害成那样,不敢想象他是有多厉害。。。
【接口】
之前介绍类时,我们说过Java是不支持多继承的,也就是说,子类在Java里只有一个父类,类比武侠世界,一个徒弟只能有一个师傅。
但是,有时候现实情况很复杂,你只能有一个师傅,但是你想学习更多地武功,Java为了解决这个问题,就引入了接口的概念。
接口(interface)是Java实现多继承的一种机制,也是Java设计中最重要的一个环节,注意事项:
1 接口类似抽象类,但是接口中的数据成员必须初始化,且均为常量,举个例子:接口里定义一个年龄,int age=25,必须赋初值给age
2 接口里的方法必须全部声明为abstract,即接口不可以像抽象类一样既有抽象方法,又有一般方法
3 因为接口里的方法全部是抽象方法,所以abstract关键字可以省略;接口里的成员属性都是常量,所以final关键字也可以省略,但是童鞋们,不要忘记它们有加abstract和final的啊。。。
同样的,举武侠的栗子,方便你们理解:
金庸系列里,人气最高的大侠——乔峰
很多人非常喜欢天龙八部里的乔峰大侠,用他做栗子来让大家理解接口的概念,我想是最好不过了。
我们知道,乔峰最开始是拜师少林的玄苦大师: 师傅 玄苦(少林) { 武功1 龙爪手(少林七十二绝技之一); 武功2 降魔掌(少林七十二绝技之一); 门派功夫描述() { 我们少林的招牌武功是“龙爪手”和“降魔掌”; } } 我们知道,乔峰后来成为了丐帮的帮主: 学功夫 汪剑通(丐帮前任帮主) { 武功1="降龙十八掌"; 武功2="打狗棒法"; 门派功夫描述() { 我们丐帮的招牌武功是“降龙十八掌”和“打狗棒法”; } }
于是,乔峰一身武学其实是集合了少林和丐帮的精华,但他真正的师傅,是他最开始拜师的玄苦大师,后面他进了丐帮,又学会的武学,但这个就不是真正意义上的拜师了,而是另一种契约关系,在武侠里是允许这样的关系的,而在Java里就要用到接口(interface)了:
玄苦大师是父类
class XuanKu
{
String Kongfu1="龙爪手";//少林七十二绝技之一
String Kongfu2="降魔掌";//少林七十二绝技之一
}
汪剑通是接口interface
WangJianTong
{
String Kongfu3="降龙十八掌";
String Kongfu4="打狗棒法";
public void Description();//关于武功的描述
}
乔峰继承玄苦同时又以另一种契约方式继承汪剑通
class QiaoFeng extends XuanKu implements WangJianTong
{
public void Description() {
System.out.println(
"乔峰会的功夫是"+Kongfu1+" "+
Kongfu2+" "+Kongfu3+" "+Kongfu4);
}
}
class Test
{
public static void main(String[] args) {
QiaoFeng QiaoFeng=new QiaoFeng();
QiaoFeng.Description();
}
}
输出结果为:乔峰会的功夫是龙爪手 降魔掌 降龙十八掌 打狗棒法
【包及访问权限】
前面基本将面向对象的知识点讲得七七八八了,现在讲一点特殊的【包】概念。
包是类的特殊性质,包是用来管理大量的类文件,可以设置他人对类成员的访问权。包可以理解为一个更大的、管理类的类(有点拗口)。。。
还是举个栗子你就懂了:
进入武侠世界,武林也是很大的,林子大了什么鸟都有,有可能两个门派的名字是一模一样的,如果这种情况发生在举行华山论剑时,很容易撞车,当你看见两个名字一样的门派时,不知你会作何感想。
比如,伟大的少林就分裂成了好几个,如果他们出去都说自己是少林的,很容易引起混淆,让江湖同道感到儿戏,所以,在北边的少林称自己为北少林,在南边的少林称自己为南少林。
包在程序里很大的作用就是在你使用多个类或接口时,为了避免名称重复而采用的一种措施,用package关键字,声明一个包,用包来区分同名的类和接口。
门派 少林(北边) { 对外宣传() { 我是少林派; } } 门派 少林(南边) { 对外宣传() { 我是少林派; } } 在武林大会时,遇到这种情况,就会Duang,闪退。。。 如果在前面加了区域(package关键字),就可以将两个门派(类)区分开: 区域 北边; 门派 少林 { 对外宣传() { 我是少林派; } } 区域 南边; 门派 少林 { 对外宣传() { 我是少林派; } } 这样就好区分了,有木有_(:з」∠)_ -------------- 代码是这样子的: package.north.java;//声明区域 class ShaoLin { public String talk() { return "我是少林派"; } } package.south.java;//声明区域 class ShaoLin { public String talk() { return "我是少林派"; } } 这样子,两个少林派就可以区分了,是不是很神奇??
注意事项
1 声明包会用到关键字package关键字
2 使用不同的包,会用到关键字import(就是进口的意思)
(华丽丽的分界线)
好了,通过几篇文章,已经把Java讲完了,让我们来回顾一下:
78 PM撸代码之Android【1小时学会Java】:这一篇讲的是基本的Java语法
79 PM撸代码之Android【武侠篇:面向对象基础】:这一篇简述了一下面向过程和面向对象,同时介绍了面向对象的重要知识——类和对象
80 PM撸代码之Android【武侠讲封装、继承、多态】: 这一篇主要讲了面向对象的三个特性——封装、继承、多态
82 PM撸代码之Android【绝顶高手排行榜】:这一篇讲了抽象类、非常重要的接口、包的相关知识
开发Android所需要的Java基本知识就差不多学完了,还有一些比较零碎的知识,它们也挺有用的,但大家可以在学习开发Android的过程中再补充这些知识,它们是:
匿名对象、构造方法、异常处理、关键字(this、static、super、final)、String和StringBuffer等
边学边补,是一个比较理想的状态,^^_ 哎呀,嘴都笑歪了。。。应该是酱紫的^_^。。。
下一篇就可以正式开始勾搭Android了,谢谢大家的支持!