day08作业--------------Java面向对象JavaObject01
作业:
1.定义一个Student类:
a. 要求包含4个成员变量 String name, int age, boolean isMale, int sno
b. 分别定义5个构造方法
分别为无参构造
初始化name成员变量值的1参构造方法
初始化name 和 sno两个成员变量值的2参构造方法
初始化name,age,isFimale三个成员变量值的3参构造方法
初始化name,age, isMale,sno这4个成员变量值的4参构造方法
c. 再定义一个成员方法
public void print() {
System.out.println(name + "---" + age + "---" + (isMale ? "男" : "女") + "---" + sno);}
2. 在第一题的基础上,创建两个Student对象分别为stu1和stu2
要求stu1对象的四个成员变量name, age, isMale, sno的值分别为“张三”,18,true, 1
要求stu2对象的四个成员变量name, age, isMale, sno的值分别为“李四”,25,false, 2
然后在两个对象上调用print()方法即
stu1.print(), stu2.print(),两次调用方法输出的结果相同吗?
为什么?(提示:在方法体中访问name成员变量,直接用成员变量名name,是this.name的简写形式)
3. 在定义类MyStudent(类中定义的成员变量和成员方法同Student,同时在MyStudent类中定义和Student相似的5个构造方法)的基础上,根据需要修改MyStudent相应构造方法的方法体,要求实现
MyStudent st = new MyStudent();
st.print();
这两句代码打印出的结果是 麻花疼---100---男---1000
4. 如下代码所示,分别将一个double类型的数据和一个引用类型的数据传入某个方法,在方法内分别对对应的数据进行一些运算 ,经过运算之后,double类型的数据和引用类型的数据分别是什么? 并解释下,为什么
1 public class Demo4 { 2 public static void main(String[] args) { 3 Person p = new Person(); 4 p.name = "我是马化腾"; 5 p.age = 50; 6 PersonTest(p); 7 double money = 100; 8 doubleTest(money); 9 System.out.println("方法执行后的money:"+money); 10 System.out.println("方法执行后的name:"+p.name); 11 } 12 private static void doubleTest(double money) { 13 money = 200; 14 } 15 public static void PersonTest(Person person) { 16 System.out.println("传入的person的name:"+person.name); 17 person.name = "我是马云"; 18 System.out.println("方法内重新赋值后的name:"+person.name); 19 } 20 } 21 class Person{ 22 String name; 23 int age; 24 }
答案;
1.
1 package com.day008; 2 /* 3 * 1.定义一个Student类: 4 a. 要求包含4个成员变量 String name, int age, boolean isMale, int sno 5 b. 分别定义5个构造方法 6 分别为无参构造 7 初始化name成员变量值的1参构造方法 8 初始化name 和 sno两个成员变量值的2参构造方法 9 初始化name,age,isFimale三个成员变量值的3参构造方法 10 初始化name,age, isMale,sno这4个成员变量值的4参构造方法 11 c. 在定义一个成员方法 12 public void print() { 13 System.out.println(name + "---" + age + "---" + (isMale ? "男" : "女") + "---" + sno); 14 */ 15 public class Demo1 { 16 public static void main(String[] args) { 17 //0.使用无参的构造方法 18 Student stu0 = new Student(); 19 System.out.println(stu0.name+"--"+stu0.age+"--"+stu0.isMale+"--"+stu0.sno); 20 //1.使用1参的构造方法 21 Student stu1 = new Student("张三"); 22 System.out.println(stu1.name+"--"+stu1.age+"--"+stu1.isMale+"--"+stu1.sno); 23 //2.使用2参的构造方法 24 Student stu2 = new Student("李四",04); 25 System.out.println(stu2.name+"--"+stu2.age+"--"+stu2.isMale+"--"+stu2.sno); 26 //3.使用3参的构造方法 27 Student stu3 = new Student("王五",25,true); 28 System.out.println(stu3.name+"--"+stu3.age+"--"+stu3.isMale+"--"+stu3.sno); 29 //4.使用4参的构造方法 30 Student stu4 = new Student("赵六",26,true,06); 31 System.out.println(stu4.name+"--"+stu4.age+"--"+stu4.isMale+"--"+stu4.sno); 32 //调用成员方法 33 stu4.print(); 34 } 35 } 36 //定义学生类 37 class Student{ 38 //a.定义4个成员变量 39 String name; 40 int age; 41 boolean isMale; 42 int sno; 43 44 //分别定义5个构造方法 45 //0.定义无参构造 46 public Student() { 47 name = "不知名字"; 48 age = -1; 49 isMale = true; 50 sno = -1; 51 System.out.println("0.使用了无参的构造方法Student() "); 52 } 53 54 55 //1.初始化name成员变量值的1参构造方法 56 public Student(String name) { 57 this.name = name; 58 System.out.println("1.使用了1参的构造方法Student(String name) "); 59 } 60 //2.初始化name 和 sno两个成员变量值的2参构造方法 61 public Student(String name, int sno) { 62 this.name = name; 63 this.sno = sno; 64 System.out.println("2.使用了2参的构造方法Student(String name, int sno) "); 65 } 66 //3.初始化name,age,isFimale三个成员变量值的3参构造方法 67 public Student(String name, int age, boolean isMale) { 68 this.name = name; 69 this.age = age; 70 this.isMale = isMale; 71 System.out.println("3.使用了3参的构造方法Student(String name, int age, boolean isMale) "); 72 } 73 //4.初始化name,age, isMale,sno这4个成员变量值的4参构造方法 74 public Student(String name, int age, boolean isMale, int sno) { 75 this.name = name; 76 this.age = age; 77 this.isMale = isMale; 78 this.sno = sno; 79 System.out.println("4.使用了4参的构造方法Student(String name, int age, boolean isMale, int sno )"); 80 } 81 82 83 //c.定义成员方法 84 public void print() { 85 System.out.println(this.name+"调用print()成员方法"); 86 System.out.println(name +" "+age+" "+(isMale ? "男" : "女")+" "+sno); 87 } 88 89 90 }
运行结果:
2.
1 package com.day008; 2 /* 3 * 2. 在第一题的基础上,创建两个Student对象分别为stu1和stu2 4 要求stu1对象的四个成员变量name, age, isMale, sno的值分别为“张三”,18,true, 1 5 要求stu2对象的四个成员变量name, age, isMale, sno的值分别为“李四”,25,false, 2 6 然后在两个对象上调用print()方法即 7 stu1.print(), stu2.print(),两次调用方法输出的结果相同吗? 8 为什么?(提示:在方法体中访问name成员变量,直接用成员变量名name,是this.name的简写形式) 9 */ 10 public class Demo2 { 11 public static void main(String[] args) { 12 Student stu1 = new Student("张三",18,true,1); 13 Student stu2 = new Student("李四",25,false,2); 14 stu1.print(); 15 stu2.print(); 16 } 17 18 }
运行结果:
原因:
a.在不同对象上调用print方法打印出的结果不同。
b.在stu1对象上调用print()方法,打印的结果是stu1对象的成员变量的值
在stu2对象上调用print()方法,打印的结果是stu2对象的成员变量的值
c.之所以出现这样的结果,是因为在代码中输出name等成员变量的值,其实相当于,访问的是this.name, this.age, this.isMale, this.sno
又因为,this代表的是当前对象,即在哪个对象上访问成员方法print(), print()方法中的this就代表哪个对象,因此,在两个不同对象上调用print()方法,访问到达分别是两个不同对象的成员变量的值。
3.
1 public class MyStudent { 2 3 String name; 4 int age; 5 boolean isFemale; 6 int sno; 7 8 /* 9 * 无参构造方法 10 */ 11 public MyStudent() { 12 // 这里两种实现方式 13 // 第一种,最简单的方式,即直接在无参构造方法中调用4参构造方法给对象的成员变量 14 // 赋予自己规定的初值 15 // this("麻花疼", 100, true, 1000); 16 17 // 第二种方式,这几个构造方法的层层调用 18 // 无参调用——>1参构造——》2参构造——》3参构造 -》4参构造 19 this("麻花疼"); 20 21 } 22 23 /* 24 * 一参构造方法用来初始化name成员变量的值 25 */ 26 public MyStudent(String name) { 27 this(name, 1000); 28 } 29 30 /* 31 * 两参构造方法用来初始化name和sno成员变量的值 32 */ 33 public MyStudent(String name, int sno) { 34 this(name, 100, sno); 35 } 36 37 /* 38 * 三参构造方法用来初始化name,age和isFemale成员变量的值 39 */ 40 public MyStudent(String name, int age, int sno) { 41 this(name, age, true, sno); 42 } 43 44 /* 45 * 四参构造方法用来初始化name,age和isFemale和sno成员变量的值 46 */ 47 public MyStudent(String name, int age, boolean isFemale, int sno) { 48 this.name = name; 49 this.age = age; 50 this.isFemale = isFemale; 51 this.sno = sno; 52 } 53 54 public void print() { 55 System.out.println(name + "---" + age + "---" + (isFemale ? "男" : "女") + "---" + sno); 56 } 57 58 }
笨办法:
1 package com.day008; 2 /* 3 * 3. 在定义类MyStudent(类中定义的成员变量和成员方法同Student, 4 同时在MyStudent类中定义和Student相似的5个构造方法)的基础上, 5 根据需要修改MyStudent相应构造方法的方法体,要求实现 6 MyStudent st = new MyStudent(); 7 st.print(); 8 这两句代码打印出的结果是 麻花疼---100---男---1000 9 10 */ 11 public class Demo3 { 12 public static void main(String[] args) { 13 MyStudent st = new MyStudent(); 14 st.print(); 15 } 16 } 17 class MyStudent{ 18 //a.定义4个成员变量 19 String name; 20 int age; 21 boolean isMale; 22 int sno; 23 24 //分别定义5个构造方法 25 //0.定义无参构造 26 public MyStudent() { 27 this("马化腾",100,true,1000); 28 //System.out.println("0.使用了无参的构造方法Student() "); 29 } 30 31 32 //1.初始化name成员变量值的1参构造方法 33 public MyStudent(String name) { 34 this.name = name; 35 //System.out.println("1.使用了1参的构造方法Student(String name) "); 36 } 37 //2.初始化name 和 sno两个成员变量值的2参构造方法 38 public MyStudent(String name, int sno) { 39 this.name = name; 40 this.sno = sno; 41 System.out.println("2.使用了2参的构造方法Student(String name, int sno) "); 42 } 43 //3.初始化name,age,isFimale三个成员变量值的3参构造方法 44 public MyStudent(String name, int age, boolean isMale) { 45 this.name = name; 46 this.age = age; 47 this.isMale = isMale; 48 System.out.println("3.使用了3参的构造方法Student(String name, int age, boolean isMale) "); 49 } 50 //4.初始化name,age, isMale,sno这4个成员变量值的4参构造方法 51 public MyStudent(String name, int age, boolean isMale, int sno) { 52 this.name = name; 53 this.age = age; 54 this.isMale = isMale; 55 this.sno = sno; 56 //System.out.println("4.使用了4参的构造方法Student(String name, int age, boolean isMale, int sno )"); 57 } 58 59 60 //c.定义成员方法 61 public void print() { 62 //System.out.println(this.name+"调用print()成员方法"); 63 System.out.println(name +"--"+age+"--"+(isMale ? "男" : "女")+"--"+sno); 64 } 65 66 67 }
运行结果:
4.
1 package com.day008; 2 /* 3 * 如图所示,分别将一个double类型的数据和一个引用类型的数据传入某个方法, 4 * 在方法内分别对对应的数据进行一些运算 ,经过运算之后, 5 * double类型的数据和引用类型的数据分别是什么? 并解释下,为什么 6 */ 7 public class Demo4 { 8 public static void main(String[] args) { 9 Person p = new Person(); 10 p.name = "我是马化腾"; 11 p.age = 50; 12 PersonTest(p); 13 double money = 100; 14 doubleTest(money); 15 System.out.println("方法执行后的money:"+money); 16 System.out.println("方法执行后的name:"+p.name); 17 } 18 private static void doubleTest(double money) { 19 money = 200; 20 } 21 public static void PersonTest(Person person) { 22 System.out.println("传入的person的name:"+person.name); 23 person.name = "我是马云"; 24 System.out.println("方法内重新赋值后的name:"+person.name); 25 } 26 } 27 class Person{ 28 String name; 29 int age; 30 }
运行结果:
原因:
a. PersonTest(Person person)方法接受的是引用数据类型的参数,该引用类型的参数值,在调用方法和被调用方法中各有一份,但是两个参数对应的数据只有一份,即两个引用变量的值指向的是同一个对象,而方法体中,修改的同一个对象的成员变量值,所有在方法执行完之后,通过实际参数的引用值,访问同一个对象,所有访问到的是对象成员变量被修改后的值
b. 对于doubleTest(double money)方法而言,接收的是基本数据类型的参数,参数值在调用方法(main方法)和被调用方法(doubleTest方法)中各有一份,所以,在被调用方法体中,修改的其实只是被调用方法中那一份形式参数的值,所以在方法执行完之后,实际参数的值并未被修改。