一直觉得自己对访问权限和函数覆写还挺明白的,直到碰见下面这个情况:
有三个类Animal、Dog和Test;Animal和Test在一个包中,Dog在另一个包中;Dog继承了Animal;Animal和Dog中的bark()方法都是默认权限的。Test中生成一个Animal引用的Dog对象,调用bark()方法的打印结果是animal bark。我的问题是:不是说java中函数调用都是根据对象的实际型别进行的吗?难道只有构成多态的时候才是根据对象的实际型别进行调用,没有构成多态的时候都是根据对象的引用型别调用?package a;
public class Animal {
void bark(){
System.out.println("animal bark");
}-------------------------------------package b;
import a.Animal;
public class Dog extends Animal{
void bark(){
System.out.println("dog bark");
}---------------------------------------package a;
import b.Dog;
class Test {
public static void main(String[] args) {
Animal anim = new Dog();
anim.bark();
}
}
有三个类Animal、Dog和Test;Animal和Test在一个包中,Dog在另一个包中;Dog继承了Animal;Animal和Dog中的bark()方法都是默认权限的。Test中生成一个Animal引用的Dog对象,调用bark()方法的打印结果是animal bark。我的问题是:不是说java中函数调用都是根据对象的实际型别进行的吗?难道只有构成多态的时候才是根据对象的实际型别进行调用,没有构成多态的时候都是根据对象的引用型别调用?package a;
public class Animal {
void bark(){
System.out.println("animal bark");
}-------------------------------------package b;
import a.Animal;
public class Dog extends Animal{
void bark(){
System.out.println("dog bark");
}---------------------------------------package a;
import b.Dog;
class Test {
public static void main(String[] args) {
Animal anim = new Dog();
anim.bark();
}
}
但感觉应该是语法规定。
因为如果a包里能直接调用b包里的friendly方法的话,那就违背了访问权限规则了。所以,这个规则应该根据多态和封装综合作用在制定。
Animal anim = new Dog();//anim指向的是Dog的对象.
anim.bark();//这里根据实际所指向的对象来调用方法.
默认权限的方法在不同的包中是不可见的。