⑴ java中抽象方法不能为private,final或者static,为什么细细说明,或给个例子
4)抽象方法不能为private,final或者static,为什么?马克-to-win:抽象方法的最实质的意
义在于被未来的子类覆盖实现掉。它自己是个空方法。private的实质意义在于本类其他方法调用它。你自己是个空方法,别人调用你有什么用?所以
abstract和private在一起毫无意义。final规定子类不能再覆盖它。abstract是专等着要别人来覆盖,二者矛盾。所以不能放在一起
使用。有关static,我们上一章讲过:马克-to-win:static的成员是在程序执行到main时就已经确定的。要不为什么起
名叫静态static呢?而本章后面,我们要讲多态的动态方法调度。动态方法调度就是指在运行时才决定执行哪个方法(是子类的还是父类的)。比如运行时如
果用户输入自行车,就执行自行车的驾驶方法。马克-to-win:如果用户输入小轿车,就执行小轿车的驾驶方法,涉及到用户,这些都只能在运行时才能干。
而abstract一定用到动态方法调度。所以这静态和动态二者是矛盾的,不能一起用。因为道理是这样,所以当时sun公司的设计者就这样设计
了.。。。。。。。。。
详情网上找“马克-to-win”,参考他的网站或他的网络空间:java第三章的内容,如果实在找不到,按我下面说的地址找:
网站名是:mark-to-win.com
再附加上下边的路径地址: /JavaBeginner/JavaBeginner3_web.html#AbstractNotFinalPrivateStatic
⑵ 请分析在JAVA中,静态类,抽象类,实例类,静态方法,抽象方法,接口,以及继承,实现的关系概念
如果真要看数的话,这些概念几页书都看不完!看完了你看不懂,还必须看十几页的范例,自己练习几十遍才能搞懂!
先声明一点:下面都是我个人的理解,但是否理解正确我不敢保证,所以如果因为我的误导使你有错误的理解,我在此表示抱歉。
我这里就用最简单的例子简单的说明:
1.静态方法:
1>类A里面有非静态方法b,则调用b方法是:new A().b();
实际原理:b并不存在内存中,需要实例化A来获取b
实际应用:b方法中需要用到A类里的变量
2>类A里面有静态方法b,则调用b方法是:A.b();
实际原理:b已经存在内存中,可通过A的名称直接调用,无需实例化A类
实际应用:b方法中不需要用到A类里的变量
2.静态类,只存在于内部类,如果内部类里面有静态方法,则内部类必须是静态类。实际应用中极少用到,至少我出来工作后从来没用到过。
1>类A里面啊有非静态类B,B里面有非静态方法c,调用c方法是:new A().new B().c();
2>类A里面啊有非静态类B,B里面有静态方法c,这种情况不存在!因为c是静态方法,B就必须是静态类!
3>类A里面啊有静态类B,B里面有静态方法c,调用c方法是:A.B.c();
1>类A里面啊有静态类B,B里面有非静态方法c,调用c方法是:new A.B().c();
3.实例类,就是一般的类和非静态内部类。没啥好说的。
4.抽象方法
只有方法名和传入参数,没有实现内容。
例如有一个方法c如下:
public void c(String printText) {
System.out.println(printText);
}
对应的抽象方法就是:
public void c(String printText);
但抽象方法只能放在“抽象类”和“接口”中
5.接口类,接口类里面只能放抽象方法,需要实现类来实现接口的抽象方法。
接口的目的有点类似书本的“目录”所起的作用,用户只需要关注方法实现了什么功能,而不用去关注具体实现方法的内容。
常见的例子有:
Set<String> set = new TreeSet<String>();
Set<String> set = new HashSet<String>();
同一个接口,则必须接口规定的固有属性,Set接口就是唯一性。
不同实现类,则具备不一样特殊属性:
TreeSet具备自动排序功能,但不能保存null
HashSet无序,但能存null
另外,一个实现类可实现(implements)多个接口类,但必须实现所有接口里面的所有抽象方法。
6.抽象类,夹在一般类和接口中间,可放普通方法,也可放抽象方法,但抽象方法必须加abstract。
例如:
abstract public void test();
抽象类如果被一般类所继承(extends),则一般类必须实现抽象类的抽象方法。
7.继承,所有类之间都有可以有一个继承关系,但要注意以下几点:
1>接口类只能继承接口类,可多继承
2>除接口类以为的所有类,只能单继承,即只能继承一个类,并且不能继承接口!
3>一般而言继承之后,子类就拥有父类的方法,但如果父类有方法是私有的,则即使继承也无法调用。
以上所说只是一个简单的概括,肯定有很多遗漏的细节!还是必须多看书!多练习!!
⑶ java涓闱欐佸彉閲忓拰闱欐佹柟娉曞垎鍒链変粈涔堢壒镣
镓惧埌涓绡囩浉鍏虫枃绔狅纴鍐椤缑寰堟竻妤氾纴鍒嗕韩涓涓
瀵箂tatic 淇楗扮︿箣闱欐佸彉閲忓拰闱欐佹柟娉旷殑鐞呜В- -
鎴戜滑鐭ラ亾,鍙瑕佹槸绫,镞犺轰粈涔堢被(鍖呮嫭鎶借薄绫),閲岄溃鍙链夋柟娉曞拰鍙橀噺,钥岃佷娇鐢ㄨ繖涓绫绘垜浠涓鑸鍒嗕袱姝ヨ蛋,濡,涓涓锻桦伐绫籈mployee
Employee s;//瀹氢箟浜嗕竴涓狤mployee镄勫紩鐢
s=new Employee("Aaron",1980,3,1,1500);//杩欐牱镓岖湡姝e缓绔嬩简涓涓瀵硅薄s,涔熷氨鏄璇磗鎸囧悜浜嗗唴瀛树腑镄勪竴鍧楄繛缁镄勫尯锘.
钬旇繖閲屾敞镒忎粈涔堟槸鐪熸g殑瀵硅薄,浠涔堟槸寮旷敤钬
濡傛灉鎴戜滑瑕佹敼鍙樿繖鍧楀尯锘,闇璋幂敤鍏朵腑镄勬柟娉,濡
s.raiseSalary(25);//raiseSalary(double)涓篍mployee 涓镄勬柟娉
杩欐牱,鎴戜滑阃氲繃鏂规硶(绫绘柟娉)鏀瑰彉浜嗙被涓镄勫彉閲(绫绘暟鎹鎴栫被鍙橀噺).
镓璋挞润镐佹柟娉,灏辨槸阃氲繃绫诲悕𨱒ヨ皟鐢(褰撶劧阃氲繃绫诲硅薄𨱒ヨ皟鐢ㄤ竴镙锋槸鍙浠ョ殑,灏卞儚core java閲岃寸殑涓镙,瀹规槗璁╀汉娣锋穯!)镄勬柟娉,
钥岄润镐佸彉閲忓畠鏄涓绉嶅叡浜鍙橀噺(VB.net閲岄溃濡傛ょО锻,姣旇缉瀹规槗鐞呜В).,浠讳綍阃氲繃绫诲悕𨱒ヨ皟鐢,閮藉彲浠ユ敼鍙桦叾鍊.
鍏充簬闱欐佹柟娉(阃氲繃绫讳骇鐢熺殑瀵硅薄)璋幂敤闱欐佹柟娉,璋幂敤闱为润镐佹柟娉(阃氲繃绫诲悕鎴栭兘鏄瀵硅薄璋幂敤)閮芥槸鍙浠ョ殑,浣嗘槸,闱欐佹柟娉曞彲浠ヨ皟鐢ㄩ润镐佸彉閲忚屼笉鍙浠ヨ皟鐢ㄩ潪闱欐佸彉閲(Error(12,30): non-static variable a cannot be referenced from a static context)
浠ヤ笅鏄痶hinking in java 閲岄溃镄勫叧浜巗tatic 镄勬弿杩:
2.6.3 static鍏抽敭瀛
阃氩父锛屾垜浠鍒涘缓绫绘椂浼氭寚鍑洪偅涓绫荤殑瀵硅薄镄勫栬备笌琛屼负銆傞櫎闱炵敤new鍒涘缓闾d釜绫荤殑涓涓瀵硅薄锛屽惁鍒椤疄闄呬笂骞舵湭寰楀埌浠讳綍涓滆タ銆(娉ㄦ剰,杩欓噷鍏跺疄灏辨槸璇寸殑寮旷敤鍜岀湡姝g殑瀵硅薄鍒涘缓闂棰)鍙链夋墽琛屼简new钖庯纴镓崭细姝e纺鐢熸垚鏁版嵁瀛桦偍绌洪棿锛屽苟鍙浣跨敤鐩稿簲镄勬柟娉曘
浣嗗湪涓ょ岖壒娈婄殑𨱍呭舰涓嬶纴涓婅堪鏂规硶骞朵笉鍫鐢ㄣ备竴绉嶆儏褰㈡槸鍙𨱍崇敤涓涓瀛桦偍鍖哄烟𨱒ヤ缭瀛树竴涓鐗瑰畾镄勬暟鎹钬斺旀棤璁鸿佸垱寤哄氩皯涓瀵硅薄锛岀敋镊虫牴链涓嶅垱寤哄硅薄銆傚彟涓绉嶆儏褰㈡槸鎴戜滑闇瑕佷竴涓鐗规畩镄勬柟娉曪纴瀹冩病链変笌杩欎釜绫荤殑浠讳綍瀵硅薄鍏宠仈銆备篃灏辨槸璇达纴鍗充娇娌℃湁鍒涘缓瀵硅薄锛屼篃闇瑕佷竴涓鑳借皟鐢ㄧ殑鏂规硶銆备负婊¤冻杩欎袱鏂归溃镄勮佹眰锛屽彲浣跨敤static锛堥润镐侊级鍏抽敭瀛椼备竴镞﹀皢浠涔堜笢瑗胯句负static锛屾暟鎹鎴栨柟娉曞氨涓崭细钖岄偅涓绫荤殑浠讳綍瀵硅薄瀹炰緥镵旂郴鍒颁竴璧枫傛墍浠ュ敖绠′粠链鍒涘缓闾d釜绫荤殑涓涓瀵硅薄锛屼粛鑳借皟鐢ㄤ竴涓狲tatic鏂规硶锛屾垨璁块梾涓浜泂tatic鏁版嵁銆傝屽湪杩欎箣鍓嶏纴瀵逛簬闱瀞tatic鏁版嵁鍜屾柟娉曪纴鎴戜滑蹇呴’鍒涘缓涓涓瀵硅薄锛屽苟鐢ㄩ偅涓瀵硅薄璁块梾鏁版嵁鎴栨柟娉曘傝繖鏄鐢变簬闱瀞tatic鏁版嵁鍜屾柟娉曞繀椤荤煡阆揿畠浠镎崭綔镄勫叿浣揿硅薄銆傚綋铹讹纴鍦ㄦe纺浣跨敤鍓嶏纴鐢变簬static鏂规硶涓嶉渶瑕佸垱寤轰换浣曞硅薄锛屾墍浠ュ畠浠涓嶅彲绠鍗曞湴璋幂敤鍏朵粬闾d簺鎴愬憳锛屽悓镞朵笉寮旷敤涓涓宸插懡钖岖殑瀵硅薄锛屼粠钥岀洿鎺ヨ块梾闱瀞tatic鎴愬憳鎴栨柟娉曪纸锲犱负闱瀞tatic鎴愬憳鍜屾柟娉曞繀椤诲悓涓涓鐗瑰畾镄勫硅薄鍏宠仈鍒颁竴璧凤级銆
链変簺闱㈠悜瀵硅薄镄勮瑷浣跨敤浜"绫绘暟鎹"鍜"绫绘柟娉"杩欎袱涓链璇銆傚畠浠镒忓懗镌鏁版嵁鍜屾柟娉曞彧鏄涓轰綔涓轰竴涓鏁翠綋镄勭被钥屽瓨鍦ㄧ殑锛屽苟涓嶆槸涓洪偅涓绫荤殑浠讳綍鐗瑰畾瀵硅薄銆傛湁镞讹纴鎭ㄤ细鍦ㄥ叾浠栦竴浜汮ava涔﹀垔閲屽彂鐜拌繖镙风殑绉板懠銆
涓轰简灏嗘暟鎹鎴愬憳鎴栨柟娉曡句负static锛屽彧闇鍦ㄥ畾涔夊墠缃鍜岃繖涓鍏抽敭瀛楀嵆鍙銆备緥濡傦纴涓嬭堪浠g爜鑳界敓鎴愪竴涓狲tatic鏁版嵁鎴愬憳锛屽苟瀵瑰叾鍒濆嫔寲锛
class StaticTest {
Static int i = 47;
}
鐜板湪锛屽敖绠℃垜浠鍒朵綔浜嗕袱涓猄taticTest瀵硅薄锛屼絾瀹冧滑浠岖劧鍙鍗犳嵁StaticTest.i镄勪竴涓瀛桦偍绌洪棿銆傝繖涓や釜瀵硅薄閮藉叡浜钖屾牱镄刬銆傝疯冨疗涓嬭堪浠g爜锛
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
姝ゆ椂锛屾棤璁簊t1.i杩樻槸st2.i閮芥湁钖屾牱镄勫47锛屽洜涓哄畠浠寮旷敤镄勬槸钖屾牱镄勫唴瀛桦尯锘熴
链変袱涓锷炴硶鍙寮旷敤涓涓狲tatic鍙橀噺銆傛e备笂闱㈠𪾢绀虹殑闾f牱锛屽彲阃氲繃涓涓瀵硅薄锻藉悕瀹冿纴濡俿t2.i銆备害鍙鐩存帴鐢ㄥ畠镄勭被钖嶅紩鐢锛岃岃繖鍦ㄩ潪闱欐佹垚锻橀噷鏄琛屼笉阃氱殑锛堟渶濂界敤杩欎釜锷炴硶寮旷敤static鍙橀噺锛屽洜涓哄畠寮鸿皟浜嗛偅涓鍙橀噺镄"闱欐"链璐锛夈
StaticTest.i++;
鍏朵腑锛++杩愮畻绗︿细浣垮彉閲忓炲笺傛ゆ椂锛屾棤璁簊t1.i杩樻槸st2.i镄勫奸兘鏄48銆
绫讳技镄勯昏緫涔熼傜敤浜庨润镐佹柟娉曘傛棦鍙璞″瑰叾浠栦换浣曟柟娉曢偅镙烽氲繃涓涓瀵硅薄寮旷敤闱欐佹柟娉曪纴浜﹀彲鐢ㄧ壒娈婄殑璇娉曟牸寮"绫诲悕.鏂规硶()"锷犱互寮旷敤銆傞润镐佹柟娉旷殑瀹氢箟鏄绫讳技镄勶细
class StaticFun {
static void incr() { StaticTest.i++; }
}
浠庝腑鍙鐪嫔嚭锛孲taticFun镄勬柟娉昳ncr()浣块润镐佹暟鎹甶澧炲笺傞氲繃瀵硅薄锛屽彲鐢ㄥ吀鍨嬬殑鏂规硶璋幂敤incr()锛
StaticFun sf = new StaticFun();
sf.incr();
鎴栬咃纴鐢变簬incr()鏄涓绉嶉润镐佹柟娉曪纴镓浠ュ彲阃氲繃瀹幂殑绫荤洿鎺ヨ皟鐢锛
StaticFun.incr();
灏界℃槸"闱欐"镄勶纴浣嗗彧瑕佸簲鐢ㄤ簬涓涓鏁版嵁鎴愬憳锛屽氨浼氭槑纭鏀瑰彉鏁版嵁镄勫垱寤烘柟寮忥纸涓涓绫讳竴涓鎴愬憳锛屼互鍙婃疮涓瀵硅薄涓涓闱为润镐佹垚锻桡级銆傝嫢搴旂敤浜庝竴涓鏂规硶锛屽氨娌℃湁闾d箞鎴忓墽鍖栦简銆傚规柟娉曟潵璇达纴static涓椤归吨瑕佺殑鐢ㄩ斿氨鏄甯锷╂垜浠鍦ㄤ笉蹇呭垱寤哄硅薄镄勫墠鎻愪笅璋幂敤闾d釜鏂规硶銆傛e备互钖庝细鐪嫔埌镄勯偅镙凤纴杩欎竴镣规槸镊冲叧閲嶈佺殑钬斺旂壒鍒鏄鍦ㄥ畾涔夌▼搴忚繍琛屽叆鍙f柟娉昺ain()镄勬椂鍊欍
鍜屽叾浠栦换浣曟柟娉曚竴镙凤纴static鏂规硶涔熻兘鍒涘缓镊宸辩被鍨嬬殑锻藉悕瀵硅薄銆傛墍浠ョ粡甯告妸static鏂规硶浣滀负涓涓"棰嗗ご缇"浣跨敤锛岀敤瀹幂敓鎴愪竴绯诲垪镊宸辩被鍨嬬殑"瀹炰緥"銆
浠ヤ笅鏄鎴戠殑娴嬭瘯绋嫔簭:
<pre>
package moonsoft.test.testDataStructure;
public class TestDriver
{
public TestDriver()
{
}
public static void main(String []args)
{
TestDriver td=new TestDriver();
String month=td.monthName(3);//阃氲繃瀵硅薄璋幂敤static method,涓嶅缓璁浣跨敤
month=TestDriver.monthName(4);//镙囧嗳镄勮皟鐢╯tatic method
String month1=td.monthName1(3);//阃氲繃瀵硅薄璋幂敤闱瀞tatic method
month1=TestDriver.monthName1(4);
/*涓嶉氲繃瀵硅薄璋幂敤闱瀞tatic method:
* Error(14,23): non-static method monthName1(int) cannot be referenced from a static context*/
System.out.println(month+a);//闱欐佹柟娉曡皟鐢ㄩ润镐佸彉閲
System.out.println(month1+a);//闱欐佹柟娉曡皟鐢ㄩ润镐佸彉閲
System.out.println(month+a1);
/*闱欐佹柟娉曡皟鐢ㄩ潪闱欐佸彉閲
*Error(17,30): non-static variable a1 cannot be referenced from a static context*/
}
public static String monthName(int month)//static method
{
switch ( month)
{
case 1: return "Jan";
case 2: return "Feb";
case 3: return "Mar";
case 4: return "Apr";
case 5: return "May";
case 6: return "Jun";
default: return "others";
}
}
public String monthName1(int month)//not a static method
{
switch ( month)
{
case 1: return "Jan";
case 2: return "Feb";
case 3: return "Mar";
case 4: return "Apr";
case 5: return "May";
case 6: return "Jun";
default: return "others";
}
}
public static int add(int t)
{
int s=t;
s++;
return s;
}
public static double a;
public double a1;
}</pre>
鍏跺疄寰堢亩鍗,闅忛亶鍐椤嚭涓涓绋嫔簭娴嬭瘯涓涓嫔氨濂戒简,澶磋剳閲屼竴瀹氲佹竻妤氩湴鐭ラ亾闱欐佺┒绔熸槸镐庝箞锲炰簨.