十二 java面向对象程序设计(类的继承)

十二 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
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值