练武场之“封装、继承”攻略(未完待续)

如题:

使用继承编写Person、Student类

  • 编写Person类:
    • 属性有:姓名、年龄、出生日期
    • 方法有:showInfo();
  • 编写Student类:
    • 属性有:姓名、年龄、出生日期、学校
    • 方法有:showInfo();
    • study();
  • 使用继承优化Student类。

Ready Go!

第一步

Person类

 1 package a;
 2 //父类
 3 public class Person {
 4 //    为了让成员变量隐藏(封装),便于对值制定规则;否则变量会被直接赋值。
 5     private String name;
 6     private int age;
 7     private String birthday;
 8 //    年龄必须在构造函数中传入,因为没有set方法,私有变量不允许访问
 9 //    如果年龄小于0,年龄就是0;否则才给age赋值
10     public Person(int age) {
11         if (age<0) {
12             this.age=0;
13         }else {
14             this.age=age;
15         }
16     }
17 //    为了给其他用户访问变量,我们用get和set方法给变量赋值
18 //    为name提供get方法
19     public void setName(String name) {
20         this.name=name;
21     }
22     public String getName(String name) {
23         return this.name;
24     }
25 //    自动生成get、set方法
26 //    Source→
27     public String getBirthday() {
28         return birthday;
29     }
30     public void setBirthday(String birthday) {
31         this.birthday = birthday;
32     }
33 //    题目要求方法showInfo,打印相关信息
34 //    可将此段代码放到前边,便于阅读,这里为了便于理解,代码按书写顺序罗列。
35     public void showInfo() {
36         System.out.println("name="+name+";age="+age+";birthday="+birthday);
37     }    
38 }

测试类

 1 package a;
 2 // 测试类
 3 public class Demo {
 4     public static void main(String[] args) {
 5 //        创建对象p1,调用构造方法
 6 //        此处,如果Person类中,age是无参构造方法,此处很容易忘记赋值;有参方法则必须要赋值。
 7         Person p1 = new Person(18);
 8         p1.setName("Jack");
 9         p1.showInfo();
10     }
11 }

输出结果

name=Jack;age=18;birthday=null

第二步

编写Student类

   /*
     * 在子类继承后,需要在测试类中为Student类创建对象,构造方法, 
     * 同时,子类在继承父类的成员变量时,会默认创建一个构造方法,
     * 此构造方法会默认调用父类的默认构造方法,然而此时父类中只有Person(int age);
     * 因为我们添加了一个构造方法,所以系统不会再为我们提供默认构造方法,
     * 所以我们在创建Student类后,需要为Person类补一个默认构造方法。
     */
 1 package a;
 2 //子类
 3 public class Student extends Person{
 4 //     默认构造方法,可删除,系统会自动提供
 5     public Student() {
 6         
 7     }
 8 //    根据题意添加属性
 9     private String schoolName;
10 //    自动生成方法
11     public String getSchoolName() {
12         return schoolName;
13     }
14     public void setSchoolName(String schoolName) {
15         this.schoolName = schoolName;
16     }
17 //    根据题意添加方法
18 //    下面方法中Student类从Person类中继承过来的方法需要现在测试类中构造
19 //    父类中的name是私有变量,不能直接使用,所以下边使用getName方法调用
20 //    getName()在父类中自动生成带参数方法,需要删掉然后保存!!!
21     public void showInfo() {
22         //System.out.println("name=" + getName() + ";age=" + getAge() + ";birthday=" + getBirthday() + ";schooleName="+ schoolName);
23         System.out.println("name=" + getName() + ";age=" + getAge() + ";birthday=" + getBirthday() + ";schooleName="+ schoolName);
24     }
25 }

测试类

 1 package a;
 2 // 测试类
 3 public class Demo {
 4     public static void main(String[] args) {
 5 //        创建对象p1,调用构造方法
 6 //        此处,如果Person类中,age是无参构造方法,此处很容易忘记赋值;有参方法则必须要赋值。
 7         Person p1 = new Person(18);
 8         p1.setName("Jack");
 9         p1.showInfo();
10         
11 //        区分打印结果
12         System.out.println("********************************");
13         
14         Student s1 = new Student();
15         s1.setName("Tom");
16         s1.setSchoolName("Dalian");
17         s1.showInfo();
18 //        父类中的所有东西在子类中都被继承,只是部分东西限于控制符,不允许直接去用
19     }
20 }

Person类

package a;
//父类
public class Person {
//    为了让成员变量隐藏(封装),便于对值制定规则;否则变量会被直接赋值。
    private String name;
    private int age;
    private String birthday;
    /*
     * 在子类继承后,需要在测试类中为Student类创建对象,构造方法, 
     * 同时,子类在继承父类的成员变量时,会默认创建一个构造方法,
     * 此构造方法会默认调用父类的默认构造方法,然而此时父类中只有Person(int age);
     * 因为我们添加了一个构造方法,所以系统不会再为我们提供默认构造方法,
     * 所以我们在创建Student类后,需要为Person类补一个默认构造方法。
     */
    public Person() {
        // TODO Auto-generated constructor stub
    }
    
//    年龄必须在构造函数中传入,因为没有set方法,私有变量不允许访问
//    如果年龄小于0,年龄就是0;否则才给age赋值
    public Person(int age) {
        if (age<0) {
            this.age=0;
        }else {
            this.age=age;
        }
    }
//    为了给其他用户访问变量,我们用get和set方法给变量赋值
//    为name提供get方法
    public void setName(String name) {
        this.name=name;
    }
    public String getName() {
        return this.name;
    }
//    自动生成get、set方法
//    Source→
    public String getBirthday() {
        return birthday;
    }
    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }
    
public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    //    题目要求方法showInfo,打印相关信息
//    可将此段代码放到前边,便于阅读,这里为了便于理解,代码按书写顺序罗列。
    public void showInfo() {
        System.out.println("name="+name+";age="+age+";birthday="+birthday);
    }
}

到此,此题结束。

第三部分

根据此题展开讨论

  • 子类中添加变量name和父类中的name有什么关系?
  • 测试类中调用的name到底是谁的?

(未完待续)

今天被虐的头昏脑涨、怀疑人生 (*T_T*) 

猜你喜欢

转载自www.cnblogs.com/XueLin/p/11414237.html