//代码1:包A中有一个动物类
package testa;
public class Animal {
protected void crowl(String c){
System.out.println(c);
}
}
//代码2:包B中有一个类鼠类
package testb;
import testa.Animal;
class Rat extends Animal{
public void crowl(){
crowl("zhi zhi"); //为什么可以这样调用方法 }
}
[quote]为什么这this或者super可以省略啊 [/quote]
this可以省略是 因为你就是在本类里面调用的啊 本类的对象就是this
而super可以省略 是因为继承了父类的方法,现在变成自己的了,所以就可以直接调用。
因为Rat 这个类继承了Animal 这个类,所以也继承了它的方法,因此Rat也会有crowl这个方法。
Rat 继承了Animal 的crowl方法啊,当然可以调用。
如果Animal 的crowl方法是private的就不行了,对子类不可见
只要是protected,public都对子类可见
你用了两个不同的package,如果不写访问控制符是不能访问的,如果在同一个package里,那也是可以的
但是假如说你在子类
Animal a=new Animal();
a.crowl("zhi zhi")这样就不行了 因为protected是受包内保护的,你调用是不行的,但是可以继承。
1、protected修饰的成员只允许子类与包访问!只不过子类可访问是指继承访问,即在子类的实例中直接访问继承过来的protected成员,而不是在子类中通过创建父类实例的方式来访问;
2、而包访问就是指通过“XXX x = new XXX(); x.YYY;”的方式来访问,即通过实例的引用来访问,能不能访问就是看访问的代码所在的类是否与类XXX 在同一包中。
但包访问要注意一点的是:如果XXX中只是继承了父类中的protected成员,而没有重写(方法)或重新定义(属性)这些成员,则能不能访问就要看当前访问的代码所在的类是否与类XXX的父类在同一包;另外如果类XXX重写与重新定义过这些protected成员,则就直接看访问代码所在的类与类XXX是否在同一包即可。
public void crowl()
protected void crowl(String c)
这两个是不同的方法,因为方法参数不同。子类继承了父类,所以子类有protected void crowl(String c)方法。但是子类的public void crowl()方法不会覆盖从父类继承来的方法,因为这两个方法参数不同,是两个不同的方法
所以你在子类中调用crowl("zhi zhi"); 其实就是相当于调用了父类的这个方法,等同于
this.crowl("zhi zhi"); 也等同于super.crowl("zhi zhi");
为什么可以this这样调用了:是因为它继承了父类的方法,等于是自己也有了这样的方法,所以this可以调用。