class TestParent{
private void method1(){
System.out.println("parent's method1...");
}
public void method2(){
System.out.println("Parent's methos2...");
method1();
}
}public class TestChild extends TestParent {
public void method1(){
System.out.println("child's method1...");
}
public static void main(String[] args){
TestParent p = new TestChild();
p.method2();
} }
为何是下面的输出:
Parent's methos2...
parent's method1...
private void method1(){
System.out.println("parent's method1...");
}
public void method2(){
System.out.println("Parent's methos2...");
method1();
}
}public class TestChild extends TestParent {
public void method1(){
System.out.println("child's method1...");
}
public static void main(String[] args){
TestParent p = new TestChild();
p.method2();
} }
为何是下面的输出:
Parent's methos2...
parent's method1...
不能被导出类覆盖。
所以,建议private 方法,父类子类中用不同的名称。
而调用字段或者静态方法或者final方法(或者private方法,private方法隐含的意思就是最终的,不能被覆盖的)的时候,你要看引用的类型(不是引用所代表当前对象的类)。
规定,记住就行了public class Test {
public static void main(String []args){
A a = new B();//a是A引用类型,代表的是类B
B b = new B();
System.out.println(a.ii);//打印出a自己的ii.(调用字段或者静态方法的时候,你要看引用的类型(不是引用所代表当前对象的类))
System.out.println(b.ii);
a.method1();//执行a自己的method1.(调用字段或者静态方法的时候,你要看引用的类型(不是引用所代表当前对象的类))
b.method1();
a.method2();//执行b的method2,method2是实例方法
b.method2();
a.method3();//执行a的method3,私有方法,你要看引用类型,不是引用所代表当前对象的类。
}}
class A{
public int ii=1;
public static void method1(){
System.out.println("A:static method");
}
public void method2(){
System.out.println("A:not static method");
}
private void method3(){
System.out.println(A:private method);
}
}
class B extends A{
public int ii =2;
public static void method1(){
System.out.println("B:static method");
}
public void method2(){
System.out.println("B:not static method");
}
private void method3(){
System.out.println("B:private method");
}}
在A类中增加个
public void method4(){
method3();
}
在main方法中将a.method3()改成a.method4()
一个父类的引用,调用的当然是父类的方法。
真的会输出两条????还是有点不明白,为什么后面还要自动调自己的私有方法?
很正常啊~class TestParent{
private void method1(){ //虽然这个方法是private的 但下面给出了public的method2()相当于给出了外部访问接口
System.out.println("parent's method1...");
}
public void method2(){
System.out.println("Parent's methos2...");
method1(); //在public的method2()里是可以访问本类的private属性&方法
}
}public class TestChild extends TestParent {
public void method1(){
System.out.println("child's method1...");
}
public static void main(String[] args){
TestParent p = new TestChild();
p.method2(); //调用继承来的method2()}}
明白了么?我的语言表达能力很差
如果写成这样,就成了动态绑定:
class TestParent{
public void method1(){
System.out.println("parent's method1...");
}
public void method2(){
System.out.println("Parent's methos2...");
method1();
}
}public class TestChild extends TestParent {
public void method1(){
System.out.println("child's method1...");
}
public static void main(String[] args){
TestParent p = new TestChild();
p.method2();}
}输出:
Parent's methos2...
child's method1...