day07面向对象复习+课后练习

  • Post author:
  • Post category:其他




day07面向对象复习+课后练习



第一部分:面向对象上



两个要素:类和对象

  • 类是对一类事物的描述,是抽象的、概念上的定义
  • 对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。



创建Java自定义类


步骤:

  • 定义类(考虑修饰符、类名)
  • 编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
  • 编写类的方法(考虑修饰符、返回值类型、方法名、形参等)



类的结构:属性和方法



类的成员之一:属性


### 变量的分类:成员变量与局部变量



类和对象的创建

  • 创建对象语法: 类名 对象名 = new 类名();
  • 使用“对象名.对象成员”的方式访问对象成员(包括属性和方法)



对象的创建和使用:匿名对象

我们也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象。


使用情况

  • 如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
  • 我们经常将匿名对象作为实参传递给一个方法调用。



类的访问机制:

  • 在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。

    (例外:static方法访问非static,编译不通过。)
  • 在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中 定义的成员



成员变量(属性)和局部变量的区别



对象的内存解析

  • 堆(Heap),此内存区域的唯一目的就是存放对象实例,几乎所有的对象 实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的

    对象实例以及数组都要在堆上分配。

  • 通常所说的栈(Stack),是指虚拟机栈。虚拟机栈用于存储局部变量等。

  • 局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char 、 short 、 int 、 float 、

    long 、double)、对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址)。 方法执行完,自动释放。

  • 方法区(Method Area),用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据



方法举例与声明的格式



什么是方法(method、函数):

  • 方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中 也称为函数或过程。
  • 将功能封装为方法的目的是,可以实现代码重用,简化代码
  • Java里的方法不能独立存在,所有的方法必须定义在类里。

![](https://img-blog.csdnimg.cn/img_convert/a12b1715469f367bfe2621a21af9e4f1.png



方法的分类:按照是否有形参及返回值



方法使用中的注意点

  • 如果方法有返回值,则必须在方法声明时,指定返回值类型,同时方法中需要使用return关键字来返回指定类型的变量或者常量
  • 方法被调用一次,就会执行一次
  • 没有具体返回值的情况,返回值类型用关键字void表示,那么方法体中可 以不必使用return语句。如果使用,仅用来结束方法。
  • 定义方法时,方法的结果应该返回给调用者,交由调用者处理。
  • 方法中只能调用方法或属性,不可以在方法内部定义方法



课后练习 1:类的设计

定义Personpackage demo04;
public class Person {
    String name;
    int age;
    String  sex;
    
    public void study(){
        System.out.println("studying");
    }
    public void showAge(){
        System.out.println("age:"+age);
    }
    public int addAge(int  i){
        age+=i;
        return  age;
    }
}
定义测试类
package demo04;
/*要求:(1)创建Person类的对象,设置该对象的name、
age和sex属性,调用study方法,输出字符串
“studying”,调用showAge()方法显示age值,调用
addAge()方法给对象的age属性值增加2岁。
(2)创建第二个对象,执行上述操作,体会同一个类的
不同对象之间的关系
 */
public class PersonTest {
    public static void main(String[] args) {
        Person p1=new Person();
        p1.name="黄景瑜";
        p1.age=29;
        p1.sex="男";

        p1.study();
        p1.showAge();
        int newAge=p1.addAge(2);
        System.out.println(p1.name+"的新年龄为:"+newAge);
        System.out.println(p1.age);//20
    }
}
代码运行结果:
studying
age:29
黄景瑜的新年龄为:31
31


2.利用面向对象的编程方法,设计类Circle计算圆的面积。

**方式一:无返回值**
package com.atguigu.exer;
/*
利用面向对象的编程方法,设计类Circle计算圆的面积。
*/
public class CircleTest {
    public static void main(String[] args) {
        Circle c1=new Circle();
        c1.radius=5.6;
        double area=c1.findArea();
        System.out.println(area);
    }
}
    //圆
    class Circle{
        //属性(半径)
        double radius;
        //求圆的面积
        public double findArea(){
            double area =Math.PI*radius*radius;
            return  area;
    }
}


3.打印矩形面积

package com.atguigu.exer;
/*
1.编写程序,声明一个method方法,在方法中打印一个10*8 的*型矩形, 
在main方法中调用该方法。
2.修改上一个程序,在method方法中,除打印一个10*8的*型矩形外,再
计算该矩形的面积,并将其作为
方法返回值。在main方法中调用该方法,接收返回的面积值并打印。
3.修改上一个程序,在method方法提供m和n两个参数,方法中打印一个m*n
的*型矩形,并计算该矩形的面积, 将其作为方法返回值。在main方法中调
用该方法,接收返回的面积值并打印
 */
public class Exer3Test {
    public static void main(String[] args) {
        Exer3Test test =new Exer3Test();
//        test.method();
//        test.method();
//        System.out.println(test.method());
        int area=test.method(12,5);
        System.out.println((area));
//        System.out.println(test.method(12,5));

    }
    //第一步:打印矩形

//    public void method(){
//        for (int i = 0; i < 10; i++) {
//            for (int j = 0; j < 8; j++) {
//                System.out.print("*");
//            }
//            System.out.println();
//        }
//    }
//    public int method(){
//        for (int i = 0; i < 10; i++) {
//            for (int j = 0; j < 8; j++) {
//                System.out.print("*");
//            }
//            System.out.println();
//        }
//        return 8*10;
//    }
    public int method(int m,int n){
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 8; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
        return m*n;
    }
}



课后练习 2:对象数组

定义类Student,包含三个属性:学号number(int),年级state(int),成绩

score(int)。 创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。

问题一:打印出3年级(state值为3)的学生信息。

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

提示:

  1. 生成随机数:Math.random(),返回值类型double;
  2. 四舍五入取整:Math.round(double d),返回值类型long。

    5.声明一个日期类型MyDate:有属性:年year,月month,日day。创建2个日期

    对象,分别赋值为:你的出生日期,你对象的出生日期,并显示信息。



课后练习 3:对象数组的改进

package com.atguigu.exer;
/*定义类Student,包含三个属性:学号number(int),年级state(int),成绩
score(int)。 创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。
问题一:打印出3年级(state值为3)的学生信息。
问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息
提示:
1) 生成随机数:Math.random(),返回值类型double;
2) 四舍五入取整:Math.round(double d),返回值类型long。
5.声明一个日期类型MyDate:有属性:年year,月month,日day。创建2个日期
对象,分别赋值为:你的出生日期,你对象的出生日期,并显示信息。
 */

public class StudentTest {
    public static void main(String[] args) {
        //声明Student类型的数组
        Student1[] stus=new Student1[20];

        for (int i = 0; i < 20; i++) {
            //给数组元素赋值
            stus[i]=new Student1();
            //给Stuent对象的属性赋值
            stus[i].number=(i+1);
            //年级:[1,6]
            stus[i].state=(int)(Math.random()*(6-1+1)+1);
            //成绩
            stus[i].score=(int)(Math.random()*(100-0+1));
        }
        StudentTest test =new StudentTest();
        //遍历学生数组
        test.print(stus);
        System.out.println("**********************");
        //state=3
        test.searchState(stus,3);
        System.out.println("++++++++++++++++++++");
        test.sort(stus);
    }//遍历Student1[]数组操作
    public void print(Student1[] stus){
        for (int i = 0; i < stus.length; i++) {
//            System.out.println(stus[i].number+","+stus[i].state
//            +","+stus[i].score);
            System.out.println(stus[i].info());
        }

    }
    public void searchState(Student1[] stus,int atate){
        for (int i = 0; i < stus.length; i++) {
            if(stus[i].state==3){
                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];
                    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年级3分数69
学号2年级4分数11
学号3年级3分数70
学号4年级4分数71
学号5年级4分数66
学号6年级4分数9
学号7年级5分数18
学号8年级2分数63
学号9年级4分数30
学号10年级2分数70
学号11年级2分数53
学号12年级3分数39
学号13年级2分数37
学号14年级1分数30
学号15年级5分数71
学号16年级6分数23
学号17年级6分数33
学号18年级2分数5
学号19年级2分数40
学号20年级3分数63
**********************
学号1年级3分数69
学号3年级3分数70
学号12年级3分数39
学号20年级3分数63
++++++++++++++++++++

Process finished with exit code 0



版权声明:本文为WKF903582415原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。