- 创建两个类,分别用来表示长方形和正方形,同时定义所需的成员变量,
代表长方形或者正方形的边长,在两个类中分别定义两个方法,用来求对应形状的面积和周长,
并定义相应的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());
}
}
- 定义一个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
//老师描述
第一幅图片
-
创建子类对象之前,首先执行类加载过程
先加载父类,于是父类中的静态代码块的代码先执行 -
父类加载完毕后,开始加载子类,于是子类静态代码块代码后执行
-
类加载过程完毕后,首先初始化父类对象,所以首先执行父类中的
构造代码块,在执行父类中的构造方法 -
然后在初始化子类成员,执行子类的构造代码块,子类的构造方法
b
//自己描述
obj2
obj1
obj2
obj3
main函数开始,对Obj3进行初始化,Obj3继承Obj1,所以对Obj1进行初始化,先对Obj1的成员变量赋值,执行Obj2的初始化,输出obj2,后回到Obj1继续输出obj1,后回到Obj3继续初始化,再调用Obj2构造方法,输出obj2,后调用obj3构造方法,输出obj3,结束
//老师描述
第二幅图片 -
程序从 Obj3 obj3 = new Obj3();开始执行
因为Obj3有父类Obj1,所以初始化子类对象之前,先初始化父类对象
先执行,执行Obj1类中,成员变量赋值的语句
Obj2 obj2 = new Obj2(); -
于是创建 Obj2类的对象,执行Obj2类的构造方法
-
对Obj3的父类(Obj1)对象的初始化还没完,执行完了Obj1类中的Obj2 obj2 = new Obj2()之后,因为Obj3的父类Obj1的构造方法还没执行完,紧接着执行Obj1类的构造方法,到此为止,Obj3的父类对象才初始化完
-
接近着才轮到Obj3对象初始化,首先先执行Obj3的成员变量的赋值语句
Obj2 obj2 = new Obj2();执行Obj2的构造方法
紧接着,执行Obj3的构造方法,Obj3对象到此才算初始化完毕