1.方法的重写
- 发生在子类中,方法名相同,参数列表不同,方法体不同
- 重写方法在被调用时,看对象的类型
class Foo{
public void f(){
System.out.println("Foo.f()");
}
}
class Goo extends Foo{
public void f(){
System.out.println("Goo.f()");
}
}
Goo obj1 = new Goo();
obj1.f();
Foo obj2 = new Goo();
obj2.f();
- 子类在重写父类的方法时,可以通过super关键字调用父类的版本
class Foo{
public void f(){
System.out.println("Foo.f()");
}
}
class Goo extends Foo{
public void f(){
super.f();
System.out.println("Goo.f()");
}
}
Foo obj2 = new Goo();
obj2.f();
重写的演示
package oo.day04;
public class OverrideDemo {
public static void main(String[] args) {
}
}
class Coo{
void sayHi() {}
double show() {return 0.0;}
Coo test() {return null;}
Doo say() {return null;}
}
class Doo extends Coo{
void sayHi() {}
double show() {return 1;}
Doo test() {return null;}
}
2.重写与重载的区别
- 重写:
父子类中,方法名相同,参数类列表相同,方法体不同,
遵循“运行期”绑定,根据对象的类型绑定方法 - 重载:同一个类中,方法名称相同,参数列表不同,方法体不同
遵循“编译期”绑定,根据引用的类型绑定方法
package oo.day04;
public class OverrideDemo {
public static void main(String[] args) {
Goo goo=new Goo();
Eoo o=new Foo();
goo.test(o);
}
}
class Goo{
void test(Eoo o) {
System.out.println("父型参数");
o.show();
}
void test(Foo o) {
System.out.println("子型参数");
o.show();
}
}
class Eoo{
void show() {
System.out.println("父类show");
}
}
class Foo extends Eoo{
void show() {
System.out.println("子类show");
}
}
3.package和import
package
- 作用:避免类的命名冲突
- 包名可以有层次结构,在一个包中可以包含另外一个包
eg:package 包名1.包名3…包名n; - 建议:包名所有字母都小写
- 类的完全限定名:包名.类名
import
- 作用:声明类/引入类
- 同包中的类可以直接访问
不同包中的类想访问:
先import声明类在访问类(建议)----类的全局限定名(包名+类名)
类的全称-----太繁琐(不建议)