class a { protected void add(){ System.out.println("hello a"); } }class b extends a { protected void add(){ System.out.println("hello b"); } }public class c extends b { protected void add(){ System.out.println("hello c"); } public static void main(String [] args){ a cc = new a(); cc.add(); a ccc = new c(); ccc.add(); c cccc = new c(); cccc.add();
} }
现在我对main函数中的方法给你讲一下: a cc = new a(); cc.add(); =======创建a的实例,然后调用的是a中的方法,即输出hello aa ccc = new c(); ccc.add(); =======向上转型,属于动态绑定,由于c是a的子类,并且覆盖了a中的方法 所以调用的是子类也就是c中的方法 即输出hello cc cccc = new c(); cccc.add(); =======创建自己的一个实例,所以很显然调用的是自己的方法,输出hello c
{
protected void add(){
System.out.println("hello a");
}
}class b extends a
{
protected void add(){
System.out.println("hello b");
}
}public class c extends b
{
protected void add(){
System.out.println("hello c");
}
public static void main(String [] args){
a cc = new a();
cc.add();
a ccc = new c();
ccc.add();
c cccc = new c();
cccc.add();
}
}
a cc = new a();
cc.add(); =======创建a的实例,然后调用的是a中的方法,即输出hello aa ccc = new c();
ccc.add(); =======向上转型,属于动态绑定,由于c是a的子类,并且覆盖了a中的方法
所以调用的是子类也就是c中的方法 即输出hello cc cccc = new c();
cccc.add(); =======创建自己的一个实例,所以很显然调用的是自己的方法,输出hello c
protected void printString(){
System.out.println("A");
}
}class B extends A{
protected void printString(){
System.out.println("B");
}
}class C extends B{
protected void printString(){
System.out.println("C");
}
public static void main(String args[]) throws Exception{
Class c=null;
c=Class.forName("C");
Class b=c.getSuperclass();
B obj=(B)b.newInstance();
obj.printString();
}
}
class B extends A
{
protected void method(){
...
}
protected void supermethod() {
super.method();
}
}如果改不了B类的话就用楼上所说的反射方法把,只要得到 Method对象,然后调用
setAccessible(true), 就可以绕过访问权限检查