1.oop学习
三条主线
-
类及类的成员:属性、方法、构造器、内部类、代码块
-
三大特征:封装、继承、多态
-
关键字:super、this等等 思想
-
面向过程:强调功能行为,以函数为最小单位,考虑怎么做
-
面向对象:强调具备了功能的对象,以类/对象为最小单位,考虑谁来做
2.类的成员构成
3.对象的内存解析
4.属性VS局部变量
- 位置:全局=属性 局部变量
- 权限:public等(局部不需要权限修饰符)
- 默认初始化:0 0.0 0 false(局部没有默认初始化值;形参在调用时赋值即可)
- 位置:属性在堆空间、局部变量在栈空间、static 方法区
5.方法
分类
方法名:好好起名
形参列表:逗号隔开
在使用中可以调用当前类的属性和方法
例子:
public class CircleTest {
//造类,造对象,调用(实现)功能
public static void main(String[] args) {
// TODO Auto-generated method stub
//方式一
Circle c1 = new Circle();
c1.r = 2;
double a1 = c1.findArea();
System.out.println(a1);
//方式二
Circle c2 = new Circle();
c2.r = 2;
c2.findArea2();
}
}
class Circle{
double r;
//方式一:
public double findArea() {
double area = Math.PI*r*r;
return area;
}
//方式二:
public void findArea2() {
double area2 = Math.PI*r*r;
System.out.println("面积为:"+area2);
}
}
6.练习
6.1 编写程序,声明一个method方法,在方法中打印一个10×8的星型矩形,在main方法中调用该方法。
public class PrintTest {
//造类,造对象,调用(实现)功能
public static void main(String[] args) {
// TODO Auto-generated method stub
PrintTest p1 = new PrintTest();
p1.method();
}
public void method() {
for(int i = 0;i<10;i++) {
for(int j = 0;j<8;j++) {
System.out.print("* ");
}
System.out.println();
}
return;
}
}
6.2 修改上一个程序,在method方法中,除打印一个10×8的星型矩形外,再计算该矩形的面积,并将其作为方法返回值。在main方法中调用该方法,接收返回的面积值并打印。
//6.2
System.out.println("------------------------------------");
PrintTest p2 = new PrintTest();
int area = p2.method2();
System.out.println("面积为:"+area);
public int method2() {
for(int i = 0;i<10;i++) {
for(int j = 0;j<8;j++) {
System.out.print("* ");
}
System.out.println();
}
return 10*8;
}
6.3 修改上一个程序,在method方法提供m和n两个参数,方法中打印一个m×n的星型矩形,并计算该矩形的面积, 将其作为方法返回值。在main方法中调用该方法,接收返回的面积值并打印。
//6.3
System.out.println("------------------------------------");
PrintTest p3 = new PrintTest();
int mn = p2.method3(5,5);
System.out.println("面积为:"+mn);
public int method3(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;
}
6.4
定义类Student,包含三个属性:学号number(int),年级state(int),成绩score(int)。 创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。
问题一:打印出3年级(state值为3)的学生信息。
问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息
提示:
-
生成随机数:Math.random(),返回值类型double;
-
四舍五入取整:Math.round(double d),返回值类型long。
public class StudentTest {
/*
* 定义类Student,包含三个属性:学号number(int),年级state(int),成绩score(int)。 创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。
问题一:打印出3年级(state值为3)的学生信息。
问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息
提示:
1) 生成随机数:Math.random(),返回值类型double;
2) 四舍五入取整:Math.round(double d),返回值类型long。
*/
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].grade = (int)(Math.random()*(6 - 1 + 1) + 1);//1-6
stus[i].score = (int)(Math.random()*(100 - 0 + 1));//0-100
}
//遍历
for(int i = 0;i<stus.length;i++) {
//System.out.println("学号"+stus[i].rumber+"年级"+stus[i].grade+"分数"+stus[i].score);
System.out.println(stus[i].info());
}
System.out.println("------------------------------------");
//打印问题1
for(int i = 0;i<stus.length;i++) {
if(stus[i].grade == 3) {
System.out.println(stus[i].info());
}
}
System.out.println("------------------------------------");
//打印问题2
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].info());
}
System.out.println("------------------------------------");
}
}
class Student{
int number;
int grade;
int score;
public String info() {
return "学号:"+number+",年级:"+grade+",分数:"+score;
}
}
优化:功能封装
public class StudentTest1 {
/*
* 定义类Student,包含三个属性:学号number(int),年级state(int),成绩score(int)。 创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。
问题一:打印出3年级(state值为3)的学生信息。
问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息
提示:
1) 生成随机数:Math.random(),返回值类型double;
2) 四舍五入取整:Math.round(double d),返回值类型long。
*/
public static void main(String[] args) {
Student1 stus[] = new Student1[20];
for(int i = 0;i<stus.length;i++) {
stus[i] = new Student1();
stus[i].number = (i+1);
stus[i].grade = (int)(Math.random()*(6 - 1 + 1) + 1);//1-6
stus[i].score = (int)(Math.random()*(100 - 0 + 1));//0-100
}
StudentTest1 test = new StudentTest1();
test.PrintStudent(stus);
System.out.println("------------------------------------");
test.Search(stus,5);
System.out.println("------------------------------------");
test.sort(stus);
test.PrintStudent(stus);
System.out.println("------------------------------------");
}
//遍历
public void PrintStudent(Student1 stus[]) {
for(int i = 0;i<stus.length;i++) {
//System.out.println("学号"+stus[i].rumber+"年级"+stus[i].grade+"分数"+stus[i].score);
System.out.println(stus[i].info());
}
}
//查找
public void Search(Student1 stus[],int state) {
for(int i = 0;i<stus.length;i++) {
if(stus[i].grade == 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) {
//换人不换分
Student1 temp = stus[j];
stus[j] = stus[j+1];
stus[j+1] = temp;
}
}
}
}
}
class Student1{
int number;
int grade;
int score;
public String info() {
return "学号:"+number+",年级:"+grade+",分数:"+score;
}
}
考虑:
什么是面向对象编程思想:
描述类和对象及其关系:类是抽象的概念上的东西,对象是实实在在存在的个体。对象是类派生出来的