学习面向对象的三大特征时遇到的问题
一、封装
1.String和StringBuilder的相互转换
public static void main(String[] args) { String s="hello"; StringBuilder sb=new StringBuilder(s); System.out.println(sb); System.out.println(s); }
和
public static void main(String[] args) { String s="hello"; StringBuilder sb=new StringBuilder(); sb.append(s); System.out.println(sb); System.out.println(s); }
有什么区别?最后 s 这个对象还是存在,结果都一样。
答案是没区别。
2.写出程序的执行结果()
class Value{ int i = 15; } class Test{ public static void main(String argv[]) { Test t = new Test(); t.first(); } public void first() { int i = 5; Value v = new Value(); v.i = 25; second(v, i); System.out.println(v.i); } public void second(Value v, int i) { i = 0; v.i = 20; Value val = new Value(); v = val; System.out.print(v.i + " " + i); //15 //0 } }
我的答案是15 0 15
正确答案是15 0 20
在second的方法中new了一个新对象val,val.i=15,原来的v指向了val,然后v.i也等于15了。但这个方法结束后,因为val是方法second中的局部对象,所以方法结束对象val也消失了,所以v.i 又指向了原来的20。
二、继承
1.方法重写与新写一个方法的区别
方法重写就覆盖了父类中的方法,调用这个方法时就会调用子类中的方法了,而不会调用父类中的那个了。学多态时会频繁使用。
而新写一个方法那就是一个新的方法。
2.为什么main方法前要加static,而之前学对象时,其他类中的成员方法不用加static?
这是因为static静态方法可以通过 类名.方法名 直接进行调用,不需要进行实例化。 假设不使用static,那么main()方法在调用时必须先对其实例化,而main()做为程序的主入口显然不可能先对其实例化,所以使用static修饰。
而与主方法同一类中的其他方法也要用static修饰是因为静态成员方法只能调用静态成员,而其他类的成员方法要新建一个对象才能调用,所以当时对于对象而言,成员方法就不用加static,这样对于不同的对象,成员方法就可以不同。加了static的话,所有对象的这个成员方法就不能改变了。