1.类的继承java
1)继承ide
父类:全部子类所共有的属性和行为this
子类:子类所特有的属性和行为spa
2)继承中构造方法(super关键字)对象
super的用法:blog
案例1:调用父类无参构造继承
public class Person {
String name;
char gender;
}
public class Student extends Person {
// super (); //编译错误,必须位于子类构造方法的第一句
double score;
Student(double score){
super(); //编译器默认会自动加上
this.score = score;
super.name = "Tom";
}
}
案例2:调用父类有参构造编译器
public class Person {
String name;
char gender;
Person(String name,char gender){
this.name = name;
this.gender = gender;
}
}
public class Student extends Person {
// super (); //编译错误,必须位于子类构造方法的第一句
double score;
Student(String name,char gender,double score){
// super(); //编译错误,父类中没有无参构造
super(name,gender); //调用父类有参构造
this.score = score;
super.name = "Tom";
}
}
3)向上造型编译
案例3:向上造型class
public class Person {
String name;
char gender;
Person(String name,char gender){
this.name = name;
this.gender = gender;
}
}
public class Student extends Person {
double score;
Student(String name,char gender,double score){
super(name,gender); //调用父类有参构造
this.score = score;
super.name = "Tom";
}
public static void main(String[] args) {
Person p = new Student("Tom",'男',80); //向上造型
p.score = 100; //编译错误,Java编译器会根据引用的类型(Person),而不是对象的类型(Student)来检查调用的方法是否匹配。
}
}
2.方法的重写(Override)
1).重写原则
重写遵循“两同两小一大”原则:
1)两同:
1.1)方法名相同
1.2)参数列表相同
2)两小:
2.1)子类方法的返回值类型要小于或等于父类
2.1.1)void时,必须相同
2.1.2)基本数据类型时,必须相同
2.1.3)引用类型时,小于或等于
2.2)子类方法抛出的异常要小于或等于父类的----异常以后
3)一大:
3.1)子类方法的访问权限要大于或等于父类的----访问控制修饰符以后
class Aoo{ void show(){} double test(){return 0.0;} Boo sayHi(){return null;} public Aoo say(){return null;} } class Boo extends Aoo{ //int show(){return 1;} //编译错误,void时必须相同 //int test(){return 0;} //编译错误,基本类型时必须相同 //Aoo sayHi(){return null;} //编译错误,引用类型必须小于或等于 public Boo say(){return null;} }
案例4:方法重写
public class Student {
public static void main(String[] args) {
Goo o = new Goo();
o.f();
Foo oo = new Goo();
oo.f();
}
}
class Foo{
public void f(){
System.out.println("Foo.f()");
}
}
class Goo extends Foo{
public void f(){
System.out.println("Goo.f()");
}
}
//当子类对象的重写方法被调用时(不管经过子类的引用仍是经过父类的引用),运行的都是子类重写后的方法。
/*
运行结果:
Goo.f()
Goo.f()
*/
案例5:方法重写,super调用父类版本
public class Student {
public static void main(String[] args) {
Goo o = new Goo();
o.f();
Foo oo = new Goo();
oo.f();
}
}
class Foo{
public void f(){
System.out.println("Foo.f()");
}
}
class Goo extends Foo{
public void f(){
super.f(); //调用父类的方法
System.out.println("Goo.f()");
}
}
//子类重写方法中的super.f(); 调用了父类的版本,这样的语法一般用于子类的重写方法再父类方法的基础之上进行功能扩展。
/*
运行结果:
Foo.f()
Goo.f()
Foo.f()
Goo.f()
*/
2)重写和重载的区别
案例6:重写与重载区别
public class OverrideAndOverload { public static void main(String[] args){ Super obj = new Sub(); //向上造型 Goo goo = new Goo(); goo.g(obj); } } class Super{ public void f(){ System.out.println("super.f()"); } } class Sub extends Super{ public void f(){ //方法重写 System.out.println("sub.f()"); } } class Goo{ public void g(Super obj){ System.out.println("g(Super)"); obj.f(); } public void g(Sub obj){ //方法重载 System.out.println("g(Sub)"); obj.f(); } }
以上代码运行结果:
g(Super) sub.f()