java基础---9. 面向对象

1. 概述

  • 面向过程:当需要实现一个功能的时候,每一个具体的步骤都需要亲历亲为,详细处理每一个细节
  • 面向对象:当需要实现一个功能的时候,不关心具体步骤,而是找一个已经具有该功能的人来帮我做事。
package cn.itcast.day05.demo01;
import java.util.Arrays;

public class Demo01PrintArray {
    public static void main(String[] args) {
        int[] array = {10,20,3,5,11,666};
        //面向对象 打印数组
        //JDK已经为我们提供了Arrays类,其中有一个是toString方法,直接就可以把数组变成想要的格式的字符串
        System.out.println(Arrays.toString(array));
    }
}

面向对象的语言中包含了3大特征:封装、继承、多态

2. 类和对象的关系

  • 类:是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类的事物。
  • 类是对一类事物的描述
  • 对象是一类事物的实例
  • 类是对象的模板,对象是类的实体

2.1 类的定义

public class Student {
    //成员变量(属性):直接定义在类当中,在方法外面。
    //之前所学的定义在方法(包括main方法)中的变量都是局部变量
    String name;
    String age;

    //成员方法(行为):与普通方法最显著的区别是没有关键字static
    public void eat(){
        System.out.println("吃饭饭");
    }
    public void sleep(){
        System.out.println("吃觉觉");
    }
    public void study(){
        System.out.println("学习!");
    }
}

2.2 对象的创建及使用

/*
通常情况下 一个类并不可以直接使用,需要根据类创建一个对象,才可以使用
1. 导包:也就是指出需要使用的类在什么位置
import 包名称.类名称;
import cn.itcast.day05.demo01.Student
对于和当前类同属于一个包的情况,可以省略包语句不写

2. 创建,格式:
类名称 对象名 = new 类名称();
Student stu = new Student();

3. 使用
使用成员变量:对象名.成员变量名
使用成员方法:对象名.成员方法名([参数])

注意事项:
如果成员变量没有赋值, 那么将会有一个默认值,规则和数组一样。
 */
public class Demo02Student {
    public static void main(String[] args) {
        //1. 导包 省略
        //2. 创建对象
        Student stu = new Student();
        //3. 使用
        System.out.println(stu.name);//null
        System.out.println(stu.age);//0

        //改变对象中成员变量的内容
        stu.name = "赵丽颖";
        stu.age = 18;
        System.out.println(stu.name);//赵丽颖
        System.out.println(stu.age);//18

        //4. 使用对象的成员方法
        stu.eat();
    }
}

2.3 手机类练习

  • 定义
public class Phone {
    //成员变量
    String brand;
    double price;
    String color;
    //成员方法
    public void call(String who) {
        System.out.println("给"+who+"打电话");
    }
    public void sendMessage () {
        System.out.println("群发短信");
    }
}

-使用

public class Demo01PhoneOne {
    public static void main(String[] args) {
        Phone one = new Phone();
        System.out.println(one.brand);
        System.out.println(one.price);
        System.out.println(one.color);

        one.brand="苹果";
        one.price=8388.5;
        one.color="黑色";
        System.out.println(one.brand);
        System.out.println(one.price);
        System.out.println(one.color);

        one.call("乔布斯");
        one.sendMessage();

    }
}

2.4对象对应的内存图

  • 方法区最先有数据,保存的是.class信息。两个.class相关信息都在方法区应该先从main方法开始执行。
  • main方法进栈(压栈),进栈之后做了一些事情:创建了一个对象(等号左边局部变量)Phone one。同时等号右边new Phone()在堆中开辟一段内存空间,并将其地址0x666,赋值给栈中的变量Phone one。
  • 同时栈中new Phone()创建出的这个类里面所存放的内容由方法区告知(内容包括成员变量和成员方法),将成员变量拿过来,并为其赋上默认值。而里面的成员方法保存的是一个地址值0x333。即成员方法的地址值保存在堆当中。
  • 访问one.brand中的内容:通过one知道地址0x666,根据地址找到one.brand的当前值。
  • 修改one.brand中的内容: 通过one知道地址0x666,根据地址找到one.brand的当前位置,并将其原先的值替换掉。
  • 执行one.call("乔布斯"):通过one知道地址0x666,在根据0x333找到方法(两步走),之后在方法区找到了一个call(String who)方法。
  • 若想运行call(String who)方法,也需要进栈(注意:它是后进栈的,所以压着main方法,也叫压栈),之后根据参数“乔布斯”,得出给乔布斯打电话
  • call(String who)方法该方法完成后,打上×,代表出栈,也叫弹栈。
  • 之后运行one.sendMessage(),该方法进栈。。。出栈。。。
  • main方法出栈

2.5 两个对象使用同一个方法

public class Demo02PhoneTwo {
    public static void main(String[] args) {
        Phone one = new Phone();
        System.out.println(one.brand);
        System.out.println(one.price);
        System.out.println(one.color);

        one.brand="苹果";
        one.price=8388.5;
        one.color="黑色";
        System.out.println(one.brand);
        System.out.println(one.price);
        System.out.println(one.color);

        one.call("乔布斯");
        one.sendMessage();
        System.out.println("===================================");
        Phone two = new Phone();
        System.out.println(two.brand);
        System.out.println(two.price);
        System.out.println(two.color);


        two.brand="三星";
        two.price=5999.0;
        two.color="蓝色";
        System.out.println(two.brand);
        System.out.println(two.price);
        System.out.println(two.color);

        two.call("欧巴");
        two.sendMessage();

    }
}

内存图如下:

2.6 两个引用指向同一个对象的地址

public class Demo03PhoneSame {
    public static void main(String[] args) {
        Phone one = new Phone();
        System.out.println(one.brand);//null
        System.out.println(one.price);//0.0
        System.out.println(one.color);//null

        one.brand="苹果";
        one.price=8388.5;
        one.color="黑色";
        System.out.println(one.brand);//苹果
        System.out.println(one.price);//8388.5
        System.out.println(one.color);//黑色

        one.call("乔布斯");//给乔布斯打电话
        one.sendMessage();//群发短信
        System.out.println("===================================");

        //将one当中保存的对象地址值赋值给two
        Phone two = one;
        System.out.println(two.brand);//苹果
        System.out.println(two.price);//8388.5
        System.out.println(two.color);//黑色
        
        two.brand="三星";
        two.price=5999.0;
        two.color="蓝色";
        System.out.println(two.brand);//三星
        System.out.println(two.price);//5999.0
        System.out.println(two.color);//蓝色

        two.call("欧巴");//给欧巴打电话
        two.sendMessage();//群发短信
    }
}

内存图如下:

2.7 使用对象类型作为方法的参数

public class Demo04PhoneParam {
    public static void main(String[] args) {
        Phone one = new Phone();
        one.brand = "苹果";
        one.price = 8388.0;
        one.color = "土豪金";
        method(one);//传递进去的参数就是对象的地址值
    }
    public static void method(Phone param) {
        System.out.println(param.brand);//苹果
        System.out.println(param.price);//8388.0
        System.out.println(param.color);//土豪金
    }
}

2.8 使用对象类型作为方法的返回值

public class Demo05PhoneReturn {
    public static void main(String[] args) {
        Phone two = getPhone();
        System.out.println(two.brand);//苹果
        System.out.println(two.price);//8388.0
        System.out.println(two.color);//玫瑰金
    }
    public static Phone getPhone() {
        Phone one = new Phone();
        one.brand = "苹果";
        one.price = 8388.0;
        one.color = "玫瑰金";
        //谁调用我,我就把one的地址交给谁
        return one;
    }
}

内存图如下:

3 成员变量与局部变量的区别

/*
成员变量和局部变量
1. 定义的位置不一样
局部变量:定义在方法内部
成员变量:定义在方法外部,直接写在类当中

2.作用范围不一样
局部变量:只有在方法当中可以使用
成员变量:整个类都可以通用

3. 默认值不一样
局部变量:没有默认值,如果要想使用,必须手动进行赋值,否则会报错
成员变量:如果没有赋值就会有默认值,规则和数组一样

4. 内存位置不一样(了解)
局部变量:跟着方法走,位于栈内存
成员变量:位于堆内存

5. 生命周期不一样
局部变量:随着方法进栈而诞生,随着方法出栈而消失
成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失
 */
public class Demo01VariableDifference {
    public void method(int param) {
        //方法的参数param是局部变量,
        //按道理说param没有默认值,
        System.out.println(param);//那为什么直接使用没有报错呢
        //原因:参数在方法被调用的时候必然会赋值
    }
}
原文地址:https://www.cnblogs.com/deer-cen/p/12202436.html