java基础06_面向对象(上-01)

150 阅读2分钟

1.oop学习

三条主线

  • 类及类的成员:属性、方法、构造器、内部类、代码块

  • 三大特征:封装、继承、多态

  • 关键字:super、this等等 思想

  • 面向过程:强调功能行为,以函数为最小单位,考虑怎么做

  • 面向对象:强调具备了功能的对象,以类/对象为最小单位,考虑谁来做

image.png

image.png

2.类的成员构成

类的成员构成v2.0.JPG

3.对象的内存解析

对象数组的内存解析.png

4.属性VS局部变量

  • 位置:全局=属性 局部变量
  • 权限:public等(局部不需要权限修饰符)
  • 默认初始化:0 0.0 0 false(局部没有默认初始化值;形参在调用时赋值即可)
  • 位置:属性在堆空间、局部变量在栈空间、static 方法区

5.方法

分类 image.png

方法名:好好起名

形参列表:逗号隔开

在使用中可以调用当前类的属性和方法

例子:


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)的学生信息。

问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息

提示:

  1. 生成随机数:Math.random(),返回值类型double;

  2. 四舍五入取整: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;
	}
}

考虑:

什么是面向对象编程思想:

描述类和对象及其关系:类是抽象的概念上的东西,对象是实实在在存在的个体。对象是类派生出来的