【化神系列】 Java类和对象

简介: Java类和对象

一、面向对象和面向过程

  • 面向过程
    优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗
    资源;比如单片机、嵌入式开发、 Linux 等一般采用面向过程开发,性能是
    最重要的因素。
    缺点: 没有面向对象易维护、易复用、易扩展
  • 面向对象
    优点: 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特
    性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
    缺点: 性能比面向过程低

二、类和对象

类是一种抽象,而对象是类的实例,对象可以被多次创建
/**
 *定义一个宠物狗类
 *
 */
class PetDog {
    public String name;//名字
    public String color;//颜色
    // 狗的属性
    public void barks() {
        System.out.println(name + ": 旺旺旺~~~");
    }
    public void wag() {
        System.out.println(name + ": 摇尾巴~~~");
    }
}
public class Test {
    public static void main(String[] args) {
    //对象的构造和初始化
        PetDog petDog = new PetDog();
        petDog.color = "red";
        petDog.name  = "汪汪";
        petDog.barks();
        petDog.wag();
    }
}
一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量

✅对象实体和对象引用的区别?

new 创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。一个对象引用可以指向 0 个或 1 个对象 ;一个对象可以有 n 个引用指向它。

三、this引用

this表示当前对象的引用,(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问,
public class Date {
    public int year;
    public int month;
    public int day;
    public void setDay(int year, int month, int day){
        /**
         * 1.this。成员变量
         */
        this.year = year;
//this.year=year语句表示一个赋值语句,等号左边的this.year是指当前对象具有的变量year,等号右边的year表示参数传递过来的数值。
        this.month = month;
        this.day = day;
    }
    public void printDate(){
        System.out.println(this.year + "/" + this.month + "/" + this.day);
    }
    public void changeDate(int year,int month,int day){
        /**
         * 2.this.成员方法
         */
        this.printDate();
        System.out.println("开始修改");
        this.year = year;
        this.month = month;
        this.day = day;
    }
}
  • this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用
  • this只能在"成员方法"中使用
  • 在"成员方法"中,this只能引用当前对象,不能再引用其他对象

四、构造方法

构造方法(也称为构造器)是一个特殊的成员方法

  • 名字与类名相同,没有返回值类型,设置为void也不行
  • 一般情况下使用public修饰
  • 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
public class Date {
    public int year;
    public int month;
    public int day;
    
    // 重载构造方法
    public Date(int year, int month, int day){
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("Date(int,int,int)方法被调用了");
    }
    /**
    *3.this.构造方法
    */
    public Date(){
        this(2003,8,9);
        System.out.println("调用无参的构造方法");
    }
    
    public static void main(String[] args) {
        Date d1 = new Date();         //构造方法已被重载,原有的构造方法不能再使用
        Date d2 = new Date(2021,6,9); // 输出Date(int,int,int)方法被调用了
    }
    
}
/**
 *解决方法
 *public Date(){}
 *再增加一个无参的构造方法
 */
//上述两个构造方法:名字相同,参数列表不同,因此构成了方法重载

上述Date类中,没有定义任何构造方法,编译器会默认生成一个不,带参数的构造方法。

  • 注意:一旦用户定义,编译器则不再生成。
  • this(...)必须是构造方法中第一条语句,不能形成环

五. 对象初始化

成员变量在定义时,并没有给初始值, 为什么就可以使用呢?
Student s = new Student():

在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:

  1. 检测对象对应的类是否加载了,如果没有加载则加载
  2. 为对象分配内存空间
  3. 处理并发安全问题 , 比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突
  4. 初始化所分配的空间 即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,如下表
  5. 设置对象头信息(关于对象内存模型后面会介绍)
  6. 调用构造方法,给对象中各个成员赋值
数据类型 默认值
byte 0
char '\u0000'
short 0
int 0
long 0L
boolean false
float 0.0f
double 0.0
reference null
就地初始化
public class Date {
    public int year = 1900;
    //定义时即赋值
    public int month = 1;
    public int day = 1;
    public Date(){
    }
    public Date(int year, int month, int day) {
    }
    public static void main(String[] args) {
        Date d1 = new Date(2021,6,9);
        Date d2 = new Date();
    }
}
相关文章
|
11天前
|
存储 Java
java的对象详解
在Java中,对象是根据类模板实例化的内存实体,具有唯一标识符、属性及行为。通过`new`关键字实例化对象并用构造方法初始化。变量存储的是对象引用而非对象本身,属性描述对象状态,方法定义其行为。Java利用垃圾回收机制自动处理不再使用的对象内存回收,极大地简化了对象生命周期管理,同时对象具备封装、继承和多态性,促进了代码的重用与模块化设计。这使得Java程序更易于理解、维护和扩展。
|
7天前
|
Java 编译器
Java——类与对象(继承和多态)
本文介绍了面向对象编程中的继承概念,包括如何避免重复代码、构造方法的调用规则、成员变量的访问以及权限修饰符的使用。文中详细解释了继承与组合的区别,并探讨了多态的概念,包括向上转型、向下转型和方法的重写。此外,还讨论了静态绑定和动态绑定的区别,以及多态带来的优势和弊端。
20 9
Java——类与对象(继承和多态)
|
7天前
|
SQL Java 编译器
Java——类与对象(封装)
封装是面向对象编程中的概念,指将数据(属性)和相关操作(方法)组合成独立单元(类),使外部无法直接访问对象的内部状态,只能通过提供的方法进行交互,从而保护数据安全。例如,手机将各种组件封装起来,只暴露必要的接口供外部使用。实现封装时,使用`private`关键字修饰成员变量,并提供`get`和`set`方法进行访问和修改。此外,介绍了包的概念、导入包的方式及其注意事项,以及`static`关键字的使用,包括静态变量和方法的初始化与代码块的加载顺序。
18 10
Java——类与对象(封装)
|
7天前
|
Java C语言
Java——类与对象
这段内容介绍了Java中的类和对象、`this`关键字及构造方法的基本概念。类是对现实世界事物的抽象描述,包含属性和方法;对象是类的实例,通过`new`关键字创建。`this`关键字用于区分成员变量和局部变量,构造方法用于初始化对象。此外,还介绍了标准JavaBean的要求和生成方法。
18 9
Java——类与对象
|
6天前
|
存储 安全 Java
Java——String类详解
String 是 Java 中的一个类,用于表示字符串,属于引用数据类型。字符串可以通过多种方式定义,如直接赋值、创建对象、传入 char 或 byte 类型数组。直接赋值会将字符串存储在串池中,复用相同的字符串以节省内存。String 类提供了丰富的方法,如比较(equals() 和 compareTo())、查找(charAt() 和 indexOf())、转换(valueOf() 和 format())、拆分(split())和截取(substring())。此外,还介绍了 StringBuilder 和 StringJoiner 类,前者用于高效拼接字符串,后者用于按指定格式拼接字符串
11 1
Java——String类详解
|
8天前
|
存储 Java
Java的对象和类的相同之处和不同之处
在 Java 中,对象和类是面向对象编程的核心。
|
2天前
|
安全 Java
Java StringBuffer 和 StringBuilder 类详解
在 Java 中,`StringBuffer` 和 `StringBuilder` 用于操作可变字符串,支持拼接、插入、删除等功能。两者的主要区别在于线程安全性和性能:`StringBuffer` 线程安全但较慢,适用于多线程环境;`StringBuilder` 非线程安全但更快,适合单线程环境。选择合适的类取决于具体的应用场景和性能需求。通常,在不需要线程安全的情况下,推荐使用 `StringBuilder` 以获得更好的性能。
|
2天前
|
Java 开发者
Java Character 类详解
Java中的`Character`类是`java.lang`包的一部分,用于将基本类型`char`封装为对象,并提供了丰富的静态方法来处理字符,如类型判断、大小写转换等。
|
2天前
|
Java 索引
Java String 类详解
Java 中的 `String` 类用于表示不可变的字符序列,是 Java 标准库 `java.lang` 包的一部分。字符串对象一旦创建,其内容不可更改,修改会生成新对象。
|
2天前
|
Java
Java实现:将带时区的时间字符串转换为LocalDateTime对象
通过上述方法,你可以将带时区的时间字符串准确地转换为 `LocalDateTime`对象,这对于处理不需要时区信息的日期和时间场景非常有用。
39 4