面向对象(高级)一 下载本文

}

public String getSchool(){ return this.school ; } };

public class OODemo05{

public static void main(String args[]){ Student s = new Student() ; s.setName(\张三\ s.setAge(30) ;

s.setSchool(\北京大学\ System.out.println(\姓名:\;年龄:\;学校:\ } };

那么,现在再去编译以上的程序,出现了以下的错误: OODemo05.java:24: 找不到符号 符号: 构造函数 Person() 位置: 类 Person

class Student extends Person{ ^

1 错误

找不到Person类中的无参构造方法。但是在整个代码之中,并没有一个地方是调用了Person类中的无参构造方法,那么为什么会出错呢?

? 构造方法的作用:初始化类中的各个属性,一个类只有调用了构造方法之后才可以产生实例化对象,否则无法产生。

? 从实际中可以发现:没有父亲那来的儿子?

? 从分析中可以发现,子类如果要想实例化,则必须默认调用父类中的无参构造方法。 class Person{

private String name ; private int age ; public Person(){

System.out.println(\ }

public void setName(String name){ this.name = name ; }

public void setAge(int age){ this.age = age ; }

public String getName(){ return this.name ; }

public int getAge(){ return this.age ;

}

public String getInfo(){

return \姓名:\,年龄:\ } };

class Student extends Person{ private String school ; public Student(){

System.out.println(\ }

public void setSchool(String school){ this.school = school ; }

public String getSchool(){ return this.school ; } };

public class OODemo06{

public static void main(String args[]){ Student s = new Student() ; } };

在以上的情况下,实际上父类中的无参构造不可以使用,也就是说实际上在子类的构造方法之中隐含了以下的一条语句: public Student(){

表示调用的是父类的构造方法? super() ; System.out.println(\ }

既然可以使用super()调用父类中的无参构造,那么如果现在父类中没有无参构造,能否使用super调用有参构造呢?如果可以,该怎么做呢? class Person{

private String name ; private int age ;

public Person(String name,int age){ this.setName(name) ; this.setAge(age) ; }

public void setName(String name){ this.name = name ; }

public void setAge(int age){ this.age = age ; }

public String getName(){

return this.name ; }

public int getAge(){ return this.age ; }

public String getInfo(){

return \姓名:\,年龄:\ } };

class Student extends Person{ private String school ;

public Student(String name,int age,String school){ super(name,age) ;

this.setSchool(school) ; }

public void setSchool(String school){ this.school = school ; }

public String getSchool(){ return this.school ; } };

public class OODemo07{

public static void main(String args[]){

Student s = new Student(\张三\北京大学\

System.out.println(s.getInfo() + \;学校:\ } };

在以上代码之中已经明确的使用了super调用了父类之中有两个参数的构造方法。但是此代码依然存在着问题:

在代码中Person类比较完整了,也可以通过getInfo()得到全部的信息,但是学生类呢?并没有提供一个得到信息的方法。 class Student extends Person{ private String school ;

public Student(String name,int age,String school){ super(name,age) ;

this.setSchool(school) ; }

public void setSchool(String school){ this.school = school ; }

public String getSchool(){ return this.school ; }

public String getSInfo(){

return \姓名:\;年龄:\;学校:\ } };

正常情况下,不管是对学生也好还是对人也好,得到信息就应该是getInfo(),但是现在父类中已经存在了此方法名称,如果子类要想再使用此方法名称,则此时就称为方法的覆写。 3.4、覆写

所谓的方法覆写是指子类编写了与父类相同的方法名称,返回值类型。 但是在覆写的时候也有一些要求:

? 方法名称必须一致,参数类型也必须一致,返回值类型也要一致 ? 方法覆写的时候一定要注意访问权限

|- 即:被覆写的方法不能拥有比父类中更严格的访问权限

访问权限:实际上现在已经学过了三种访问权限:default、private、public,三种的关系: ? private < default < public。 3.4.1、方法覆写的基本实现 观察方法覆写的基本形式 class A{

public void print(){

System.out.println(\ } };

class B extends A{

// 此时,发现print方法被子类覆写 public void print(){

System.out.println(\ } };

public class OODemo08{

public static void main(String argsp[]){ B b = new B() ; b.print() ; } };

子类中如果覆写了父类中的方法,那么在调用的时候调用的是被子类覆写过的方法。 观察访问权限: 1、 代码一: class A{

public void print(){

System.out.println(\ } };

class B extends A{ // 权限缩小了 void print(){