面向对象(上)--2
一、内存解析
1、对象数组的内存解析
2、形参内存解析
1.形参是基本数据类型
2.形参是引用数据类型
二、练习题
1、方法的重载
package com.xuanxiao.object; /* * 1.编写程序,声明一个method方法,在方法打印一个10*8 的 * 形矩阵,在main方法中调用该方法 * 2.修改上一个程序,在method方法,除方法打印一个10*8 的 * 形矩阵,在计算该矩阵的面积 * 并将其最为方法返回值,在main方法中调用该方法,接受返回的面积并打印输出 * * 3.修改上一个程序,在method方法中提供 m n 两个参数,方法中打印一个m*n的*型面积 * 并计算该矩形的面积,将其作为方法的返回值,在main方法中调用该方法,接收返回的面积值并打印。 */ public class ExerTest { public static void main(String[] args) { ExerTest test = new ExerTest(); test.method(12,11); System.out.println(test.method(12,11)); } // 1. public void method() { for(int i =0;i<10;i++) { for(int j = 0;j<8;j++) { System.out.print("*"); } System.out.println(); } double area = 10 * 8; System.out.println("面积为:" + area); } // 2. public int method() { for(int i =0;i<10;i++) { for(int j = 0;j<8;j++) { System.out.print("*"); } System.out.println(); } return 10 * 8; } // 3. public int method(int m,int n) { for(int i =0;i<m;i++) { for(int j = 0;j<n;j++) { System.out.print("*"); } System.out.println(); } return m * n; } }
2、求圆的面积
package com.xuanxiao.object; //求圆的面积 public class CircleTest { public static void main(String[] args) { Circle c = new Circle(); c.radius = 2; double area = c.findArea(); System.out.println("圆的面积是:" + area); } } class Circle { double radius; public double findArea() { double area = Math.PI * radius * radius; return area; } }
3、同一个类中不同对象的关系
package com.xuanxiao.object; /* * 要求: * (1)创建Person类的对象,设置该对象的name,age和sex属性,调用study方法 * 输出字符串“studying”,吊桶showAge方法显示age值。 * 条用addAge方法给对象的age属性值加2岁。 * (2)创建第二个对象,体会同一个类中不同对象之间的关系。 */ public class PersonTest1 { public static void main(String[] args) { Person1 p1 = new Person1(); p1.name = "Tom"; p1.age = 18; p1.sex = 1; p1.study(); p1.showAge(); int newAge = p1.addAge(2); System.out.println("新年龄是:" + newAge); Person1 p2 = new Person1(); p2.showAge(); } }
package com.xuanxiao.object; public class Person1 { String name; int age; int sex; public void study() { System.out.println("Studying"); } public void showAge() { System.out.println("age:" + age); } public int addAge(int i) { age = age + i; return age; } }
4、属性方法的使用
package com.xuanxiao.object; public class PersonTest { public static void main(String[] args) { //2.创建类的对象 Person p1 = new Person(); //3.调用对象的结构 p1.name = "丽"; System.out.println(p1.name); p1.inMale = false; p1.eat(); p1.sleep(); p1.talk("chinese"); System.out.println("************"); Person p2 = new Person(); p2.name = "小明"; System.out.println(p2.name); System.out.println("************"); //p3 和 p1 指向同一个地址 Person p3 = p1; System.out.println(p3.name); } } //1.创建类,设计类的成员 class Person { String name; int age; boolean inMale; public void eat() { System.out.println("人可以吃饭"); } public void sleep() { System.out.println("人可以睡觉"); } public void talk(String language) { System.out.println("人可以说话,使用的是:" + language); } }
5、对象数组
package com.xuanxiao.object; /* * 定义一个Student类,包含三个属性,学号number(int),年级state(int),成绩score(int) * 创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。 * (1)打印出三年级(state = 3)的学生信息。 * (2)使用冒泡排序按照学生成绩排序,并遍历所有学生信息。 */ public class StudentTest { public static void main(String[] args) { Student[] stus = new Student[20]; for(int i = 0;i < stus.length;i++ ) { stus[i] = new Student(); stus[i].number = i+1; stus[i].state = (int)(Math.random() * (6-1+1) + 1); stus[i].score = (int)(Math.random() * ((100-0) + 1)); } for(int i = 0;i<stus.length;i++) { System.out.println("学号:" + stus[i].number +"\t年级:" + stus[i].state + "\t成绩:" + stus[i].score); } System.out.println("**********************************"); for(int i = 0;i<stus.length;i++) { if(stus[i].state == 3) { System.out.println("学号:" + stus[i].number +"\t年级:" + stus[i].state + "\t成绩:" + stus[i].score); } } System.out.println("**********************************"); for(int i = 0;i<stus.length-1;i++) { for(int j = 0;j<stus.length-1-i;j++) { if (stus[j].score > stus[j+1].score) { Student temp = stus[j]; stus[j] = stus[j + 1]; stus[j+1] = temp; } } } for(int i = 0; i < stus.length; i++) { //System.out.println("学号:" + stus[i].number + "\t年级:" + stus[i].state + "\t成绩:" + stus[i].score); System.out.println(stus[i].printer()); } } } class Student { int number; int state; int score; public String printer() { return "学号:" + number + "\t年级:" + state + "\t成绩:" + score; } }
6、递归
package com.xuanxiaio.zhaoyi1; /* * 1.用Java语言写出递归求阶乘的算法。 * 2.已知有一个数列,f(0)=1,f(1)=4,f(n+2)=2*f(n+1)+f(n),其中n是大于0的整数,求f(10)的值。 * 3.已知一个数列,f(20)=1,f(21)=4,f(n+2)=2*f(n+1)+f(n),其中n是大于0的整数,求f(10)的值。 * 4.输入一个数据n,计算斐波那契数列的第n个值 * 1 1 2 3 5 8 13 21 34 55 * 要求:计算斐波那契数列的第n个值,并将整个数列打印出来。 */ public class Recursion { public static void main(String[] args) { Recursion test = new Recursion(); System.out.println("测试结果1为:" + test.factorial(10)); int word = test.getnext1(10); System.out.println("测试结果2为:" + word); System.out.println("测试结果3为:" + test.getnext2(10)); System.out.println("测试结果4为:" + test.Fibonacci(10)); } //1.用Java语言写出递归求阶乘的算法。 public int factorial(int n) { if(n == 1) { return 1; }else { return n * factorial(n - 1); } } //2.已知有一个数列,f(0)=1,f(1)=4,f(n+2)=2*f(n+1)+f(n),其中n是大于0的整数,求f(10)的值。 public int getnext1(int n) { if(n == 0) { return 1; }else if(n == 1) { return 4; }else { return 2*getnext1(n-1) + getnext1(n-2); } } //3.已知一个数列,f(20)=1,f(21)=4,f(n+2)=2*f(n+1)+f(n),其中n是大于0的整数,求f(10)的值。 public int getnext2(int n) { if(n == 20) { return 1; }else if(n == 21) { return 4; }else { return getnext1(n+2) - 2*getnext1(n+1); } } /* * 4.输入一个数据n,计算斐波那契数列的第n个值 * 1 1 2 3 5 8 13 21 34 55 * 要求:计算斐波那契数列的第n个值,并将整个数列打印出来。 */ public int Fibonacci(int n) { if(n == 1) { return 1; }else if(n == 2) { return 1; }else { return Fibonacci(n-1) + Fibonacci(n-2); } } }