Bootstrap

面向对象(1)——类与对象的实现

目录

1. 面向对象学习的三个方面

2. “大处着眼,小处着手”

3. 面向对象思想

4. 面向对象两要素

5. 类的设计

6. 类和其对象的代码实现

6.1 注意

6.2 内存解析

6.3 方法

6.3.1 方法的分类

6.3.2 方法的声明

6.3.3 方法命名

6.3.4 方法的使用

6.4 形参列表

7. 练习测试


JAVA 的面向对象学习是学习 JAVA 最重要,最关键的一部分。前期学习需要掌握其基本原理以及基本使用即可。随着后面的不断使用再逐渐深刻理解,切不可“毕其功于一役”,一口气吃个胖子,期望第一遍或第二遍学习就将其搞清楚,弄明白,反倒最后丧失了自信心,产生畏难情绪。

1. 面向对象学习的三个方面

面向对象的学习可简单概括为三个方面:

(1)类及类的成员;属性,方法,构造器,代码块,内部类

(2)面向对象的三大特征;封装,继承,多态

(3)关键字的使用;this,super,public,static,final,abstract,interface,packing,import 等;

2. “大处着眼,小处着手”

在写代码的过程中做到“大处着眼,小处着手”;

3. 面向对象思想

面向对象思想也需要在后期的不断接触中慢慢感悟和理解,一开始不能接受是正常的;

高级语言根据其思想划分为两类:面向对象(如 Java),面向过程(如 C 语言);

面向对象思想:将事物抽象为对象,给对象赋予一些属性和方法并封装起来,使程序更加模块化,更加易于理解和调用;

面向过程思想:把事情拆分为几个步骤,并按一定顺序执行;

4. 面向对象两要素

类:对一类事物的描述/概括,是抽象的;

对象:实际存在的事物,类似于数据库中的实体;

比如,学生 如果是类的话,小明,小红,小花就是对象;

面向对象的重点是类的设计,设计类就是设计类的成员(属性,方法,构造器,代码块,内部类);

5. 类的设计

刚开始学习,类的成员中重要的就是设计类的属性(成员变量)和方法(成员方法 );

比如 人 是一个类,小明是类的一个对象,小明的属性有体重,身高等,行为(方法)有吃饭,睡觉,学习等;

6. 类和其对象的代码实现

想要按照”面向对象的“思想编写程序,需经历三步:

1. 创建类,设计类的成员;

2. 创建类的对象;

3. 通过”对象.方法“和”对象.属性“调用对象的结构;

//1.类的创建
class Person{
    //成员变量/属性
    String name;
    int age  = 18;

    //成员方法/方法/函数
    public void eat(){
        System.out.println("每天一苹果");
    }

    public void sleep(){
        System.out.println("睡睡眠眠");
    }

    public void english(String course){
        System.out.println("好好学习"+course);
    }
}
class PerDemo{
//    程序的入口
    public static void main(String[] args) {
//2.类的实例化/创建类的对象/实例化类
        Person p = new Person();
        p.name = "小明";
//3.类的对象调用方法和属性
        System.out.println(p.name);
        p.eat();
        p.english("英语");
        p.sleep();
    }
}
6.1 注意

(1) 如果一个类有多个对象,那么各个对象的属性是独立的,互不影响的;

//1.类的创建
class Person{
    //成员变量/属性
    String name;
    int age  = 18;

    //成员方法/方法/函数
    public void eat(){
        System.out.println("每天一苹果");
    }

    public void sleep(){
        System.out.println("睡睡眠眠");
    }

    public void english(String course){
        System.out.println("好好学习"+course);
    }
}
class PerDemo{
//    程序的入口
    public static void main(String[] args) {
//2.类的实例化/创建类的对象/实例化类
        Person p = new Person();
        p.name = "小明";
//3.类的对象调用方法和属性
        System.out.println(p.name);
        System.out.println(p.age);
        p.eat();
        p.english("英语");
        p.sleep();
        
        
//再创建一个对象
//一个类创建多个对象,不同对象使用的一套属性是独立的,互不影响的(方法可共用)
        Person p2 = new Person();
        System.out.println(p2.name);//类中尚未赋值,因此使用其默认值
        System.out.println(p2.age);//类中明确年龄为18,相当于其默认值为18
        p2.eat();
    }

}

(2)  将 p 变量保存的对象地址值赋给 p3 ,导致 p,p3 指向堆空间中的同一个实体;

//1.类的创建
class Person{
    //成员变量/属性
    String name;
    int age  = 18;

    //成员方法/方法/函数
    public void eat(){
        System.out.println("每天一苹果");
    }

    public void sleep(){
        System.out.println("睡睡眠眠");
    }

    public void english(String course){
        System.out.println("好好学习"+course);
    }
}
class PerDemo{
//    程序的入口
    public static void main(String[] args) {
//2.类的实例化/创建类的对象/实例化类
        Person p = new Person();
        p.name = "小明";
//3.类的对象调用方法和属性
        System.out.println(p.name);
        System.out.println(p.age);
        p.eat();
        p.english("英语");
        p.sleep();
        System.out.println("===========================");
//注意:
//再创建一个对象
//(1)一个类创建多个对象,不同对象使用的一套属性是独立的,互不影响的(方法可共用)
        Person p2 = new Person();
        System.out.println(p2.name);//类中尚未赋值,因此使用其默认值
        System.out.println(p2.age);//类中明确年龄为18,相当于其默认值为18
        p2.eat();
        System.out.println("===========================");
//(2)将 p 变量保存的对象地址值赋给 p3 ,导致 p,p3 指向堆空间中的同一个实体;
        Person p3 ;
        p3 = p;
        System.out.println(p3.name);
        p3.age = 88;
        System.out.println(p3.age);
        p.age = 100;
        System.out.println(p3.age);
        p3.eat();
    }
}
6.2 内存解析

首先:堆存放对象实例栈存放局部变量

方法区存放类信息,常量,静态变量,即时编译器编译后的代码等;

        new 结构产生的对象都存储在堆里,堆会产生一个对象实体,对象实体存在一个地址值,又称为首地址值,一般用 16 进制表示。main 方法中的变量都是局部变量,局部变量存储在栈里,对象实例存放在堆里;

6.3 方法
6.3.1 方法的分类

6.3.2 方法的声明

权限修饰符 返回值类型 方法名( 形参列表 ){

                                     方法体

      }

例如:

public void eat(){//无参无返回值
        System.out.println("吃饭");
    }

    public void sleep(String name){//有参无返回值
        String who = name + "吃饭";
    }

    public String song(){//无参有返回值
        String s = "唱什么歌";
        return s;
    }

    public String study(String Course){//有参有返回值
       String p = "学习"+Course;
       return p;
    }

说明

(1)权限修饰符有 private,public,缺省,protected ,暂不详细介绍;

(2)权限修饰符后,返回值类型前也可以使用:static,final,abstract 等关键字,这里暂不详细介绍;

(3)有参方法的返回值

定义有参方法,必须有返回值;

在声明方法时,就需要定义返回值类型;

public String talk(){//有参有返回值
        String p = name ;
        if (name == null) {
            return "null";
        }else {
            return name;
        }
    }

方法中需要使用 return 关键字指定返回类型的变量或常量,并在调用时使用一个变量接收(当然也有第二种方式)

class T{
    String name;
    int age;
    public String na(){
        return name = "小白";
    }
}
class TD{
    public static void main(String[] args) {
        T t = new T();
//        输出返回值的方法一
//         String s = t.na();
//        System.out.println(s);
//        输出返回值的方法二
        System.out.println(t.na());
    }
}

 (4)声明方法是否设置返回值

看具体要求;

凭借经验;

6.3.3 方法命名

方法名属于标识符,遵循标识符命名规则即可;

“见名知义”;

6.3.4 方法的使用

方法可以调用当前类的属性以及方法,但绝对不可以方法中定义方法;

    public void eat(){//无参无返回值
        System.out.println("吃饭");
    }
    
    public String study(String Course){//有参有返回值
        String p = "学习"+Course;
        eat();
        return p;
    }
    
6.4 形参列表

一个方法的形参可以存在0个,1个,乃至多个;

形参的定义需要根据具体情况和经验分析判断;

7. 练习测试

对象数组:定义类,包含三个属性:学号(number:int)年纪(state:int)  成绩(grade:int ),要求:(1)打印出3年级的学生信息;(2)使用冒泡排序按学生成绩排序,并打印输出所有学生信息;

class STUdent{
    int id;     //学号
    int state;  //班级
    int score;  //分数

    /**
     * 冒泡排序
     */
    public void sort(STUdent[] arr){
        for(int i = 0;i < arr.length - 1;i++){
            for(int j = 0;j < arr.length - 1 - i;j++){
                STUdent temp;
                if(arr[j].score > arr[j+1].score){
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }

    /**
     * 遍历输出
     */
    public void print(STUdent[] st){
        for(int i = 0;i<st.length;i++){
            System.out.println( st[i].score+"   "+st[i].id+"  "+st[i].state);
//            System.out.println(st[i]);// 输出的结果为地址值
        }
    }
    /**
     * 查找并输出
     */
    public void search(STUdent[] st,int a){
        //        按照要求输出
        for(int i = 0;i < st.length;i++){
            if(st[i].state == a){
                System.out.print(st[i].id + " " + st[i].state + " " + st[i].score);
                System.out.println(" ");
            }
        }
    }
}

class Obd{
    public static void main(String[] args) {
        STUdent[] st = new STUdent[20];

        for(int i = 0;i < st.length;i++){
//            每个数组元素开辟空间
            st[i] = new STUdent();
            st[i].id = i + 1;
            st[i].state = (int)(Math.random() * 6 + 1);
            st[i].score = (int)(Math.random() * 100 + 1);
//            查看共有哪些数据
            System.out.print(st[i].id+" "+st[i].state+" "+st[i].score);
            System.out.println(" ");
        }
        System.out.println("=======================");
        STUdent s = new STUdent();
        s.search(st,3);//查找并输出
        System.out.println("=======================");
        s.sort(st);//冒泡排序
        s.print(st);//输出
    }
}

 注意:对象数组的内存解析

引用类型的变量只存储两类值:null 或者 地址值 ; 

;