有两个类。
第一个类:
package com.pak1;public class Pub{ public int i = 1;
protected int j = 2;
int n = 3;
private int m = 4;
public void Public(){
System.out.println(" Public method! ");
}
protected void Protected(){
System.out.println(" Protected method! ");
}
void Friendly(){
System.out.println(" Friendly method! ");
}
private void Private(){
System.out.println(" Private method! ");
}}
第二个类:
package com.pak2;import com.pak1.Pub;public class Pub3 extends Pub{ public static void main(String[] args) {
try{
Pub3 p3 = new Pub3(); System.out.println(" public ::: p3.i = " + p3.i); System.out.println(" protectde ::: p3.j = " + p3.j);
//is err
//System.out.println("friendly ::: p3.n = " + p3.n);
//is err
//System.out.println("private ::: p3.m = " + p3.m);
p3.Public();
p3.Protected();
//is err
//p3.Friendly();
//is err
//p3.Private();
Pub p = new Pub();
System.out.println(" public ::: p.j = " + p.i);
//is err
//System.out.println(" protected ::: p.j = " + p.j);
//is err
//System.out.println(" friendly ::: p.n = " + p.n);
//is err
//System.out.println(" private ::: p.m = " + p.m);
p.Public();
//is err
//p.Protected();
//is err
//p.Friendly();
//is err
//p.Private();
Pub pp = new Pub3();
System.out.println(" public ::: pp.i = " + pp.i);
//is err
//System.out.println(" protectde ::: pp.j = " + pp.j);
//is err
//System.out.println("friendly ::: p3.n = " + pp.n);
//is err
//System.out.println("private ::: p3.m = " + pp.m);
pp.Public();
//is err
//pp.Protected();
//is err
//pp.Friendly();
//is err
//pp.Private();
}catch(Exception e){
e.printStackTrace();
} }
}
问题:
为什么声明Pub3 p3 = new Pub3();
p3可以调用父类变量(protected) j和方法Protected().
而声明Pub pp = new Pub3();
pp不可以调用父类变量(protected) j和方法Protected().
第一个类:
package com.pak1;public class Pub{ public int i = 1;
protected int j = 2;
int n = 3;
private int m = 4;
public void Public(){
System.out.println(" Public method! ");
}
protected void Protected(){
System.out.println(" Protected method! ");
}
void Friendly(){
System.out.println(" Friendly method! ");
}
private void Private(){
System.out.println(" Private method! ");
}}
第二个类:
package com.pak2;import com.pak1.Pub;public class Pub3 extends Pub{ public static void main(String[] args) {
try{
Pub3 p3 = new Pub3(); System.out.println(" public ::: p3.i = " + p3.i); System.out.println(" protectde ::: p3.j = " + p3.j);
//is err
//System.out.println("friendly ::: p3.n = " + p3.n);
//is err
//System.out.println("private ::: p3.m = " + p3.m);
p3.Public();
p3.Protected();
//is err
//p3.Friendly();
//is err
//p3.Private();
Pub p = new Pub();
System.out.println(" public ::: p.j = " + p.i);
//is err
//System.out.println(" protected ::: p.j = " + p.j);
//is err
//System.out.println(" friendly ::: p.n = " + p.n);
//is err
//System.out.println(" private ::: p.m = " + p.m);
p.Public();
//is err
//p.Protected();
//is err
//p.Friendly();
//is err
//p.Private();
Pub pp = new Pub3();
System.out.println(" public ::: pp.i = " + pp.i);
//is err
//System.out.println(" protectde ::: pp.j = " + pp.j);
//is err
//System.out.println("friendly ::: p3.n = " + pp.n);
//is err
//System.out.println("private ::: p3.m = " + pp.m);
pp.Public();
//is err
//pp.Protected();
//is err
//pp.Friendly();
//is err
//pp.Private();
}catch(Exception e){
e.printStackTrace();
} }
}
问题:
为什么声明Pub3 p3 = new Pub3();
p3可以调用父类变量(protected) j和方法Protected().
而声明Pub pp = new Pub3();
pp不可以调用父类变量(protected) j和方法Protected().
父类的实例已经指向了它子类的对象
此时的pp调用的方法就是子类的了,除非你用上一个super关键字
第一题我就不回答你了,这是java中一个很基本的思想,别人告诉了你,你自己是没什么收获的自己再好好想想吧
既然父类的实例已经指向了它子类的对象,那么父类的变量(protected) j和方法Protected().
怎么不能被子类的对象调用?
Pub3 p3 = new Pub3();
就可以调用。
相当于JAVA的多态吧。。这样就可以用父类的引用调用子类的方法了。
如果要调用父类的方法。必须使用在构造函数里调用super()方法
super();
}
构造方法。
还是不能调用父类的变量和方法。