十二 java面向对象程序设计(类的继承)
/**
* 类的继承
*/
class Person
{
private String name;
private int age;
public String setName(String name){this.name = name;return name;}
public int setAge(int age){this.age = age;return age;}
public void getInfo()
{
System.out.println("name = " + name + ", age = " + age);
}
}
/*
class Student //Student类重复定义了Person类的方法和成员变量
{
private String name;
private int age;
public String setName(String name){this.name = name;return name;}
public int setAge(int age){this.age = age;return age;}
public void getInfo()
{
System.out.println("name = " + name + ", age = " + age);
}
private String school;
public String setSchool(String school){this.school = school; return school;}
public void study()
{
System.out.println("study in " + school);
}
}
*/
/**
* 1,通过继承可以简化类的定义 。
*/
class Student extends Person //通过继承,这些重复的定义将被省略.
{
private String school;
public String setSchool(String school){this.school = school; return school;}
public void study()
{
System.out.println("study in " + school);
}
public static void main(String[] args)
{
Person p1 = new Person();
p1.setName("unknown");p1.setAge(0);
//p1.setSchool("unknown");错误,父类不能访问子类的成员.
p1.getInfo();
//p1.study();错误,父类不能访问子类的成员.
Person p2 = new Student();
p2.setName("mike");
p2.setAge(23);
((Student)p2).setSchool("Cambridge");
p2.getInfo();
((Student)p2).study();
//父类的对象可以向下转型.
Student s1 = new Student();
s1.setName("jackson");s1.setAge(24);s1.setSchool("Oxford");
s1.getInfo();
s1.study();
/*但不能向上转型
Student s2 = (Student)new Person();
s2.setName("jane");s2.setAge(22);s2.setSchool("Cambridge");
s2.getInfo();
s2.study();
*/
}
}
/**
* 2,Java只支持单根继承,不允许多重继承。
* 可以有多层继承,即一个类可以继承某一个类的子类,如类B继承了类A,类C又可以继承类B,那么类C也间接继承了类A。
*/
class A
{
public void displayA() { System.out.println("class A is calling..."); }
}
class B extends A
{
public void displayB() { displayA();System.out.println("class B is calling..."); }
}
//class C extends B,A{}//类C不能同时继承类A和类B
class C extends B
{
public void displayC(){ displayB();System.out.println("class C is calling..."); }
public static void main(String[] args)
{
new C().displayA();
new C().displayB();
new C().displayC();
}
}
/**
* 3,子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法。
* 在子类的构造方法中可使用语句super(参数列表) 调用父类的构造方法。
* 4,如果子类的构造方法中没有显式地调用父类构造方法,也没有使用this关键字调用重载的其它构造方法,
* 则在产生子类的实例对象时,系统默认调用父类无参数的构造方法。
*/
/* 默认构造方法
class Original{
private int Orig_i;
private String Orig_str;
//public Original() {} //当我们没有为基类添加构造方法时,编译器将自动为编译器添加一个默认的构造方法.
}
public class Inherit extends Original
{
private String In_str;
//public Inherit() { super(); }//此时,子类的默认构造方法将自动添加一个super()方法来调用基类的默认构造方法.
}
*/
/* 带参数的构造方法
class Original{
private int Orig_i;
private String Orig_str;
public Original(int Orig_i,String Orig_str) { this.Orig_i = Orig_i; this.Orig_str = Orig_str; }
}
public class Inherit extends Original
{
private String In_str;
public Inherit() {}
//当我们在基类手动添加了一个带参数的构造方法,这时编译器将不再为我们创建不带参数的构造方法,
//由于,类的继承不能继承构造方法,所以运行时会报错--缺少无参的构造方法!
}
*/
/* 使用super调用基类构造方法.
class Original{
private int Orig_i;
private String Orig_str;
public Original(int Orig_i,String Orig_str) { this.Orig_i = Orig_i; this.Orig_str = Orig_str; }
}
public class Inherit extends Original
{
private String In_str;
public Inherit() { super(20,"hello"); }
//我们可以通过super关键字调用基类的带参数的构造方法
}
*/
class Original
{
protected int Orig_i;
protected String Orig_str;
public Original()
{
Orig_i = 0;
Orig_str = "";
}
public Original(int Orig_i,String Orig_str)
{
this.Orig_i = Orig_i;
this.Orig_str = Orig_str;
}
}
public class Inherit extends Original
{
private String In_str;
public Inherit()
{
super();
}
public Inherit(int Orig_i,String Orig_str)
{
super(Orig_i,Orig_str);
}
public Inherit(int Orig_i,String Orig_str,String In_str)
{
this(Orig_i,Orig_str);
//super(Orig_i,Orig_str);
//也可以用super调用基类的构造方法,也可以通过this调用子类的重载的构造方法.
this.In_str = In_str;
}
public void getInfo()
{
System.out.println("Orig_i = " + Orig_i + ", Orig_str = " + Orig_str + ", In_str = " + In_str);
}
public static void main(String[] args)
{
new Inherit().getInfo();
new Inherit(2,"Original").getInfo();
new Inherit(3,"Original","Inherit").getInfo();
}
}
/* output from Student main()
name = unknown, age = 0
name = mike, age = 23
study in Cambridge
name = jackson, age = 24
study in Oxford
*/
/* output from C main()
class A is calling...
class A is calling...
class B is calling...
class A is calling...
class B is calling...
class C is calling...
*/
/* output from Inherit main()
Orig_i = 0, Orig_str = , In_str = null
Orig_i = 2, Orig_str = Original, In_str = null
Orig_i = 3, Orig_str = Original, In_str = Inherit
*/