【化神系列】 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();
    }
}
相关文章
|
14天前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
42 0
|
2天前
|
存储 Java
java的对象详解
在Java中,对象是根据类模板实例化的内存实体,具有唯一标识符、属性及行为。通过`new`关键字实例化对象并用构造方法初始化。变量存储的是对象引用而非对象本身,属性描述对象状态,方法定义其行为。Java利用垃圾回收机制自动处理不再使用的对象内存回收,极大地简化了对象生命周期管理,同时对象具备封装、继承和多态性,促进了代码的重用与模块化设计。这使得Java程序更易于理解、维护和扩展。
|
2天前
|
Java
java的类详解
在 Java 中,类是面向对象编程的核心概念,用于定义具有相似特性和行为的对象模板。以下是类的关键特性:唯一且遵循命名规则的类名;描述对象状态的私有属性;描述对象行为的方法,包括实例方法和静态方法;用于初始化对象的构造方法;通过封装保护内部属性;通过继承扩展其他类的功能;以及通过多态增强代码灵活性。下面是一个简单的 `Person` 类示例,展示了属性、构造方法、getter 和 setter 方法及行为方法的使用。
|
6天前
|
Java API 开发者
【Java字节码操控新篇章】JDK 22类文件API预览:解锁Java底层的无限可能!
【9月更文挑战第6天】JDK 22的类文件API为Java开发者们打开了一扇通往Java底层世界的大门。通过这个API,我们可以更加深入地理解Java程序的工作原理,实现更加灵活和强大的功能。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来!
|
4天前
|
Java
Java 对象和类
在Java中,**类**(Class)和**对象**(Object)是面向对象编程的基础。类是创建对象的模板,定义了属性和方法;对象是类的实例,通过`new`关键字创建,具有类定义的属性和行为。例如,`Animal`类定义了`name`和`age`属性及`eat()`、`sleep()`方法;通过`new Animal()`创建的`myAnimal`对象即可调用这些方法。面向对象编程通过类和对象模拟现实世界的实体及其关系,实现问题的结构化解决。
|
7天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
4天前
|
Java API 开发者
【Java字节码的掌控者】JDK 22类文件API:解锁Java深层次的奥秘,赋能开发者无限可能!
【9月更文挑战第8天】JDK 22类文件API的引入,为Java开发者们打开了一扇通往Java字节码操控新世界的大门。通过这个API,我们可以更加深入地理解Java程序的底层行为,实现更加高效、可靠和创新的Java应用。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来,并积极探索类文件API带来的无限可能!
|
15天前
|
存储 Java
Java编程中的对象序列化与反序列化
【8月更文挑战第28天】在Java世界中,对象序列化与反序列化是数据持久化和网络传输的关键技术。本文将深入浅出地探讨这一过程,带你领略其背后的原理及应用,让你的程序在数据的海洋中自由航行。
|
15天前
|
机器学习/深度学习 人工智能 算法
探索人工智能在医疗诊断中的应用与挑战Java编程中的对象和类:基础与实践
【8月更文挑战第27天】随着人工智能(AI)技术的飞速发展,其在医疗领域的应用日益广泛。本文深入探讨了AI技术在医疗诊断中的具体应用案例,包括图像识别、疾病预测和药物研发等方面,并分析了当前面临的主要挑战,如数据隐私、算法偏见和法规限制等。文章旨在为读者提供一个全面的视角,理解AI在改善医疗服务质量方面的潜力及其局限性。
|
16天前
|
Java Spring 容器
Java获取接口的所有实现类方法
这篇文章介绍了在Java中获取接口所有实现类的方法,包括使用JDK的ServiceLoader(SPI机制)和Spring Boot中的@Autowired自动注入及ApplicationContextAware接口两种方式。
37 1