面向对象(匿名类、方法重载、可变个数的形参、值传递机制)
1.匿名类
实例代码如下:
package start; public class YuFa { public static void main(String[] args) { // 实际的对象 PersonTest p1 = new PersonTest(); p1.weight = 50; p1.height = 172; System.out.println("实际的对象的输出结果:"); p1.show(); // 匿名对象 System.out.println("匿名对象的输出结果:"); // 输出的值为默认值 new PersonTest().show(); // 修改体重之后,在新建一个匿名对象,结果不会被存储 System.out.println("修改后,匿名对象的输出结果:"); new PersonTest().weight = 48; new PersonTest().show(); } } // 建立测试类 class PersonTest{ // 成员变量,属性 int weight; int height; // 成员方法,显示数据 public void show() { System.out.println("weight = " + weight + "\t height = " + height); } }
2.方法重载:两同一不同:类名和方法名相同,形参列表不同
java默认的类中,很多有重载的方法:
举例:
package start; public class YuFa { public static void main(String[] args) { // 方法重载,两同一不同:类名和方法名相同,形参列表不同 PersonTest p1 = new PersonTest(); p1.show(30); p1.show(30.0); p1.show(true); p1.show("hello"); } } // 建立测试类 class PersonTest{ // 属性 int height; // 成员方法,显示数据 public void show(int weight) { System.out.println("int weight = " + weight ); } public void show(double weight) { System.out.println("double weight = " + weight ); } public void show(boolean weight) { System.out.println("boolean weight = " + weight ); } public void show(String weight) { System.out.println("String weight = " + weight ); } }
3.可变个数的形参
//JDK 5.0以前:采用数组形参来定义方法,传入多个同一类型变量,实例代码:
public static void test(int a ,String[] books);
//JDK5.0:采用可变个数形参来定义方法,传入多个同一类型变量,实例代码:
public static void test(int a ,String…books);
有关规范:
实例代码:
package start; public class YuFa { public static void main(String[] args) { // 可变个数的形参 PersonTest p1 = new PersonTest(); double[] d = new double[] {20.0,30.0,40.0}; p1.show(20,30,40); p1.show(d); } } // 建立测试类 class PersonTest{ // 属性 int height; // 成员方法,显示数据 // 可变个数的形参,可变个数的形参,weight相当于是一个数组,JDK5.0开始使用 public void show(int ...weight) { for(int i = 0;i < weight.length;i++) { System.out.println("weight " + (i + 1) + " = " + weight[i] ); } } // 可变个数的形参,可变个数的形参,weight数组,JDK5.0之前的版本使用 public void show(double[] weight) { for(int i = 0;i < weight.length;i++) { System.out.println("weight " + (i + 1) + " = " + weight[i] ); } } }
4.值传递机制
1)基本数据类型,赋值时是在栈中新建了一个空间;此时主函数和新建函数都产生一个变量。
package start; public class YuFa { // 成员方法一:主函数 public static void main(String[] args) { // 值传递 int weight = 50; System.out.println("主函数中,调用change函数前 weight = " + weight); change(weight); System.out.println("主函数中,调用change函数后 weight = " + weight); } // 成员方法二:change函数 public static void change(int weight) { System.out.println("change函数中,改变前 weight = " + weight); weight = 30; System.out.println("change函数中,改变前 weight = " + weight); } }
输出结果截图:
现象的解释:
2)引用数据类型的参数传递
package start; public class YuFa { // 实例中,p和p2对象指向同一块地址 // 成员方法一:主函数 public static void main(String[] args) { Person p = new Person(); p.x = 50; System.out.println("主函数中,调用change函数前 p.x= " + p.x); change(p); System.out.println("主函数中,调用change函数后p.x= " + p.x); } // 成员方法二:change函数 public static void change(Person p2) { System.out.println("change函数中,改变前 p2.x = " + p2.x); p2.x = 30; System.out.println("change函数中,改变前 p2.x = " + p2.x); } } // 创建类,作为引用数据类型 class Person{ int x; }
内存解析情况如下:
3)方法的参数传递——基本数据类型
内存情况如下,值不变:
4)方法的参数传递——引用数据类型
内存情况如下,值改变:
5)例题:
5.将对象作为参数传递给方法
题目:
代码:
package start; // 测试类 public class YuFa { public static void main(String[] args) { PassObject p = new PassObject(); Circle c = new Circle(); p.printAreas(c, 5); } } // 创建类,作为引用数据类型 class Circle{ // 成员属性 double radius; // 成员方法 public double findArea(double d) { radius = d; return Math.PI * radius * radius; } } class PassObject{ // 成员方法,打印面积 public void printAreas(Circle c, int time) { int i = 1; System.out.println("Radius" + "\t" + "Area"); for(i = 1;i <= time;i++) { System.out.print(i + "\t" + c.findArea(i)); System.out.println(" "); } System.out.println("now radius is:" + i); } }