设计类Circle计算圆的面积
package com.aiguigu.exer; //设计类Circle计算圆的面积 public class CircleTest { public static void main(String[] args) { Circle c1 = new Circle(); c1.radius = 2.1; System.out.println(c1.findArea()); } } //圆 class Circle{ //属性 double radius; //求圆的面积的方法 public double findArea(){ double area = Math.PI * radius * radius; return area; } }
画*矩阵
package com.aiguigu.exer; public class Exer3Test { public static void main(String[] args) { Exer3Test test = new Exer3Test(); System.out.println(test.method(10, 8)); } 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; } }
练习:学生
package com.aiguigu.exer; public class StudentTest { public static void main(String[] args) { //声明一个student数组 Student[] stus = new Student[20]; for(int i = 0;i < 20;i++){ stus[i] = new Student(); //给Student对象的属性赋值 stus[i].number = i + 1; stus[i].state = (int)(Math.random() * 6 + 1); //成绩 stus[i].score = (int)(Math.random()*(101)); } //遍历学生数组 for(int i = 0;i < stus.length;i++){ //System.out.println(stus[i].number + // "," + stus[i].score + "," + stus[i].state); System.out.println(stus[i].info()); } System.out.println("*********************************"); for(int i = 0;i < stus.length;i++){ if(stus[i].state == 3){ System.out.println(stus[i].info()); } } 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对象 Student temp = stus[j]; 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 + // "," + stus[i].score + "," + stus[i].state); System.out.println(stus[i].info()); } } } class Student{ int number;//学号 int state;//年纪 int score;//成绩 //显示学生信息的方法 public String info(){ return "学号:" + number + ",年级:" + state + ",成绩" + score; } }
练习:学生(优化)
package com.aiguigu.exer; /* * 此代码是对StudentTest的优化,将操作数组封装到方法中 */ public class StudentTest1 { public static void main(String[] args) { //声明一个student1数组 Student1[] stus = new Student1[20]; for(int i = 0;i < 20;i++){ stus[i] = new Student1(); //给Student1对象的属性赋值 stus[i].number = i + 1; stus[i].state = (int)(Math.random() * 6 + 1); //成绩 stus[i].score = (int)(Math.random()*(101)); } StudentTest1 test = new StudentTest1(); //遍历学生数组 test.print(stus); System.out.println("*********************************"); //查找年纪为3的学生 test.searchState(stus, 3); System.out.println("*********************************"); //冒泡排序 test.sort(stus); //遍历学生数组 test.print(stus); } //遍历Student1[]数组的操作 public void print(Student1[] stus){ for(int i = 0;i < stus.length;i++){ //System.out.println(stus[i].number + // "," + stus[i].score + "," + stus[i].state); System.out.println(stus[i].info()); } } public void searchState(Student1[] stus,int state){ for(int i = 0;i < stus.length;i++){ if(stus[i].state == state){ System.out.println(stus[i].info()); } } } //换序 public void sort(Student1[] stus){ 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对象 Student1 temp = stus[j]; temp =stus[j]; stus[j] = stus[j + 1]; stus[j + 1] = temp; } } } } } class Student1{ int number;//学号 int state;//年纪 int score;//成绩 //显示学生信息的方法 public String info(){ return "学号:" + number + ",年级:" + state + ",成绩" + score; } }
对象的知识补充
* 一、理解“万事万物皆对象” * * 1.在Java语言范畴中,我们都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构 * >Scanner,String * >文件:File * >网络资源:URL * 2.涉及到Java语言与前端Html,后端的数据库交互时,前后端的结构在Java层面交互式,都体现为类,对象 * * 二、内存解析的说明 * 1.引用类型的变量,只可能存储两类值:Null 或地址值(含变量类型) * * 三、匿名对象的使用 * 1.理解:我们创建的对象,没有显式的赋给一个变量名,即为匿名对象 * 2.特征:匿名对象只能调用一次
4.5 类的成员之二:方法
1.方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中
也称为函数或过程。
2.将功能封装为方法的目的是,可以实现代码重用,简化代码
3.Java里的方法不能独立存在,所有的方法必须定义在类里。
public class Person{ private int age; public int getAge() { //声明方法getAge() return age; } public void setAge(int i) { //声明方法setAge age = i; //将参数i的值赋给类的成员变量age } }
4.6再谈方法
4.6.1重载
重载的概念
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数
类型不同即可。
重载的特点:
与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类
型)。调用时,根据方法参数列表的不同来区别。
重载示例:
//返回两个整数的和 int add(int x,int y){return x+y;} //返回三个整数的和 int add(int x,int y,int z){return x+y+z;} //返回两个小数的和 double add(double x,double y){return x+y;}
package com.atguigu; /* * 1.重载举例 * * 2.判断是否是重载: * 跟方法的权限修饰符,返回值类型,形参变量名,方法体都没有关系 * * 3.在通过对象调用方法时,如何确定某一个指定的方法: * 方法名--->参数列表 * */ public class OverLoadTest { public void getSum(int i,int j){ } public void getSum(double d1,double d2){ } }
4.6.2可变个数形参
package com.atguigu; /* * 可变个数形参的方法 * * 1.jdk 5.0新增的内容 * 2.具体使用 * 2.1 可变个数形参的格式,数据类型....变量名 * 2.2 当调用可变个数形参的方法时,传入的参数个数可以是0个1个多个 * 2.3 可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载 * 2.4 可变个数形参的方法与本类中方法名相同,形参也相同的方法之间不构成重载 * 2.5 可变个数形参在方法的形参中,必须声明在末尾 * 2.6 可变个数形参在方法的形参中,最多声明一个可变形参 */ public class MethodArgsTest { public static void main(String[] args) { MethodArgsTest test = new MethodArgsTest(); test.show(12); test.show("Hello","world"); } public void show(int i){ } public void show(String ...strs){ System.out.println("show(String.....strs)"); } }
4.6.3方法参数的值传递机制
package com.atguigu; /* * 关于变量的赋值 * * 如果变量是基本数据类型,此时赋值的是变量所保存的数据值。 * 如果变量是引用数据类型,此时赋值的是变量所保存的数据的地址值。 * */ public class ValueTransferTest { public static void main(String[] args) { System.out.println("***************基本数据类型:*************"); int m = 10; int n = m; System.out.println("m = " + m + ", n = " + n); n = 20; System.out.println("m = " + m + ", n = " + n); System.out.println("***************引用数据类型:************"); Order o1 = new Order(); o1.orderId = 1001; Order o2 = o1;//赋值以后,o1和o2的地址值相同,都指向了堆空间中的同一个对象主体 System.out.println("o1.orderId = " + o1.orderId + " ,o2.orderId = " + o2.orderId); } } class Order{ int orderId; }
package com.atguigu; /* * 方法的形参的传递机制,值传递 * * 1.形参,方法定义时,声明小括号内的参数 * 2.实参,方法调用时,实际传递给形参的数据 * * 2.值传递机制: * 如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值。 * 如果参数是引用数据类型,此时实参赋给形参的实参存储数据的地址值。 */ public class ValueTransfer1 { public static void main(String[] args) { //交换两个变量的值的操作 int m = 10; int n = 20; System.out.println("m = " + m + ", n = " + n); ValueTransfer1 test = new ValueTransfer1(); test.swap(m, n); System.out.println("m = " + m + ", n = " + n); } //交换两个变量值的方法 public void swap(int m,int n){ int temp = m; m = n; n = temp; System.out.println("m = " + m + ", n = " + n); } }
4.6.4 递归方法
package com.atguigu; /* * 递归方法的使用(了解) * 1.递归方法:一个方法体内调用它自身 * 2.方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无需循环控制。 * 递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环。 */ public class RecursionTest { public static void main(String[] args) { //例1:计算1-100之间所有自然数的和 //方式一 //int sum = 0; //for(int i = 1;i <= 100;i++){ //sum += i; //} //方式二: RecursionTest test = new RecursionTest(); int sum = test.getSum(100); System.out.println(sum); System.out.println("*********************"); int value =test.f(10); System.out.println(value); } public int getSum(int n){ if(n == 1){ return 1; }else{ return n + getSum(n - 1); } } //例3:已知有一个数列:f(0) = 1,f(1) = 4,f(n+2) = 2*f(n+1) + f(n), //其中n是大于0的整数,求f(10)的值。 public int f(int n){ if(n == 0){ return 1; }else if(n == 1){ return 4; }else{ return 2*f(n - 1) + f(n - 2); } } //例4.斐波那契数列 //例5.汉诺塔问题 //例5:快排 }