protected访问权限:主要分为父类子类在一个包中和父类子类不在一个包中 下面分别举例子说明
首先看父类子类不在同一个包中的情况:注意,虽然父类子类不在同一个包中,但是生成子类代码的实例却是可以放在任何地方的,下面分类说明;
(1)父类子类在不同包中,在子类中调用父类protected方法;(在与父类相同java文件呢中调用)
//M.java
package
com.pyh.
demo1
;
//注意这个包的路径,demo1
public
class
M {
protected
void
foo() {
//protected访问权限,同包,子类可以访问
System.out.println(
"M:-->foo"
);
}
//N.java
package
com.pyh.
demo2
;
//此包与父类不同包,demo2
import
com.pyh.demo1.M;
//引入父类的包
public
class
N
extends
M {
//继承父类
public
static
void
main(String[] args) {
new
N().foo();
//父类的foo()是protected访问权限,允许同包和子类访问,这里不会报错
}
}
(2)还可以在其他地方生成子类实例调用protected方法:(在子类相同java文件中调用)
//M.java
package
com.pyh.
demo1
;
//注意这个包的路径,demo1
import com.pyh.
demo2.N;
public
class
M {
protected
void
foo() {
//
System.out.println(
"M:-->foo"
);
}
public
static
void
main(String[] args) {
new
N().foo();
//这里是可以访问这个子类实例的protected方法的
}
}
//N.java
package
com.pyh.
demo2
;
//此包与父类不同包,demo2
public
class
N
extends
M {
//继承父类
}
(3)还可以在其他地方生成子类实例调用protected方法:(在与父类子类均不在同一个包中调用)
//M.java
package
com.pyh.
demo1
;
//注意这个包的路径,demo1
public
class
M {
protected
void
foo() {
//
System.out.println(
"M:-->foo"
);
}
}
//N.java
package
com.pyh.
demo2
;
//此包与父类不同包,demo2
import
com.pyh.demo1.M;
//引入父类的包
public
class
N
extends
M {
//继承父类
}
//TEST.java
package
com.pyh.
demo3
;
//TEST包
import
com.pyh.demo2.N;
//
public
class
TEST {
public
static
void
main(String[] args) {
new
N().foo();
//这里是不能可以访问这个子类实例的protected方法的
}
}
(4)还可以在其他地方生成子类实例调用protected方法:(与父类同包 但是不是一个java文件中)
//M.javapackage
com.pyh.
demo1
;
//注意这个包的路径,demo1
public
class
M {
protected
void
foo() {
//
System.out.println(
"M:-->foo"
);
}
}
//TEST.java
package
com.pyh.
demo1
;
//注意这个包的路径,demo1
import
com.pyh.demo2.N;
public
class
TEST {
new
N().foo();
//这里是可以访问这个子类实例的protected方法
}
//N.java
package
com.pyh.
demo2
;
//此包与父类不同包,demo2
import
com.pyh.demo1.M;
//引入父类的包
public
class
N
extends
M {
//继承父类
}
(5)还可以在其他地方生成子类实例调用protected方法:(与子类同包 但是不是一个java文件中)
//M.java
package
com.pyh.
demo1
;
//注意这个包的路径,demo1
import com.pyh.
demo2.N;
public
class
M {
protected
void
foo() {
//
System.out.println(
"M:-->foo"
);
}
}
//N.java
package
com.pyh.
demo2
;
//此包与父类不同包,demo2
import
com.pyh.demo1.M;
//引入父类的包
public
class
N
extends
M {
//继承父类
}
//TEST.java
package
com.pyh.
demo2
;
//TEST包
public
class
TEST {
public
static
void
main(String[] args) {
new
N().foo();
//这里是不能访问这个子类实例的protected方法的
}
}
总结:以上总结的是在父类和子类定义在不同的包中的情况,分别讨论了子类实例生成的地方,分为5种情况
1.TEST代码写在父类中与父类在同一个java文件中,且写在父类里面,子类实例可以访问protected成员和方法;(同一个文件中不同的类 可以访问)
2.TEST代码写在父类中与父类在同一个包但是不在同一个java文件中,子类实例可以访问protected成员和方法;
3.TEST代码写在子类中与子类在同一个java文件中,子类实例可以访问protected成员和方法;(同一个文件中不同的类 可以访问)
4.TEST代码写在子类中与子类不在同一个java文件中,子类实例不可以访问protected成员和方法;
5.TEST代码与父类子类均不在一个包中,子类实例不能访问protected成员和方法;
首先看父类子类在同一个包中的情况:子类的实例可以写在包内或者包外 比较简单,只分三种情况;
(1)父类子类都在同一个包中,测试代码也写在该包中:代码可以写在父类中,可以写在子类中,还可以不写在这两个类中://M.java
package
com.pyh.demo1;
public
class
M {
protected
void
foo() {
//protected访问权限,同包,子类可以访问
System.out.println(
"M:-->foo"
);
}
public
static
void
main(String[] args) {
new
N().foo(); //在父类中使用子类实例来调用protected方法 可以访问
}
}
//N.java
package
com.pyh.demo1;
public
class
N extends M {
}
}
注意:如果TEST放在父类文件中不同的类中,可以访问
(2)父类子类都在同一个包中,测试代码也写在该包中:代码可以写在父类中,可以写在子类中,还可以不写在这两个类中:
//M.java
package
com.pyh.demo1;
public
class
M {
protected
void
foo() {
System.out.println(
"M:-->foo"
);
}
}
//N.java
package
com.pyh.demo1;
public
class
N extends M {
public
static
void
main(String[] args) {
new
N().foo(); //可以访问
}
}
注意:如果TEST放在父类文件中不同的类中,可以访问
(3)父类子类都在同一个包中,测试代码也写在该包中:代码可以写在父类中,可以写在子类中,还可以不写在这两个类中:
//M.java
package
com.pyh.demo1;
public
class
M {
protected
void
foo() {
//
System.out.println(
"M:-->foo"
);
}
}
//N.java
package
com.pyh.demo1;
public
class
N extends M {
}
}
//TEST.java
package
com.pyh.demo1;
public
class
TEST{
public
static
void
main(String[] args) {
new
N().foo(); //可以访问
}
}
(4)父类子类都在同一个包中,测试代码也写在该包外:
package
com.pyh.demo2;
//此包与M类不同包
public
class
R {
public
static
void
main(String[] args) {
new
N().foo();
//不能访问
}
}
注意:如果这个test代码放在同一个文件中 不同的类中 不能访问
以上为个人的一些总结,以后遇到问题慢慢订正。