danielhjd 发表于 2013-2-3 14:44:29

(笔记)关于java中的一些问题

第一题:
package william;abstract class Name {private String name;public abstract boolean inStupidName(String name){System.out.println("okay");};} 
报错:

http://dl.iteye.com/upload/attachment/497541/7fe4b1a5-5506-3b4f-842f-c8d8c876c853.jpg
 问题:1) Abstract methods do not specify a body;
          2) This method must return a result of type boolean;
          3) The field Name.name is never read locally;
 
第二题:
package william;public class Outer {private String str="this is outter";class Inner{String str="this is inner";void inner_f1(){System.out.println(this.str);System.out.println(new Outer().str);}}public static void main(String[] args){Outer out=new Outer();Outer.Inner inner=out.new Inner();inner.inner_f1();}} 
注意问题:
1:Outer out=new Outer(); Outer.Inner inner=out.new Inner(); 实例化一个内部类;
     No enclosing instance of type Outer is accessible. Must qualify the allocation with an enclosing instance of type Outer (e.g. x.new A() where x is an instance of Outer).
2:System.out.println(this.str);  System.out.println(new Outer().str);
 
第三题:
public class C extends B implements A {public void pX(){System.out.println(super.str);System.out.println(A.str);}public static void main(String[] args) {new C().pX();}}注意问题:
1:调用父类,用super;
2:调用接口,不需要instantiate;The static field A.str should be accessed in a static way;
 
第四题:
class A;
package test; class A {String s; A(String s) {this.s=s;}public void print(){System.out.println(s);}} 
Class Testt;


http://dl.iteye.com/upload/attachment/497615/27b45300-7f4c-3c47-ab04-31c58d63fda3.jpg
 
报错:
1)Implicit(不明确的) super constructor A() is undefined for default constructor. Must  define an explicit (明确的)constructor;
2)如果删除A类中的构造方法,这个程序可以通过编译但是由于S没有赋值输出的结果为null;
 
修改:
package test;public class Testt extends A {Testt(String s) {super(s);// TODO Auto-generated constructor stub}public static void main(String[] args) {Testt t=new Testt("s");t.print();}} 
注意:
1)此处是含参数的构造器constructor;
 
第五题;
package test;public class TestB extends TestA {public void start(){System.out.println("TestB");}public static void main(String[] args) {((TestA)new TestB()).start();}} 无报错,可以通过编译;
输出结果为:
TestB1)  override
 
 第六题:有关继承的关系;
  TestA
package test;class TestA {String test="Hello TestA";public void start(){System.out.println("TestA");}} TestB
package test;public class TestB extends TestA {String test="Hello testB";public void start(){System.out.println(super.test);System.out.println("TestB");System.out.println(test);}public static void main(String[] args) { TestA t= new TestB();   t.start();   System.out.println(t.test);}} 
输结果:
Hello TestATestBHello testBHello TestA 
1)在主函数中,如何调用父类调用父类的属性和方法;
public static void main(String[] args) { TestA t= new TestA();   t.start();   System.out.println(t.test);}输出结果:
TestA
Hello TestA
 
 2)在主函数中,如何通过子类调用父类的属性,同时又可以调用子类的属性和方法;
public static void main(String[] args) { TestA t= new TestB();   t.start();   System.out.println(t.test);} 输出结果:
Hello TestA
TestB
Hello testB
Hello TestA
 
3)在主函数中,如果子类overide父类的方法,那么父类的方法还可以被子类调用吗?
在2)中我们用父类实例了一个对象t,结构调用start()的方法时,却是调用子类的方法。
Parent;
package test;class Parent {public Parent() {   System.out.println("Parent_constructor");   test();}public void test() {   System.out.println("Parent_test");}} Child;
package test;public class Child extends Parent {private String name = "张三丰";public Child() {super();this.test();   System.out.println("Child_constructor");}public void test() {   System.out.println("Child_test,name=" + name);}public static void main(String[] args) {    new Child();   }}输出结果;
Parent_constructor
Child_test,name=null
Child_test,name=张三丰
Child_constructor

总结:
1:当父类不含有construtor;
     a.子类没有override父类的方法
        子类实例化对象可以直接调用父类的方法和属性;如果属性父类和子类有相同的属性,在调用父类的属性时,通过Parent p=new Child();可以获取parent的属性...
package test;class Parent {public void test1() {   System.out.println("Parent_test");}} 
package test;public class Child extends Parent {private String name = "张三丰";public void test() {   System.out.println("Child_test,name=" + name);}public static void main(String[] args) {   Child t=new Child();   t.test();   t.test1();   System.out.println(t.name);    }} 
      如果属性父类和子类有相同的属性,在调用父类的属性时,通过Parent p=new Child();可以获取parent的属性...
package test;class Parent {String name="张二疯";public void test1() {   System.out.println("Parent_test");}} 
package test;public class Child extends Parent {private String name = "张三丰";public void test() {   System.out.println("Child_test,name=" + name);}public static void main(String[] args) {Child c=new Child();Parent p=new Child();p.test1();System.out.println(c.name);System.out.println(p.name);    }}  
     b.子类overrride父类的方法
        无论是通过子类实例化 还是父类通过子类实例化,因为父类的方法被子类override所以输出的结果都是一样;
 
package test;class Parent {String name="张二疯";public void test() {   System.out.println("Parent_test");}} 
package test;public class Child extends Parent {private String name = "张三丰";public void test() {   System.out.println("Child_test,name=" + name);}public static void main(String[] args) {Child c=new Child();Parent p=new Child();c.test();p.test();System.out.println(c.name);System.out.println(p.name);    }} 
输出:
Child_test,name=张三丰
Child_test,name=张三丰
张三丰
张二疯
 
2:当父类含有不含参数的construtor;
     子类的默认的construtor;继承了父类的construtor;
package test;class Parent {public Parent() {   System.out.println("Parent_constructor");   test();}public void test() {   System.out.println("Parent_test");}} 
 
package test;public class Child extends Parent {private String name = "张三丰";public void test() {   System.out.println("Child_test,name=" + name);}public static void main(String[] args) {new Child();}} 
package test;public class Child extends Parent {private String name = "张三丰";public Child() {super();}public void test() {   System.out.println("Child_test,name=" + name);}public static void main(String[] args) {new Child();}}  
输出结果:
Parent_constructor
Child_test,name=null
2:当父类含有含参数的construtor;
    在子类中必须声明一个含参数的construtor,并super()继承,如第四题。

第七题:
父类:
class ExamSuperA {int m = 0;int n = 0;long f(){return m+n;}} 
子类:
class B extends ExamSuperA{int m=1,n=1;long f(){long result = 0;super.m=10;super.n=20;result = super.f()+(m+n);return result;}long g(){long result = 0;result = super.f()+(m+n);System.out.println(super.m);return result/2;}}public class ExamSuper {public static void main(String[] args) {B b = new B();b.m =3;b.n = 7;long resultOne = b.g();long resultTwo = b.f();long resultThree = b.g();System.out.println("resultOne="+resultOne);System.out.println("resultTwo="+resultTwo);System.out.println("resultThree="+resultThree);}} 
输出结果:
0
10
resultOne=5
resultTwo=40
resultThree=20
 
总结:
通过子类实例化 b  
执行long resultOne = b.g(); super.m=0 所以输出的第一个结果为“0”;
执行long resultTwo = b.f();由于子类override父类的,所以此时调用的f()方法是子类的,子类f()方法中又将super.m;和super.n重新赋值;
执行long resultOne = b.g();其中调用的Super.f()中m.n属性的值已经通过子类修改,所以super.f()的值也发生了改变...
特别注意:super.f()中的属性被修改了 区别于:为什么在Operate这个方法中运行后,X的值改变,但Y没有?
 
 
 
Child c=new Child();
Parent p=new Child();

对象c不仅有自己属性和方法,还继承了父类的方法和属性;
如果子类将父类的方法override了,那么用对象c调用的方法为Child 类的方法;p的方法也将被子类的方法override了,也就是说p的方法被override了,原来的方法不存在了。
如果子类将父类的属性同名,可以通过p来调用parent的同名属性。
 
页: [1]
查看完整版本: (笔记)关于java中的一些问题