【化神系列】 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();
    }
}
相关文章
|
2月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
312 0
|
3月前
|
安全 Java 数据建模
Java记录类:简化数据载体的新选择
Java记录类:简化数据载体的新选择
250 101
|
3月前
|
安全 Java 开发者
Java记录类:简化数据载体的新方式
Java记录类:简化数据载体的新方式
295 100
|
4月前
|
安全 IDE Java
Java记录类型(Record):简化数据载体类
Java记录类型(Record):简化数据载体类
437 143
|
2月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
110 4
|
2月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
193 5
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
177 1
|
2月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
232 1
|
2月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
185 0
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
203 1