JavaSE从零开始到精通(三) - 面向对象

1. 概念

面向对象是基于面向过程的一种程序设计思想,核心思想:把现实中的事物抽象成对象,通过对象之间的信息传递来实现通信和交互。完成一些功能,只需要找到可以完成该功能的对象即可。

  • 类:用户自定义的数据类型,具有相同属性和行为的对象的集合。
  • 对象:根据类作为模板创建的实例,具有类所有的属性和行为。

使用类描述事物的维度:

  • 有什么: 变量(属性-成员变量)
  • 干什么: 方法(行为-成员方法)

根据类创建对象: 借助new关键字实现。 

 2. 类的对象

2.1 使用类描述事物的维度:
  • 有什么: 变量(属性-成员变量)
  • 干什么: 方法(行为-成员方法)
  1. 成员变量: 定义到类中,方法外
  2. 成员方法: 定义到类中,方法外, 不要写static
//用于描述手机这种事物的类
public class Phone {
    //属性-成员变量描述有什么
    //品牌
    String brand;
    //价格
    double price;
    //颜色
    String color;

    //行为-成员方法描述干什么
    //打电话
    public void call(String name){
        System.out.println("拿着"+price+"块的"+color+brand+"手机 "+"躺着给 "+name+" 打电话");
    }
    //玩游戏
    public void playGame(String gameName){
        System.out.println("趴着玩: "+gameName);
    }
    //刷抖音
    public void playTiktok(){
        System.out.println("刷5小时抖音");
    }
}
2.2 根据类创建对象:

借助于new关键字完成, new 类名();

public class PhoneTest {
    public static void main(String[] args) {
        //1.创建根据Phone类创建对象
        Phone p1 = new Phone();
        p1.brand = "mate60";
        p1.price = 9999.99;
        p1.color = "嫩粉";

        p1.call("柳岩");

        Phone p2 = new Phone();
        p2.call("舒淇");

        p2.brand = "honorv70";
        p2.price = 4000;
        p2.color = "黑色";
        p2.call("老婆");
    }
}
 2.3 对象在内存中的执行原理

步骤:

代码示例:

  1. 加载class文件到方法区,首先加载TestStudent的类信息。
  2. main方法进栈。
  3. 执行Student s = new Student();
    1. 首先,虚拟机会检查 Person 类是否已经加载。如果尚未加载,会根据类的全限定名去加载 Person 类的类信息(如类的字段、方法信息等),并且进行类的验证、准备(为静态字段分配内存并设置默认初始值)、解析等工作。
    2. 创建对象实例:一旦 Person 类的类信息加载完毕并且通过了验证,就会在堆内存中为 Person 类的对象分配内存空间,然后调用 Person 类的构造方法进行初始化。
  4. 根据堆获取信息进行打印。
  5. 堆中有一种类型信息区,存储成员方法的地址,执行到s.study将study方法进栈。
    下图是:被调用方法进栈的步骤。
    注意:
    1. 方法区也会有对应的内存地址
    2. 堆中的类会根据方法区的类申请对应的堆内存大小
    3. 堆中会存储类方法区的地址值

3. 封装(private关键字)

面向对象三大特征之一。

封装在成员之前,添加private关键字即可。

  1. 如果一个成员被private修饰,那么外部是不能直接通过对象.访问。
  2. 给被private修饰的成员变量提供公共的访问方法(设置值的方法, 获取值的方法), 叫做setter/getter方法

private修饰成员变量的作用:防止用户输入恶意数据对javabean造成影响。所以设置输入变量值的范围,从而避免该情况。

// setAge 方法,用于设置 age 属性
    public void setAge(int age) {
        // 设置年龄范围为正数,避免输入负数的情况
        if (age >= 0) {
            this.age = age;
        } else {
            throw new IllegalArgumentException("年龄不能为负数");
        }
    }

private修饰成员方法的作用:只在合适的上下文中被调用,避免了不必要的外部访问和误用。 

 4.this关键字

概念:是一个引用类型变量,表示方法调用者的地址值。

作用: 区分同名的成员变量和局部变量

  • 成员变量: 定义在类中,方法外的变量
  • 局部变量: 定义在方法内,以及方法的参数列表上的变量
 //提供get和set方法
    public void setPrice(double price) {
        //默认就近查找原则,谁离我近,我用谁
        //price = price;
        this.price = price;
    }

5. 构造方法

概念:一种特殊的方法

要求:

  1. 没有返回值类型
  2. 该方法的方法名必须是类名

格式:

        public 类名(){}

作用:

  1. 创建对象, 被new关键字调用
  2. 给成员变量赋值

特点:

        如果定义类的时候,没有提供构造方法, 那么编译器会自动的赠送一个空参数构造, 如果提供了,将不再赠送。

6. JavaBean(实体类)

 我认为:因为在java中以数据结构存储数据。javaBean就是自定义数据类型用来灵活的存储数据,其中只包含成员变量和Getter和Setter方法,创建这种类的好处是:

  1. 封装信息将对象的属性和数据库字段进行对应
  2. 通过lombok注解对属性设置值的时候进行不合法过滤
  3. 当做自定义数据类型

 扩展:成员变量和局部变量的区别

  • 成员变量:
    • 位置: 类中,方法外
    • 存储位置不同: 堆中
  • 局部变量:
    • 位置: 方法内或者方法的声明上
    • 存储位置不同: 栈中

7.  对象数组 

扩展:null

概念: 引用类型数据的占位符。

作用: 如果一旦一个引用类型的变量的值为null,那么证明该引用类型的变量将不指向堆中的任何内存,此时不能通过该引用做任何操作,否则会报错, NullPointerExceotion(空指针异常)。

  • 24
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风止￴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值