自学内容网 自学内容网

重学Java 10 面向对象

正是风雨欲来的时候,火却越烧越旺了     

                                          ——24.1.20

重点

1.为何使用面向对象思想编程

2.如何使用面向对象思想编程

3.何时使用面向对象思想编程

4.利用代码去描述世间万物的分类

5.在一个类中访问另外一个类中的成员 -> new对象

6.成员变量和局部变量的区别

一、面向对象的介绍

1.面向过程:自己的事情自己干,代表语言:C语言

                eg、洗衣服:每一步都自己干 -> 找个盆,加水,放洗衣粉,找搓衣板,开始洗衣

2.面向对象:自己的事情别人帮忙去做,代表语言:Java语言

                eg、洗衣服:自己的事情别人干 -> 全自动洗衣机

3.使用面向对象思想编程:方便快捷

                很多功能都已经实现好了,只需要将其拿来使用即可,简化了我们自己的编写过程,减少了代码量

4.什么时候使用面向对象思想编程:

                调用别人的功能时

                在一个类中想使用别的类中的思想时,就使用面向对象思想编程

                至于使用的代码功能细节,我们不关心,我们只需要知道如何使用即可

5.如何使用面向对象思想编程:

        ①new,new. -> 点代表的是调用

        ②特殊:如果调用的成员带static关键字,我们直接使用类名点即可

二、类和对象

2.1  类(实体类)_class

1.测试类:带main方法的类,主要是运行代码的

2.实体类:是一类事物的抽象表示形式

                 世间万物的分类:比如:犬类、人类、猫类、鼠标类

        组成部分:

                1.属性(成员变量):这一类事物有什么

                        ①定义位置:类中方法外

                        ②作用范围:作用于当前类

                        ③定义格式:数据类型 变量名

                        ④默认值:

                                整数:0        小数:0.0        字符:'\U0000‘        布尔:false        引用:null

                2.行为(成员方法):这一类的事物能干嘛

                        只需要将方法中所学的static干掉,其他的都一样

只需要将某个分类的属性和行为描述出来,就可以描述这个类

案例

人类

public class Demo65Object02Person {
    //属性 -> 成员变量
    String name;
    int age;

    //行为 -> 成员方法
    public void eat(){
        System.out.println("人要吃饭");
    }

    public void drink(){
        System.out.println("人要喝水");
    }
}

动物类

public class Demo66Object03Animal {
    String kind;//品种
    String color;//颜色

    public void eat(){
        System.out.println("动物要吃东西");
    }

    public void sleep(){
        System.out.println("动物要睡觉");
    }

小明类

public class Demo67Object04Phone {
    //属性
    String brand;
    String color;
    int price;

    //行为
    public void call(String name){
        System.out.println("给"+name+"打电话");
    }

    public String message(){
        return "给小明发短信";
    }

2.2 对象

1.概述:一类事物的具体体现

2.使用:

        ①导包

                如果两个类在同一个包下,想要使用对方的成员不需要导包

                如果两个类不在同一个包下,想要使用对方的成员需要导包

                特殊包:java.lang -> 使用lang包下的类,不需要导包 -> String

                注:在学习四种权限修饰符前,尽量让两个类在同一个包下

        ②创建对象:想要使用哪个类中的成员,就new哪个类的对象

                类名 对象名 = new 类名() -> 如:Person person = new Person();

                                                                         Animal animal = new Animal();

        ③调用成员(成员变量、成员方法) -> 想要使用哪个类中的成员,便用哪个类的对象去点哪个成员

                对象名.成员变量名 = 值

                对象名.方法名() -> 调用的是无参无返回值的方法

                对象名.方法名(实参)-> 调用的是无参有返回值的方法

                数据类型 变量名 = 对象名.方法名() -> 调用的是无参有返回值的方法

                数据类型 变量名 = 对象名.方法名(实参) -> 调用的是有参有返回值的方法

示例

public class Demo65Object02Person {
    //属性 -> 成员变量
    String name;
    int age;

    //行为 -> 成员方法
    public void eat(){
        System.out.println("人要吃饭");
    }

    public void drink(){
        System.out.println("人要喝水");
    }
}

public class Demo66Object03Animal {
    String kind;//品种
    String color;//颜色

    public void eat(){
        System.out.println("动物要吃东西");
    }

    public void sleep(){
        System.out.println("动物要睡觉");
    }
}

public class Demo67Object04Phone {
    //属性
    String brand;
    String color;
    int price;

    //行为
    public void call(String name){
        System.out.println("给"+name+"打电话");
    }

    public String message(){
        return "给小明发短信";
    }
}

    public static void main(String[] args) {
        Demo65Object02Person p = new Demo65Object02Person();
        p.age = 21;
        p.name = "小明";
        p.drink();
        p.eat();
        System.out.println(p.age);
        System.out.println(p.name);
        System.out.println("—————————————————————————————————————————————");

        Demo66Object03Animal a = new Demo66Object03Animal();
        a.color = "白色";
        a.kind = "金毛巡回犬";
        a.sleep();
        a.eat();
        System.out.println(a.color);
        System.out.println(a.kind);
        System.out.println("————————————————————————————————————————————");

        Demo67Object04Phone ph = new Demo67Object04Phone();
        ph.brand = "oppo findx3pro";
        ph.color = "white";
        ph.price = 5799;
        ph.message();
        ph.call("张三");
        System.out.println(ph.brand);
        System.out.println(ph.color);
        System.out.println(ph.price);
        ph.call("小明");
        ph.message();
    }

练习

用代码描述一个手机类,在测试类中为手机类中的属性赋值,并且调用手机类中的功能

public class Demo67Object04Phone {
    //属性
    String brand;
    String color;
    int price;

    //行为
    public void call(String name){
        System.out.println("给"+name+"打电话");
    }

    public String message(){
        return "给小明发短信";
    }
}
    

public static void main(String[] args) {
    Demo67Object04Phone phone = new Demo67Object04Phone();//手机类类名
    phone.brand = "OPPO Findx3Pro";
    phone.price = 5599;
    phone.color = "白色";
    System.out.println(phone.brand);
    System.out.println(phone.price);
    System.out.println(phone.color);
    phone.call("小明");
    phone.message();
}

2.3.匿名对象的使用

1.int i = 10;

        ①int:是数据的类型

        ②i:变量名

        ③等号右边的10:真正的数据

2.Person p = new Person()

        ①等号左边的Person:对象的类型,好比是int

        ②p:对象名

        ③等号右边的new Person:真正的数据,是一个Person对象,将这个对象真正创建出来了

1.所谓的匿名对象,其实就是没有等号左边的部分,只有等号右边的部分(对象)

2.使用:

        new 对象().成员

3.注意:

        ①如果只想单纯的调用一个方法,让方法执行,我们可以考虑匿名对象

        ②但是如果涉及到赋值,千万不要使用匿名对象

示例

public class Demo65Object02Person {
    //属性 -> 成员变量
    String name;
    int age;

    //行为 -> 成员方法
    public void eat(){
        System.out.println("人要吃饭");
    }

    public void drink(){
        System.out.println("人要喝水");
    }
}


public class Demo70Object07PersonNoName {
    public static void main(String[] args) {
        //原始方式
        Demo65Object02Person p = new Demo65Object02Person();
        p.name = "小明";
        System.out.println(p.name);
        p.eat();

        System.out.println();

        //匿名对象方式
        new Demo65Object02Person().eat();
    }
}

        //匿名对象方式:
        new Demo65Object02Person().eat();
        new Demo65Object02Person().name = "小红";
        System.out.println(new Demo65Object02Person().name);    //null
        //无法输出

涉及到赋值,千万不要使用匿名对象

三、对象的内存解析

1.一个对象的内存图

2.两个对象的内存图

phone1和phone2都是新new出来的对象,所以在堆内存中开辟了两个不同的空间,修改自己空间中的数据不会影响其他空间中的数据

3.两个对象指向同一个空间的内存图

    

phone2是phone1给的,phone1在内存中保存的是地址值,所以此时phone2和phone1的地址值一样,操作同一片空间中的数据,所以修改一个对象的数据会影响另一个对象

四、成员变量和局部变量的区别

1.定义位置不同*

        成员变量:类中方法外

        局部变量:方法之中或者参数位置

2.初始化值不同*

        成员变量:有默认值,不用手动赋值,可以直接使用

        局部变量:没有默认值,必须手动先赋值,才能使用

3.作用范围不同*

        成员变量:作用于整个类

        局部变量:只作用于自己所在的方法,其他方法用不了

4.内存位置不同

        成员变量:在堆中,跟着对象走

        局部变量:在栈中,跟着方法走

5.生命周期不同

        成员变量:随着对象的产生而产生,随着对象的消失而消失

        局部变量:随着方法的调用而产生,随着方法的调用完毕而消失

五、练习

定义一个类MyDate,属性有year、month、day

        在定义一个Citizen(公民类),属性有name(String类型),birthday(MyDate类型),idcard(string类型),为这三个属性赋值,然后将值取出

自定义生日类型

//自定义生日类型
public class Demo71Object08MyDate {
    int year;
    int month;
    int day;
}


自定义公民类 

//自定义公民类
public class Demo72Object09Citizen {
    //姓名
    String name;        //默认值null
    // 生日 Mydate类型
    // Mydate属于自定义类型(引用数据类型)
    // 这种类型要操作之前,必须要赋值
    // 这种自定义对象,需要new对象赋值
    Demo71Object08MyDate birthday;      //默认值null
    //身份证
    String idcard;      //默认值null
}

主函数

    public static void main(String[] args) {
        Demo72Object09Citizen citizen = new Demo72Object09Citizen();
        citizen.name = "张三";
        citizen.idcard = "04214047";
        citizen.birthday = new Demo71Object08MyDate();

        /*Stringbuilder
            citizen.birthday获取的是Mydate对象
            再去点year获取的是Mydate对象中的year
            链式调用
         */
        citizen.birthday.year = 2002;
        citizen.birthday.month = 11;
        citizen.birthday.day = 4;

        System.out.println(citizen.name + "," + citizen.birthday.year + "年"
                 + citizen.birthday.month + "月" + citizen.birthday.day + "日 " + "学号:" + citizen.idcard);
    }

 

运行结果

给自定义的类型(引用数据类型)赋值,需要new对象(String比较特殊,可以直接=赋值)

六、总结


原文地址:https://blog.csdn.net/m0_73983707/article/details/135676515

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!