//B.java
import pa.*;
class B extends A{
public static void main(String args[]){
A a = new A();
a.i = 2;
a.print();
a.StPrint();
(new A()).StPrint();
}
}//A.java
package pa;
public class A{
protected int i = 1;
protected void print(){
System.out.println("print");
}
protected static void StPrint(){
System.out.println("StPrint");
}
}
B和A不在同一个包中,B继承A,为什么B可以访问A的StPrint方法,不能访问A的print方法。
import pa.*;
class B extends A{
public static void main(String args[]){
A a = new A();
a.i = 2;
a.print();
a.StPrint();
(new A()).StPrint();
}
}//A.java
package pa;
public class A{
protected int i = 1;
protected void print(){
System.out.println("print");
}
protected static void StPrint(){
System.out.println("StPrint");
}
}
B和A不在同一个包中,B继承A,为什么B可以访问A的StPrint方法,不能访问A的print方法。
public static void main(String args[]){
B b = new B(); b.i = 2;
b.print();
b.StPrint(); }
A a = new A();
a.i = 2; // i 是 A 的 protected field, 不在同一个package内无法访问
a.print();// print 是 A 的 protected method, 不在同一个package内无法访问 a.StPrint(); // 因为StPrint 是static Method , static method 调用
// 不需要通过对象的实例,跟写成 A.StPrint() 是一样的效果
// 也就是说在B的main函数里面调用了父类的一个 protect method, (new A()).StPrint(); //同上 B b = new B();
b.i = 2; // 是 B 的field 所以能访问
b.print(); // B继承的方法,可以访问
b.StPrint(); // B 继承的方法,可以访问
}
这里面要注意的就是: a.i, a.print() 的a是A的实例,
而 a.StPrint()方法貌似跟a.print()类似,实际上确跟A.stPrint()等价,
而它的protected属性表明了它可以被子类直接调用。
The static method stprint() from type A should be accesed in a static way
我就把a.StPrint()理解为super.StPrint()。因为是protected,所以可以被不同包内的子类中访问。对了,我在A中加
protected A(){}
在B中加
B(){}
结果编译报错,说A()必须为public。这个又要怎么理解呢?构造函数和普通方法的protected不同?
感觉实例化了B的对象应该没问题吧
好的,谢谢各位。
我就把a.StPrint()理解为super.StPrint()。因为是protected,所以可以被不同包内的子类中访问。 对了,我在A中加
protected A(){ }
在B中加
B(){ }
结果编译报错,说A()必须为public。这个又要怎么理解呢?构造函数和普通方法的protected不同?
------------------------------------
因为你没有在B构造函数写明要调用A的构造函数,而A有无法调用默认的构造的函数,因为你已经声明为protected(只能被包外子类访问,它是不会自动调用protected A()的)的了。在B构造函数中加个super()来调用A的构造这应该不会错了。
我是在B中实例化A。
To jaylongli,
编译报错:
B.java:7: A() has protected access in pa.A
A a = new A();
^
1 error它能找到protected A(),只是由于不是public,所以不能访问。你说的super()我试了,一样的报错。
我的想法如下:
1. 从A本身来说, public A(){}, protectedA(){}, private A(){} 都没有任何问题
所不同的是 new A() ;这个方法的调用范围不一样而已。
2. B extends A . 那么 B(){}; 等价于B(){super());
也就是说,B的构造方法首先得调用父类的某一个构造函数,然后才能干点其它的什么,
所以,当A(){}声明为public或者protected的时候没有任何问题,
只有当A(){} 声明为private的时候会报错,因为此时,B不能调用任何A的构造函数
不能省略的情况是这样的,父类没有可见的无参数的构造函数
只要父类有类似public A(){...} 或者protected A(){...}
super()就可以省略
继承不是说继承了某一个函数,而是继承了某一个类。在此基础上,不论是否在同一个包里,任何public和protected函数都可以被子类调用的。
修饰符:protected 类属变量及方法,包内的任何类,及包外的那些继承了此类的子类才能访问;
要搞清这个概念啊,楼主.