我在看孙鑫的视频教程,其中遇到了一些问题1、final類是為了不讓別的類繼承,那爲什麽還聲明成public的?2、解釋下:静态方法和静态变量是属于某一个类,而不属于类的对象,那为什么还可以用类的对象obj去调用静态的方法method(),如obj.method()。3、静态不能调用非静态的,那为什么main函数是静态。这样的话岂不是main函数不能调用别的非静态的函数了?4、教程里的子类的protected可以被访问,但是我自己作的测试(jdk1.6版的环境下)protected不能被访问,为什么?(我設置在Test2裏面創建一個Test的對象,然後訪問Test裏面的protected對象不可以。但是如果改成Test2的對象就可以)5、垃圾回收順序。我創建4個對象1、2、3、4,而回收時卻按4、3、2、1的順序收,教程裏是按照1、2、3、4的順序收的6、为什么定义static静态内部类时,在产生这个内部类的对象的时候就不需要同时存在一个外部类的对象了,为什么?7、接口中所有的方法都是public abstract。那为什么还得有接口interface,直接声明成public abstract class不也可以实现?8、String对象是常量对象,它的值是永远不能改变的。怎么理解这句话?9、每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错问题比较多,希望能给予耐心解答。再次表示感谢!!
3,main不能调用non-static ,就是这样!
8.String对象是常量对象:对象被创建了就不能修改.
StringBuffer对象是变量对象:StringBuffer类的每个对象都是可以扩充和修改的字符串变量
9.你可以看哈书,写的很清楚.
答:声明为public是为了让别的类使用它,比如常用的System;
---------------------------------2、解釋下:静态方法和静态变量是属于某一个类,而不属于类的对象,那为什么还可以用类的对象obj去调用静态的方法method(),如obj.method()。
答:static一般定义工具函数,但类实例也可使用它,类的实类与类对象(class object)都是
可以使用的,类对象是个模板,其中定义static是为一了定程度上消除OOP开销大的问题,静态方法可以理解为方法指针。
---------------------------------3、静态不能调用非静态的,那为什么main函数是静态。这样的话岂不是main函数不能调用别的非静态的函数了?
答:非静态方法又是实例方法,必须调用具体对象的,static main是不能直接调用类的非静态方法,但可调用实例的非静态方法;
main是程序的入口,在vm调用其时,并不能保证类可生成对象,所以必须为static;
---------------------------------
4、教程里的子类的protected可以被访问,但是我自己作的测试(jdk1.6版的环境下)protected不能被访问,为什么?(我設置在Test2裏面創建一個Test的對象,然後訪問Test裏面的protected對象不可以。但是如果改成Test2的對象就可以)
答:同包内,异包要public
---------------------------------5、垃圾回收順序。我創建4個對象1、2、3、4,而回收時卻按4、3、2、1的順序收,教程裏是按照1、2、3、4的順序收的
答:VM的GC机制是不确定的--sun未对此做保证,你通过观察每个对象的finalize方法执行即可看出;
---------------------------------6、为什么定义static静态内部类时,在产生这个内部类的对象的时候就不需要同时存在一个外部类的对象了,为什么?
答:同static method,做方法指针想。
---------------------------------7、接口中所有的方法都是public abstract。那为什么还得有接口interface,直接声明成public abstract class不也可以实现?
答:可以implements多个interface,但只能extends一个abstract class;
interface一般用于定义“规则”,abstrace class定义模板;
---------------------------------8、String对象是常量对象,它的值是永远不能改变的。怎么理解这句话?
答:一但创建,即不变---在任何并发访问中,原子类型一般是这样;
引用类型,即对象,则不保证,所以存在同步问题;
---------------------------------9、每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错
答:父类肯定会有,都是Object的subClass. ---------------------------------
从楼主提出的问题看你还是认真思考了的,问的很好!
这些问题及我的回答我收录到www.NetJava.cn的论坛上了。
答:static一般定义工具函数,但类实例也可使用它,类的实类与类对象(class object)都是
可以使用的,类对象是个模板,其中定义static是为一了定程度上消除OOP开销大的问题,静态方法可以理解为方法指针。
请javafound() 能否将
/*
*其中定义static是为一了定程度上消除OOP开销大的问题,静态方法可以理解为方法指针。
*/
解释具体一点?
再看一个...String s1 = new String( "test" );
String s2 = new String( "test" );String s3 = "test" ;
String s4 = "test" ;在这里,s1 == s2 是false.但是,s3 == s4却是true.表明了..s3 s4指的是同一个对象
public 只不过是说让别人是让别人访问到啊2、解釋下:静态方法和静态变量是属于某一个类,而不属于类的对象,那为什么还可以用类的对象obj去调用静态的方法method(),如obj.method()。
这就好像人类共有的属性.你是人那你你也有啊.3、静态不能调用非静态的,那为什么main函数是静态。这样的话岂不是main函数不能调用别的非静态的函数了?
这只是说不通过对象去调用.用对象是可以调用的
1.abstract 和final不能同时修饰一个类。
2.修饰方法保证该方法不能被子类重载,已经被private修饰的方法以及所有包含在final类中的方法,都被缺省认为是fianl的。
3.如果是修饰primitive数据,那么这份数据是不可更改的,如果是修饰对象的话,那么其指向不可更改。但例如一个对象内部有另外一个对象,这另外一个对象可以变更。
两者重点不同:
static强调只有一份
final强调是常量
static和final是不同的两个修饰,static是修饰方法或变量是静态的,而final是修饰定义的变量为常量。
补充:
对于可以设置为final和static的类型有几种:
常量数据:这个我觉得达到的效果两者是一样的.但是可以肯定的一点是用final定义的,编译器会认为是编译期常量,从而进行编译优化..
而static只是表明"只有一个",我不能确定static定义的变量编译器是否会聪明的进行编译优化?
变量:我觉得final定义的变量和static定义的变量是有区别的.
final定义的变量是不能改变指向的句柄的.但是static是可以的,static只是表明这个变量是类变量,而不是instance变量.但是static指向的句柄应该
是可以改变的.
比如:final string fs;
初始化 fs="chris"; 那么fs永远都是指向"chris"这个对象的句柄,不可改变.
但是如果是static的变量的话,它指向的句柄应该是可以改变的.但是是一处改变,处处改变.
方法:final定义的方法不可继承,而且有时候会被编译器替换进去(这个有点象#define,但是,注意,是有时候,不是所有时候,这个和java编译器有关)
比如priviate方法其实就是final的,但不是static的