day08_课后练习
代码阅读分析题
第1题
考核知识点:权限修饰符
如下代码是否可以编译通过,如果能,结果是什么,如果不能,为什么?
public class Father{
private String name = "atguigu";
int age = 0;
}
public class Child extends Father{
public String grade;
public static void main(String[] args){
Father f = new Child();
System.out.println(f.name);
}
}
package com.atguigu.test01;
public class Child extends Father{
public String grade;
public static void main(String[] args){
Father f = new Child();
// System.out.println(f.name);//编译错误,因为name私有化
}
}
第2题
考核知识点:继承,super,static
如下代码是否可以编译通过,如果能,结果是什么,如果不能,为什么?
public class Person{
public Person(){
System.out.println("this is a Person.");
}
}
public class Teacher extends Person{
private String name = "tom";
public Teacher(){
System.out.println("this is a teacher.");
super();
}
public static void main(String[] args){
Teacher tea = new Teacher();
System.out.println(this.name);
}
}
package com.atguigu.test02;
public class Teacher extends Person{
private String name = "tom";
public Teacher(){
System.out.println("this is a teacher.");
// super();//错误,super()必须在构造器首行
}
public static void main(String[] args){
Teacher tea = new Teacher();
// System.out.println(this.name);//错误,static方法中不能使用this
}
}
第3题
考核知识点:继承、this
package com.atguigu.test03;
public class Test03 {
public static void main(String[] args) {
Father f = new Father();
Son s = new Son();
System.out.println(f.getInfo());
System.out.println(s.getInfo());
s.setInfo("尚硅谷");
System.out.println(f.getInfo());
System.out.println(s.getInfo());
}
}
class Father{
private String info = "atguigu";
public void setInfo(String info){
this.info = info;
}
public String getInfo(){
return info;
}
}
class Son extends Father{
}
/*
1、私有的属性是否可以被继承到子类中?
(1)如果从可以访问性的角度来说:不能,因为在子类中不能直接访问父类的私有的属性,但是可以通过get/set操作
(2)如果从类的概念来说,
类是一类具有相同特性(属性、方法等)的事物的抽象描述,
那么子类是从父类派生出来的,那么子类是有父类的这个特征的,即有这个属性的
2、每一个对象的非静态属性是独立的,其中一个对象修改和另一个对象是无关的
*/
public class Test03 {
public static void main(String[] args) {
Father f = new Father();
Son s = new Son();
System.out.println(f.getInfo());
System.out.println(s.getInfo());
s.setInfo("尚硅谷");
System.out.println(f.getInfo());
System.out.println(s.getInfo());
}
}
class Father{
private String info = "atguigu";
public void setInfo(String info){
this.info = info;
}
public String getInfo(){
return info;
}
}
class Son extends Father{
}
第4题
考核知识点:继承、this、super
package com.atguigu.test04;
public class Test04 {
public static void main(String[] args) {
Father f = new Father();
Son s = new Son();
System.out.println(f.getInfo());
System.out.println(s.getInfo());
s.test();
System.out.println("-----------------");
s.setInfo("大硅谷");
System.out.println(f.getInfo());
System.out.println(s.getInfo());
s.test();
}
}
class Father{
private String info = "atguigu";
public void setInfo(String info){
this.info = info;
}
public String getInfo(){
return info;
}
}
class Son extends Father{
private String info = "尚硅谷";
public void test(){
System.out.println(this.getInfo());
System.out.println(super.getInfo());
}
}
/*
1、私有的属性是否可以被继承到子类中?
(1)如果从可以访问性的角度来说:不能,因为在子类中不能直接访问父类的私有的属性,但是可以通过get/set操作
(2)如果从类的概念来说,
类是一类具有相同特性(属性、方法等)的事物的抽象描述,
那么子类是从父类派生出来的,那么子类是有父类的这个特征的,即有这个属性的
2、每一个对象的非静态属性是独立的,其中一个对象修改和另一个对象是无关的
3、当子类有与父类的属性同名时,那么通过子类对象调用get/set方法操作的是父类继承还是子类自己的属性呢?
要看子类是否重写:
如果没有重写,操作的都是父类的,不管是直接getInfo()还是this.getInfo(),还是super.getInfo()
如果重写了,如果通过子类对象调用,操作的是子类的,例如:getInfo()还是this.getInfo(),
如果通过super.调用的,操作的是父类的。
*/
public class Test04 {
public static void main(String[] args) {
Father f = new Father();
Son s = new Son();
System.out.println(f.getInfo());
System.out.println(s.getInfo());
s.test();
System.out.println("-----------------");
s.setInfo("大硅谷");
System.out.println(f.getInfo());
System.out.println(s.getInfo());
s.test();
}
}
class Father{
private String info = "atguigu";
public void setInfo(String info){
this.info = info;
}
public String getInfo(){
return info;
}
}
class Son extends Father{
private String info = "尚硅谷";
public void test(){
System.out.println(this.getInfo());
System.out.println(super.getInfo());
}
}
第05题
考核知识点:继承、this、super、重写
package com.atguigu.test05;
public class Test05 {
public static void main(String[] args) {
Father f = new Father();
Son s = new Son();
System.out.println(f.getInfo());
System.out.println(s.getInfo());
s.test();
System.out.println("-----------------");
s.setInfo("大硅谷");
System.out.println(f.getInfo());
System.out.println(s.getInfo());
s.test();
}
}
class Father{
private String info = "atguigu";
public void setInfo(String info){
this.info = info;
}
public String getInfo(){
return info;
}
}
class Son extends Father{
private String info = "尚硅谷";
public void setInfo(String info){
this.info = info;
}
public String getInfo(){
return info;
}
public void test(){
System.out.println(this.getInfo());
System.out.println(super.getInfo());
}
}
/*
1、私有的属性是否可以被继承到子类中?
(1)如果从可以访问性的角度来说:不能,因为在子类中不能直接访问父类的私有的属性,但是可以通过get/set操作
(2)如果从类的概念来说,
类是一类具有相同特性(属性、方法等)的事物的抽象描述,
那么子类是从父类派生出来的,那么子类是有父类的这个特征的,即有这个属性的
2、每一个对象的非静态属性是独立的,其中一个对象修改和另一个对象是无关的
3、当子类有与父类的属性同名时,那么通过子类对象调用get/set方法操作的是父类继承还是子类自己的属性呢?
要看子类是否重写:
如果没有重写,操作的都是父类的,不管是直接getInfo()还是this.getInfo(),还是super.getInfo()
如果重写了,如果通过子类对象调用,操作的是子类的,例如:getInfo()还是this.getInfo(),
如果通过super.调用的,操作的是父类的。
*/
public class Test08 {
public static void main(String[] args) {
Father f = new Father();
Son s = new Son();
System.out.println(f.getInfo());
System.out.println(s.getInfo());
s.test();
System.out.println("-----------------");
s.setInfo("大硅谷");
System.out.println(f.getInfo());
System.out.println(s.getInfo());
s.test();
}
}
class Father{
private String info = "atguigu";
public void setInfo(String info){
this.info = info;
}
public String getInfo(){
return info;
}
}
class Son extends Father{
private String info = "尚硅谷";
public void setInfo(String info){
this.info = info;
}
public String getInfo(){
return info;
}
public void test(){
System.out.println(this.getInfo());
System.out.println(super.getInfo());
}
}
代码编程题
## 第1题
知识点:Object类的方法
案例:
1、声明三角形类,包含a,b,c三边
(1)属性私有化,提供无参,有参构造,提供get/set
(2)重写:toString()
(3)重写:hashCode和equals方法
(4)编写 public double getArea():求面积方法
(5)编写 public double getPiremeter():求周长方法
2、声明测试类Test06,在测试类中创建两个三角形对象,调用以上方法进行测试
package com.atguigu.test06;
public class Test06 {
public static void main(String[] args) {
Triangle t1 = new Triangle(3,4,5);
Triangle t2 = new Triangle(3,3,3);
System.out.println(t1);
System.out.println(t2);
System.out.println("t1的面积:" + t1.getArea());
System.out.println("t1的周长:" + t1.getPiremeter());
System.out.println("t2的面积:" + t2.getArea());
System.out.println("t2的面积:" + t2.getPiremeter());
System.out.println("t1和t2是否相同:" + t1.equals(t2));
}
}
class Triangle{
private double a;
private double b;
private double c;
public Triangle(double a, double b, double c) {
super();
this.a = a;
this.b = b;
this.c = c;
}
public Triangle() {
super();
}
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;
}
public double getC() {
return c;
}
public void setC(double c) {
this.c = c;
}
@Override
public String toString() {
return "三角形的三条边:a=" + a + ", b=" + b + ", c=" + c;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits(a);
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(b);
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(c);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Triangle other = (Triangle) obj;
if (Double.doubleToLongBits(a) != Double.doubleToLongBits(other.a))
return false;
if (Double.doubleToLongBits(b) != Double.doubleToLongBits(other.b))
return false;
if (Double.doubleToLongBits(c) != Double.doubleToLongBits(other.c))
return false;
return true;
}
public double getArea(){
double p = (a + b + c)/2;
return Math.sqrt(p * (p-a) * (p-b) * (p-c));
}
public double getPiremeter(){
return a + b + c;
}
}
第2题
案例:
1、在com.atguigu.test07包中声明员工类、程序员类、设计师类、架构师类,
-
员工类属性:编号、姓名、年龄、薪资
-
程序员类属性:编程语言,默认都是"java"
-
设计师类属性:奖金
-
架构师类属性:持有股票数量
要求:属性私有化,无参有参构造,get/set,getInfo方法(考虑重写)
2、在com.atguigu.test07包中声明Test07测试类
(1)在main中有一些常量和一个二维数组
final int EMPLOYEE = 10;//表示普通员工 final int PROGRAMMER = 11;//表示程序员 final int DESIGNER = 12;//表示设计师 final int ARCHITECT = 13;//表示架构师 String[][] EMPLOYEES = { {"10", "1", "段誉", "22", "3000"}, {"13", "2", "令狐冲", "32", "18000", "15000", "2000"}, {"11", "3", "任我行", "23", "7000"}, {"11", "4", "张三丰", "24", "7300"}, {"12", "5", "周芷若", "28", "10000", "5000"}, {"11", "6", "赵敏", "22", "6800"}, {"12", "7", "张无忌", "29", "10800","5200"}, {"13", "8", "韦小宝", "30", "19800", "15000", "2500"}, {"12", "9", "杨过", "26", "9800", "5500"}, {"11", "10", "小龙女", "21", "6600"}, {"11", "11", "郭靖", "25", "7100"}, {"12", "12", "黄蓉", "27", "9600", "4800"} };
(2)创建一个员工数组
(3)根据以上数据,初始化员工数组
提示:把字符串转为int和double类型的值,可以使用如下方式:
String idStr = "1"; int id = Integer.parseInt(idStr); String salaryStr = "7300"; double salary = Double.parseDouble(salaryStr);
(4)遍历数组,使用如下格式
编号 姓名 年龄 薪资 语言 奖金 股票 .....
package com.atguigu.test07; public class Employee { private int id; private String name; private int age; private double salary; public Employee() { super(); } public Employee(int id, String name, int age, double salary) { super(); this.id = id; this.name = name; this.age = age; this.salary = salary; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public String getInfo(){ return id + "\t" + name + "\t" + age + "\t" + salary; } }
package com.atguigu.test07; public class Programmer extends Employee{ private String language = "java"; public Programmer() { super(); } public Programmer(int id, String name, int age, double salary) { super(id, name, age, salary); } public Programmer(int id, String name, int age, double salary, String language) { super(id, name, age, salary); this.language = language; } public String getLanguage() { return language; } public void setLanguage(String language) { this.language = language; } @Override public String getInfo() { return super.getInfo() + "\t" + language; } }
package com.atguigu.test07; public class Designer extends Programmer { private double bonus; public Designer() { super(); } public Designer(int id, String name, int age, double salary, double bonus) { super(id, name, age, salary); this.bonus = bonus; } public Designer(int id, String name, int age, double salary, String language, double bonus) { super(id, name, age, salary, language); this.bonus = bonus; } public double getBonus() { return bonus; } public void setBonus(double bonus) { this.bonus = bonus; } @Override public String getInfo() { return super.getInfo()+ "\t" + bonus; } }
package com.atguigu.test07; public class Architect extends Designer { private int stock; public Architect() { super(); } public Architect(int id, String name, int age, double salary, double bonus, int stock) { super(id, name, age, salary, bonus); this.stock = stock; } public Architect(int id, String name, int age, double salary, String language, double bonus, int stock) { super(id, name, age, salary, language, bonus); this.stock = stock; } public int getStock() { return stock; } public void setStock(int stock) { this.stock = stock; } @Override public String getInfo() { return super.getInfo() + "\t" + stock; } }
package com.atguigu.test07; public class Test07 { public static void main(String[] args) { final int EMPLOYEE = 10;//表示普通员工 final int PROGRAMMER = 11;//表示程序员 final int DESIGNER = 12;//表示设计师 final int ARCHITECT = 13;//表示架构师 String[][] EMPLOYEES = { {"10", "1", "段誉", "22", "3000"}, {"13", "2", "令狐冲", "32", "18000", "15000", "2000"}, {"11", "3", "任我行", "23", "7000"}, {"11", "4", "张三丰", "24", "7300"}, {"12", "5", "周芷若", "28", "10000", "5000"}, {"11", "6", "赵敏", "22", "6800"}, {"12", "7", "张无忌", "29", "10800","5200"}, {"13", "8", "韦小宝", "30", "19800", "15000", "2500"}, {"12", "9", "杨过", "26", "9800", "5500"}, {"11", "10", "小龙女", "21", "6600"}, {"11", "11", "郭靖", "25", "7100"}, {"12", "12", "黄蓉", "27", "9600", "4800"} }; Employee[] all = new Employee[EMPLOYEES.length]; for (int i = 0; i < all.length; i++) { int type = Integer.parseInt(EMPLOYEES[i][0]); int id = Integer.parseInt(EMPLOYEES[i][1]); String name = EMPLOYEES[i][2]; int age = Integer.parseInt(EMPLOYEES[i][3]); double salary = Double.parseDouble(EMPLOYEES[i][4]); if(type == EMPLOYEE){ all[i] = new Employee(id, name, age, salary); }else if(type == PROGRAMMER){ all[i] = new Programmer(id, name, age, salary); }else if(type == DESIGNER){ double bonus = Integer.parseInt(EMPLOYEES[i][5]); all[i] = new Designer(id, name, age, salary, bonus); }else if(type == ARCHITECT){ double bonus = Double.parseDouble(EMPLOYEES[i][5]); int stock = Integer.parseInt(EMPLOYEES[i][6]); all[i] = new Architect(id, name, age, salary, bonus, stock); } } System.out.println("编号\t姓名\t年龄\t薪资\t语言\t奖金\t股票"); for (int i = 0; i < all.length; i++) { System.out.println(all[i].getInfo()); } } }
第3题
案例:
1、在com.atguigu.test08包中声明图形Graphic、圆Circle、矩形Rectangle类、三角形Triangle类
2、图形Graphic类中有:
①public double getArea()方法:返回面积
②public double getPerimeter()方法:返回周长
③public String getInfo()方法:返回图形信息
3、圆类和矩形类重写这两个方法
4、在com.atguigu.test08包中声明测试类Test08_1
(1)请设计一个方法,可以用于比较两个图形的面积是否相等
(2)请设计一个方法,可以用于找出两个图形中面积大的那个
(3)public static void main(String[] args){}
在主方法中,创建1个圆、1个矩形、1个三角形对象,并分别调用(1)、(2)方法进行测试。
5、在com.atguigu.test08包中测试类Test08_2
(1)请设计一个方法,可以用于遍历一个图形数组
(2)请设计一个方法,可以用于给一个图形数组进行按照面积从小到大排序
(3)public static void main(String[] args){}
在主方法中,创建1个圆、1个矩形、1个三角形对象,放到数组中,遍历显示,然后排序后再遍历显示。
package com.atguigu.test08;
public class Graphic {
public double getArea(){
return 0.0;
}
public double getPerimeter(){
return 0.0;
}
public String getInfo(){
return "面积:" + getArea() + ",周长:" + getPerimeter();
}
}
package com.atguigu.test08;
public class Circle extends Graphic{
private double radius;
public Circle() {
super();
}
public Circle(double radius) {
super();
this.radius = radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
@Override
public double getArea() {
return 3.14 * radius * radius;
}
@Override
public double getPerimeter() {
return 2 * 3.14 * radius;
}
@Override
public String getInfo() {
return "半径:" + radius + "," + super.getInfo();
}
}
package com.atguigu.test08;
public class Rectangle extends Graphic{
private double length;
private double width;
public Rectangle(double length, double width) {
super();
this.length = length;
this.width = width;
}
public Rectangle() {
super();
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
@Override
public double getArea() {
return length * width;
}
@Override
public double getPerimeter() {
return 2 * (length + width);
}
@Override
public String getInfo() {
return "长:" + length + ",宽:" + width + "," + super.getInfo();
}
}
package com.atguigu.test08;
public class Triangle extends Graphic{
private double a;
private double b;
private double c;
public Triangle() {
super();
}
public Triangle(double a, double b, double c) {
super();
this.a = a;
this.b = b;
this.c = c;
}
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;
}
public double getC() {
return c;
}
public void setC(double c) {
this.c = c;
}
@Override
public double getArea() {
double p = (a + b + c)/2;
return Math.sqrt(p * (p-a) * (p-b) * (p-c));
}
@Override
public double getPerimeter() {
return a+b+c;
}
@Override
public String getInfo() {
return "边长为:" + a + "," + b +"," + c+"," + super.getInfo();
}
}
package com.atguigu.test08;
public class Test08_01 {
public static void main(String[] args) {
Circle c1 = new Circle(2);
Rectangle r1 = new Rectangle(2, 3);
Triangle t1 = new Triangle(3, 4, 5);
System.out.println("c1的面积:" + c1.getArea());
System.out.println("r1的面积:" + r1.getArea());
System.out.println("t1的面积:" + t1.getArea());
System.out.println("c1和r1的面积是否相等:" + equal(c1, r1));
System.out.println("c1和t1的面积是否相等:" + equal(c1, t1));
System.out.println("r1和t1的面积是否相等:" + equal(r1, t1));
Graphic max1 = getMax(c1, r1);
System.out.println("c1和r1中面积大的是:" + max1.getArea());
Graphic max2 = getMax(c1, t1);
System.out.println("c1和t1中面积大的是:" + max2.getArea());
Graphic max3 = getMax(r1, t1);
System.out.println("r1和t1中面积大的是:" + max3.getArea());
}
public static boolean equal(Graphic g1, Graphic g2){
return g1.getArea() == g2.getArea();
}
public static Graphic getMax(Graphic g1, Graphic g2){
return g1.getArea() > g2.getArea() ? g1 : g2;
}
}
package com.atguigu.test08;
public class Test08_02 {
public static void main(String[] args) {
Graphic[] all = new Graphic[3];
all[0] = new Circle(2);
all[1] = new Rectangle(2, 3);
all[2] = new Triangle(3, 4, 5);
System.out.println("排序前:");
print(all);
sort(all);
System.out.println("排序后:");
print(all);
}
public static void print(Graphic[] all){
for (int i = 0; i < all.length; i++) {
System.out.println(all[i].getInfo());
}
}
public static void sort(Graphic[] all){
for (int i = 1; i < all.length; i++) {
for (int j = 0; j < all.length-i; j++) {
if(all[j].getArea() > all[j+1].getArea()){
Graphic temp = all[j];
all[j] = all[j+1];
all[j+1] = temp;
}
}
}
}
}
第4题
案例:
1、在com.atguigu.test09包中声明人Person、男人Man、女人Woman类
(1)在Person类中,包含
①public void eat():打印吃饭
②public void toilet():打印上洗手间
(2)在Man类中,包含
①重写上面的方法
②增加 public void smoke():打印抽烟
(3)在Woman类中,包含
①重写上面的方法
②增加 public void makeup():打印化妆
2、在com.atguigu.test09包中声明测试类Test09
(1)public static void meeting(Person… ps)
在该方法中,每一个人先吃饭,然后上洗手间,然后如果是男人,随后抽根烟,如果是女人,随后化个妆
(2)public static void main(String[] args)
在主方法中,创建多个男人和女人对象,并调用meeting()方法进行测试
package com.atguigu.test09;
public class Person {
public void eat(){
System.out.println("吃饭");
}
public void toilet(){
System.out.println("上洗手间");
}
}
package com.atguigu.test09;
public class Man extends Person{
@Override
public void eat() {
System.out.println("细嚼慢咽吃饭");
}
@Override
public void toilet() {
System.out.println("男生上洗手间");
}
public void smoke(){
System.out.println("抽烟爽爽");
}
}
package com.atguigu.test09;
public class Woman extends Person{
@Override
public void eat() {
System.out.println("狼吞虎咽吃饭");
}
@Override
public void toilet() {
System.out.println("女生上洗手间");
}
public void makeup(){
System.out.println("化妆美美");
}
}
package com.atguigu.test09;
public class Test09 {
public static void main(String[] args) {
meeting(new Woman(),new Man(), new Woman(), new Man());
}
public static void meeting(Person... ps){
for (int i = 0; i < ps.length; i++) {
ps[i].eat();
ps[i].toilet();
if(ps[i] instanceof Woman){
((Woman)ps[i]).makeup();
}else if(ps[i] instanceof Man){
((Man)ps[i]).smoke();
}
}
}
}