封装相关练习

  1. 创建两个类,分别用来表示长方形和正方形,同时定义所需的成员变量,
    代表长方形或者正方形的边长,在两个类中分别定义两个方法,用来求对应形状的面积和周长,
    并定义相应的get,set方法,获取和改变方形和正方形的变长。
package com.homework.homework0720;

/**
 * @Author kinmon
 * @Date 2020/7/20 19:31
 * @Version 1.0
 * 1. 创建两个类,分别用来表示长方形和正方形,同时定义所需的成员变量,
 *    代表长方形或者正方形的边长,在两个类中分别定义两个方法,用来求对应形状的面积和周长,
 *    并定义相应的get,set方法,获取和改变方形和正方形的变长。
 */
public class Graph {
    public static void main(String[] args) {
        //长方形
        Rectangle rectangle = new Rectangle();
        rectangle.setA(2.0);
        rectangle.setB(3.0);
        System.out.println(rectangle.getA());
        System.out.println(rectangle.getB());
        System.out.println("长方形面积:" + rectangle.calculateArea());
        System.out.println("长方形周长:" + rectangle.calculatePerimeter());
        //正方形
        Square square = new Square();
        square.setC(4.0);
        System.out.println(square.getC());
        System.out.println("正方形面积:" + square.calculateArea());
        System.out.println("正方形周长:" + square.calculatePerimeter());
    }

}
//长方形
class Rectangle{
    //定义长为a  宽为b
    double a;
    double b;

    //求面积
    public double calculateArea(){
        return (a * b);
    }

    //求周长
    public double calculatePerimeter(){
        return 2 * (a + b);
    }

    public double getA() {
        return a;
    }

    public void setA(double a) {
        this.a = a;
    }

    public double getB() {
        return b;
    }

    public void setB(double b) {
        this.b = b;
    }
}
//正方形
class Square{
    //定义边长为c
    double c;

    //求面积
    public double calculateArea(){
        return (c * c);
    }

    //求周长
    public double calculatePerimeter(){
        return 4 * c;
    }

    public double getC() {
        return c;
    }

    public void setC(double c) {
        this.c = c;
    }
}

a. 声明一个Person类,里面定义了三个属性,name、gender、age(姓名、性别、年龄)
通过构造方法进行赋值。有一个display方法,可以展示对应的姓名性别年龄信息

b. 声明一个Student类,继承自Person类,增加一个独特的属性id(学号)
通过构造方法进行赋值,同时有一个方法可以展示姓名性别年龄学号信息

c. 声明一个Teacher类,继承自Person类,增加course属性(教学课程)
通过构造方法进行赋值,有一个方法,可以显示姓名性别年龄教学课程信息

d.编写一个测试类,验证你的代码.(分别创建Student对象,和Teacher对象,
要求利用子类对象的显示初始化,即在子类构造方法中,调用父类构造方法的方式
来初始化子类对象。)

package com.homework.homework0720;

/**
* @Author kinmon
* @Date 2020/7/20 20:08
* @Version 1.0
* 2.
* a. 声明一个Person类,里面定义了三个属性,name、gender、age(姓名、性别、年龄)
*   通过构造方法进行赋值。有一个display方法,可以展示对应的姓名性别年龄信息
* b. 声明一个Student类,继承自Person类,增加一个独特的属性id(学号)
*   通过构造方法进行赋值,同时有一个方法可以展示姓名性别年龄学号信息
* c. 声明一个Teacher类,继承自Person类,增加course属性(教学课程)
*   通过构造方法进行赋值,有一个方法,可以显示姓名性别年龄教学课程信息
* d.编写一个测试类,验证你的代码.(分别创建Student对象,和Teacher对象,
*   要求利用子类对象的显示初始化,即在子类构造方法中,调用父类构造方法的方式
*   来初始化子类对象。)
*/
public class Problem2 {
//测试类
  public static void main(String[] args) {
      //构造方法进行赋值
      Person person = new Person("zs",true,25);
      person.display();
      System.out.println("---------------------------------------------------");
      Student student = new Student(4,"zs",true,25);
      student.display();
      System.out.println("---------------------------------------------------");
      Teacher teacher = new Teacher("zs",true,25,"我是数学老师");
      teacher.display();
      System.out.println("---------------------------------------------------");
  }
}
class Person{
  //姓名
  String name;
  //性别
  boolean gender;
  //年龄
  int age;

  public Person(String name, boolean gender, int age) {
      this.name = name;
      this.gender = gender;
      this.age = age;
  }

  public void display() {
      System.out.println(getName());
      System.out.println(isGender() ? "男":"女");
      System.out.println(getAge());
  }

  public String getName() {
      return name;
  }

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

  public boolean isGender() {
      return gender;
  }

  public void setGender(boolean gender) {
      this.gender = gender;
  }

  public int getAge() {
      return age;
  }

  public void setAge(int age) {
      this.age = age;
  }
}
class Student extends Person{
  int id;

  public int getId() {
      return id;
  }

  public void setId(int id) {
      this.id = id;
  }

  public Student(int id,String name, boolean gender, int age) {
      super(name, gender, age);
      this.id = id;
  }
  public void display() {
      System.out.println(getName());
      System.out.println(getId());
      System.out.println(isGender() ? "男":"女");
      System.out.println(getAge());
  }
}
class Teacher extends Person{
  //教学课程
  String course;

  public Teacher(String name, boolean gender, int age, String course) {
      super(name, gender, age);
      this.course = course;
  }

  public String getCourse() {
      return course;
  }

  public void setCourse(String course) {
      this.course = course;
  }
  public void display() {
      System.out.println(getName());
      System.out.println(isGender() ? "男":"女");
      System.out.println(getAge());
      System.out.println(getCourse());
  }
}


  1. 定义一个Student类,并要求其他类在使用Student类的时候,最多只能创建10个Student类的对象,如何实现?

提示: 首先,要实现该功能,就不能让外部类直接使用
new Student(…)的方式来创建对象,如何不能让其他类new Student(…),
只需将Student类的所 有构造方法的,权限改为private即可。

    接着,把创建对Student对象的工作,交给一个专门的方法去做(想想这个方法应该是怎样的方法)
package com.homework.homework0720;

/**
 * @Author kinmon
 * @Date 2020/7/20 21:14
 * @Version 1.0
 * 3. 定义一个Student类,并要求其他类在使用Student类的时候,最多只能创建10个Student类的对象,如何实现?
 *  提示: 首先,要实现该功能,就不能让外部类直接使用
 *          new Student(...)的方式来创建对象,如何不能让其他类new Student(...),
 *         只需将Student类的所 有构造方法的,权限改为private即可。
 *         接着,把创建对Student对象的工作,交给一个专门的方法去做(想想这个方法应该是怎样的方法)
 */
public class Problem3 {
    //测试
    public static void main(String[] args) {
        System.out.println("创建Student2对象");
        Student2.createObject();
    }
}
class Student2 {
    //私有静态成员变量,类加载时加载一次,后续一直存在于内存中,以达到控制对象的生成的次数。
    private static int i = 1;
    private Student2(){ }
    public static Student2 createObject(){
        Student2 stu2 = null;
        if(i <= 10) {
            stu2 = new Student2();
            i++;
        }
        return stu2;
    }
}

附加题(附加题不做统一要求)
分别写出如下两幅图片中所示代码的输出,并解释为什么!!

a
在这里插入图片描述
//自己描述
base static
sub static
base构造代码块
base构造函数
sub构造代码块
sub构造函数
创建子类先加载父类,所以先是加载父类,静态代码块随类加载而加载,所以先是base static,后加载子类,同理然后加载sub
//老师描述
第一幅图片

  1. 创建子类对象之前,首先执行类加载过程
    先加载父类,于是父类中的静态代码块的代码先执行

  2. 父类加载完毕后,开始加载子类,于是子类静态代码块代码后执行

  3. 类加载过程完毕后,首先初始化父类对象,所以首先执行父类中的
    构造代码块,在执行父类中的构造方法

  4. 然后在初始化子类成员,执行子类的构造代码块,子类的构造方法
    b
    在这里插入图片描述
    //自己描述
    obj2
    obj1
    obj2
    obj3
    main函数开始,对Obj3进行初始化,Obj3继承Obj1,所以对Obj1进行初始化,先对Obj1的成员变量赋值,执行Obj2的初始化,输出obj2,后回到Obj1继续输出obj1,后回到Obj3继续初始化,再调用Obj2构造方法,输出obj2,后调用obj3构造方法,输出obj3,结束
    //老师描述
    第二幅图片

  5. 程序从 Obj3 obj3 = new Obj3();开始执行
    因为Obj3有父类Obj1,所以初始化子类对象之前,先初始化父类对象
    先执行,执行Obj1类中,成员变量赋值的语句
    Obj2 obj2 = new Obj2();

  6. 于是创建 Obj2类的对象,执行Obj2类的构造方法

  7. 对Obj3的父类(Obj1)对象的初始化还没完,执行完了Obj1类中的Obj2 obj2 = new Obj2()之后,因为Obj3的父类Obj1的构造方法还没执行完,紧接着执行Obj1类的构造方法,到此为止,Obj3的父类对象才初始化完

  8. 接近着才轮到Obj3对象初始化,首先先执行Obj3的成员变量的赋值语句
    Obj2 obj2 = new Obj2();执行Obj2的构造方法
    紧接着,执行Obj3的构造方法,Obj3对象到此才算初始化完毕

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值