1130面向对象

1130面向对象

1.设计对象并使用

1.1类和对象

类(设计图)

类就是对现实事物的一种描述

类的组成
属性:指事物的特征,例如:手机事物(品牌,价格,尺寸)
行为:指事物能执行的操作,例如:手机事物(打电话,发短信)

对象(实际的物)

客观存在的事物皆为对象 ,所以我们也常常说万物皆对象。

类和对象的关系

类是对事物的一种描述,对象则为具体存在的事物

1.2类的定义

类的组成是由属性和行为两部分组成

属性:在类中通过成员变量来体现(类中方法外的变量)
行为:在类中通过成员方法来体现(和前面的方法相比去掉static关键字即可)

类的定义步骤:

public class 类名 {//①定义类
	// ②编写类的成员变量(表示类的属性)
	变量1的数据类型 变量1;
	变量2的数据类型 变量2;
	…
	// ③编写类的成员方法(表示类的方法)
	方法1;
	方法2;	
}

示例代码:

public class Phone {
    //成员变量
    String brand;
    double price;
    //成员方法
    public void call() {
        System.out.println("打电话");
    }

    public void sendMessage() {
        System.out.println("发短信");
    }
}

1.3对象的使用

/*     创建对象
        格式:类名 对象名 = new 类名();
        范例:Phone p = new Phone();

    使用对象
        1:使用成员变量
            格式:对象名.变量名
            范例:p.brand
        2:使用成员方法
            格式:对象名.方法名()
            范例:p.call()
            */
public class PhoneDemo {
    public static void main(String[] args) {
        //创建对象
        Phone p = new Phone();
        System.out.println(p.brand);//打印"null"
        System.out.println(p.price);//打印"0.0"
        //给手机1赋值
        p.brand = "小米";
        p.price = 2999;
        //获取手机1中的值
        System.out.println(p.brand);//打印"小米"
        System.out.println(p.price);//打印"2999"
        //使用成员方法
        p.call();
        p.sendMessage();

        //创建对象2
        Phone p2 = new Phone();
        //给手机2赋值
        p.brand = "苹果";
        p.price = 8999;
        //获取手机2中的值
        System.out.println(p.brand);//打印"苹果"
        System.out.println(p.price);//打印"8999"
    }

1.4 some notes

Javabean类:用来描述一类事物的类,在Javabean类中,是不写main方法的

测试类:编写main方法的类. 我们可以在测试类中创建javabean类的对象并进行赋值调用

1.类名首字母建议大写,需要见名知意,驼峰模式

2.一个Java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名(实际开发中建议还是一个文件定义一个class类)

3.定义成员变量的完整格式:

//修饰符 数据类型 变量名称 = 初始化值

一般无需指定初始化值,但是存在默认值

1764473755372

2.封装

4.1 封装思想

封装是面向对象三大特征之一(封装,继承,多态)

封装告诉我们,如何正确设计对象的属性和方法

封装原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为

理解封装思想的好处?
1.让编程变得很简单,有什么事,找对象,调方法就行。
2.降低我们的学习成本,可以少学、少记,或者说压根不用学,不用记对象有哪些
方法,有需要时去找就行

封装好处

通过隐藏对象的内部细节,只暴露公共的getter和setter方法,可以减少外部代码对内部数据结构的依赖。

通过方法来控制成员变量的操作,提高了代码的安全性
把代码用方法进行封装,提高了代码的复用性

编写getter和setter方法是Java中实现对象封装、增强代码健壮性和灵活性的重要手段。虽然对于简单的属性直接暴露可能看起来更简洁,但从长远来看,采用getter和setter能够提升代码的质量和可维护性。

封装代码实现
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
成员变量private,提供对应的getXxx()/setXxx()方法

4.2 private关键字

1.private是一个权限修饰符,可以用来修饰成员(成员变量,成员方法)

2.被private修饰的成员,只能在本类进行访问

3.针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作

  • 提供“get变量名()”方法,用于获取成员变量的值,方法用public修饰
  • 提供“set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰

如:

class Student {
    //成员变量
    String name;
    private int age;

    //提供get/set方法
    public void setAge(int a) {
        if(a<0 || a>120) {
            System.out.println("你给的年龄有误");
        } else {
            age = a;
        }
    }

    public int getAge() {
        return age;
    }

    //成员方法
    public void show() {
        System.out.println(name + "," + age);
    }
}
//什么时候需要加public:
//如果Student类需要被其他包中的类导入和使用,那么就需要在类前面添加public修饰符。
//例如,如果有一个在不同包中的测试类需要创建Student对象并调用其方法,那么Student类就必须是public的。
//
//总结:
//该Student类省略public修饰符,表明它被设计为只能在当前包内使用,这是一种合理的封装策略,有助于控制类的可见范围。
public class StudentTest {
    public static void main(String[] args) {
        //创建对象
        Student s = new Student();
        //给成员变量赋值
        s.name = "林青霞";
        s.setAge(30);
        //调用show方法
        s.show();
    }
}

两个类的作用与区别

  1. Student类(业务类/实体类)

    • 这是一个实体类,用于封装学生的数据(如姓名、年龄)和行为(如显示信息)
    • 它定义了类的属性、构造方法、getter/setter方法以及其他业务方法
    • 主要负责数据的存储和相关业务逻辑的实现
    • 不包含程序的入口点(main方法)
  2. StudentTest类(测试类/主类)

    • 这是一个包含main方法的类,作为程序的入口点
    • 负责创建Student类的实例并测试其功能
    • 可以模拟用户交互或业务流程
    • 体现了"客户端代码"如何使用我们定义的业务类

为什么要分离这两个类?

  1. 关注点分离

    • Student类专注于数据和业务逻辑
    • StudentTest类专注于程序的执行流程和测试
  2. 代码复用

    • 当Student类需要在不同场景中使用时,可以被多个测试类或其他业务类引用
    • 如果将所有代码都放在一个类中,这个类会变得臃肿且难以维护
  3. 更好的封装和安全性

    • 业务类的内部实现细节对测试类是隐藏的(如Student类中的私有属性age)
    • 测试类只能通过公开的方法(如setAge、getAge)与业务类交互
  4. 更符合面向对象的设计理念

    • 每个类都有明确的单一职责
    • 提高了代码的可读性和可维护性

实际开发中的应用

在实际开发中,这种模式更为明显:

  • 实体类(如User、Product等)负责数据和核心业务逻辑
  • 测试类用于单元测试
  • 控制类(如Controller)用于处理请求并调用实体类的方法

这种分离设计使代码结构更清晰,也更便于团队协作开发。

3. this关键字

在Java中,当局部(或者形参)变量和成员变量重名的时候,在方法中使用this表示成员变量以示区分。

  • 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
  • 方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量

成员变量和局部变量

public class This{
    public static void main(String args[]){
        Demo demo = new Demo();
        demo.fun("这是局部变量");
    }
}

class Demo{
    String str = "这是成员变量";
    void fun(String str){
        System.out.println(str); //就近原则,打印出"这是局部变量"
        System.out.println(this.str);//成员变量
        this.str = str;
        System.out.println(this.str); //(形参)局部变量
    }
}

public class Student {
    private String name;
    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void show() {
        System.out.println(name + "," + age);
    }
}

4.构造方法

构造方法(也叫构造器 构造函数)

作用:在创建对象的时候,由虚拟机自动调用,给成员变量进行初始化

格式:

public class 类名{

       修饰符 类名( 参数 ) {

       }

}

特点:

1.方法名与类名相同,大小写也要一致

2.没有返回值类型,连void都没有

3.没有具体的返回值(不能由retrun带回结果数据)

种类:

无参构造方法:初始化的对象时,成员变量的数据均采用默认值

有参构造方法:在初始化对象的时候,同时可以为对象进行赋值

构造方法

note:

创建:如果没有定义构造方法,系统将给出一个默认的无参数构造方法;
如果定义了构造方法,系统将不再提供默认的构造方法

重载:如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法

推荐:无论是否使用,都手工书写无参数构造方法

5.标准JavaBean

一个标准的JavaBean类

1. 类名需要见名知意
2.成员变量使用private修饰
3.提供至少两个构造方法
无参构造方法
带全部参数的构造方法
4.成员方法
提供每一个成员变量对应的setXxx()/getXxx()
如果还有其他行为,也需要写上

public class User{
    private String username;
    private String password;
    private String email;
    private String gender;
    private int age;
    //空参
    public User() {
    }

    //带全部参数的构造
    public User(String username, String password, String email, String gender, int age) {
        this.username = username;
        this.password = password;
        this.email = email;
        this.gender = gender;
        this.age = age;
    }

    //get和set方法
    public void setUsername(String username){
        this.username = username;
    }
    public String getUsername(){
        return username;
    }
    public void setPassword(String password){
        this.password = password;
    }
    public String getPassword(){
        return password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
//快捷键:
//alt + insert

//插件:
//ptg

6.对象内存图

1一个对象的内存图

【92.单个对象的内存图讲解】 【精准空降到 00:15】 https://www.bilibili.com/video/BV1cu411B7yu/?share_source=copy_web&vd_source=f3bfa52bb078377c77787c94126d73d3&t=15

【黑马程序员教学一个对象的内存图部分剪切】 https://www.bilibili.com/video/BV1ZKkJYfEwB/?share_source=copy_web&vd_source=f3bfa52bb078377c77787c94126d73d3

2多个对象的内存图

【黑马程序员Java零基础视频教程_上部(Java入门,含斯坦福大学练习题+力扣算法题和大厂java面试题)】 【精准空降到 18:40】 https://www.bilibili.com/video/BV17F411T7Ao/?p=87&share_source=copy_web&vd_source=f3bfa52bb078377c77787c94126d73d3&t=1120

3两个变量指向同一个对象内存图

【类和对象的内存图】 https://www.bilibili.com/video/BV1B5411172P/?share_source=copy_web&vd_source=f3bfa52bb078377c77787c94126d73d3

4this的内存原理

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

其本质:所在方法调用者的地址值

【黑马程序员Java零基础视频教程_上部(Java入门,含斯坦福大学练习题+力扣算法题和大厂java面试题)】 【精准空降到 04:47】 https://www.bilibili.com/video/BV17F411T7Ao/?p=89&share_source=copy_web&vd_source=f3bfa52bb078377c77787c94126d73d3&t=287

this的内存原理

5基本数据类型和引用数据类型的区别

基本数据类型:数据值是存储在自己的空间中(赋值给其他变量,也是赋的真实的值)

引用数据类型:数据值是存储在其他空间中,自己空间中存储的是地址值.(使用其他空间内的数据)(赋值给其他变量,赋的是地址值)

引用数据类型

引用数据类型2

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

成员变量:类中方法外的变量(成员变量 成员方法 成并列关系)

局部变量:方法中的变量![局部 成员变量](C:\Users\Lenovo\Desktop\java\markdown学习\image\局部 成员变量.jpg)

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

posted @ 2025-12-01 17:25  Doreen007  阅读(0)  评论(0)    收藏  举报