国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化

這篇具有很好參考價(jià)值的文章主要介紹了Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

引出


1.類什么時(shí)候被加載到JVM中,new,Class.forName: Class.forName(“包名.類名”);
2.創(chuàng)建對(duì)象的方式,反射,本質(zhì)是獲得類的類對(duì)象Class;
3.克隆clone,深拷貝,淺拷貝的對(duì)比;
4.序列化和反序列化的方式;

類什么時(shí)候被加載JVM中

Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化,Java,java,jvm,開(kāi)發(fā)語(yǔ)言

Hello h; // 此時(shí)沒(méi)有用Hello,jvm并沒(méi)有進(jìn)行類加載

  • 看到new : new Book()
  • Class.forName: Class.forName(“包名.類名”)
  • 類加載器
package com.tianju.auth.reflect;

public class HelloTest1 {
    public static void main(String[] args) throws ClassNotFoundException {
        Hello h; // 此時(shí)沒(méi)有用Hello,jvm并沒(méi)有進(jìn)行類加載
        System.out.println("**********");
        new Hello(); // new 的時(shí)候會(huì)加載到內(nèi)存中
        System.out.println("**********");
        Class.forName("com.tianju.auth.reflect.Hello");
    }
}
package com.tianju.auth.reflect;

public class Hello {
    static {
        System.out.println("hello");
    }
    public Integer count(Integer a,Integer b){
        return a+b;
    }
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        int a = 3;
        Class<?> aClass = Hello.class; // ?泛型的寫法
        Class<?> aClass1 = Class.forName("com.tianju.auth.reflect.Hello");
        Class<? extends Hello> aClass2 = new Hello().getClass();
        System.out.println(aClass);
        System.out.println(aClass1);
        System.out.println(aClass2);

        Hello o = (Hello) aClass.newInstance();
        int count = o.count(1, 2);
        System.out.println(count);

    }
}

創(chuàng)建對(duì)象幾種方式

1.new 看到new : new Book()

2.反射 Class.forName(“包名.類名”)

一個(gè)類會(huì)產(chǎn)生一個(gè)唯一的Class對(duì)象,JVM底層原理

Car.java 編譯成 Car.clase 類加載到 JVM 中,加載時(shí)還沒(méi)有創(chuàng)建對(duì)象;

進(jìn)入JVM中給類Car創(chuàng)建單獨(dú)的唯一的對(duì)象Class 類,該Class對(duì)象中存儲(chǔ)了Car類的一些必要信息,沒(méi)有記錄相關(guān)的值;

以Class對(duì)象生產(chǎn)成多個(gè)Car對(duì)象,通過(guò)Class類映射出多個(gè)Car對(duì)象

Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化,Java,java,jvm,開(kāi)發(fā)語(yǔ)言
Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化,Java,java,jvm,開(kāi)發(fā)語(yǔ)言

如何獲取Class對(duì)象【反射的基礎(chǔ)】

  1. 對(duì)象.getClass()
  2. 類.class
  3. Class.forName(“包名.類名”)

Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化,Java,java,jvm,開(kāi)發(fā)語(yǔ)言

案例:連接數(shù)據(jù)庫(kù)方法

Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化,Java,java,jvm,開(kāi)發(fā)語(yǔ)言

類加載采用了反射的方式

Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化,Java,java,jvm,開(kāi)發(fā)語(yǔ)言

采用枚舉方式封裝JDBC單例

方法程序:

package com.tianju.util;

import java.sql.*;
import java.util.Objects;

/**
 * 采用枚舉單例封裝數(shù)據(jù)庫(kù)
 */
public enum DbUtilEnum {
    INSTANCE;
    
    private Connection conn;
    private PreparedStatement pst;
    private ResultSet rs;


    private DbUtilEnum() {
        // 注冊(cè)驅(qū)動(dòng)-類加載
        register();
    }

    /**
     * 第一步:注冊(cè)驅(qū)動(dòng),類加載
     */
    private void register(){
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    // 建立數(shù)據(jù)庫(kù)連接
    // 192.168.0.134:3306
    // root,123
    /**
     * 第二步:建立數(shù)據(jù)庫(kù)連接
     * @param ipAdress ip地址+端口號(hào)
     * @param user 用戶名root
     * @param password 密碼123
     */
    public void connect(String ipAdress,String user,String password){
        String url = "jdbc:mysql://"+ipAdress+"/emp_db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
        try {
            conn = DriverManager.getConnection(url,user,password);
            System.out.println("成功連接數(shù)據(jù)庫(kù):"+ipAdress);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 第三步:準(zhǔn)備SQL語(yǔ)句,
     * @param sql sql語(yǔ)句
     */
    public void setPreparedStatement(String sql, Object...values){
        try {
            pst = conn.prepareStatement(sql);
            // 逐個(gè)填充 ? 處的空缺
            for (int i=0;i<values.length;i++){
                pst.setObject(i+1, values[i]);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 第四步:增加,刪除,修改
     */
    public void executeUpdate(){
        try {
            pst.executeUpdate();
            System.out.println("執(zhí)行增刪改操作");
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 第四步:查詢ResultSet,調(diào)用next()方法
     * @return 返回查詢的ResultSet
     */
    public ResultSet executeQuery(){
        try {
            rs = pst.executeQuery();
            System.out.println("執(zhí)行查詢操作,返回結(jié)果");
            return rs;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 第五步:關(guān)閉連接
     */
    public void close(){
        try {
            if (Objects.nonNull(rs)){
                rs.close();
            }
            if (Objects.nonNull(pst)){
                pst.close();
            }
            if (Objects.nonNull(conn)){
                conn.close();
            }
            System.out.println("操作完成,關(guān)閉數(shù)據(jù)庫(kù)連接");
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

3.克?。截悾ヽlone

  • 繼承的時(shí)候,可以將子類的訪問(wèn)控制符擴(kuò)大,但不能縮?。蛔宇惒坏帽雀割悞伋龈?,更大的異常。
  • 淺拷貝、深拷貝問(wèn)題:

Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化,Java,java,jvm,開(kāi)發(fā)語(yǔ)言

淺拷貝

Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化,Java,java,jvm,開(kāi)發(fā)語(yǔ)言

    // protected:代表本包或者繼承
    // 繼承的時(shí)候,可以將子類的訪問(wèn)控制符擴(kuò)大,但不能縮??;
    // 子類不能比父類拋出更多的異常
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

深拷貝

Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化,Java,java,jvm,開(kāi)發(fā)語(yǔ)言

    public Book deepClone(){
        Book book = new Book();
        Author au = new Author();
        au.setName(author.getName());
        book.setAuthor(au);
        book.setTitle(this.title);
        book.setPrice(this.price);
        return book;
    }

案例

Author.java實(shí)體類

package com.tianju.auth.reflect;

import lombok.Data;

@Data
public class Author {
    private String name;
}

Book.java實(shí)體類

implements Cloneable{ // 可以克隆的

package com.tianju.auth.reflect;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book implements Cloneable{ // 可以克隆的
    private String title;
    private Author author;
    public double price;

    static {
        System.out.println("book的靜態(tài)代碼塊");
    }

    // protected:代表本包或者繼承
    // 繼承的時(shí)候,可以將子類的訪問(wèn)控制符擴(kuò)大,但不能縮?。?/span>
    // 子類不能比父類拋出更多的異常
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public Book deepClone(){
        Book book = new Book();
        Author au = new Author();
        au.setName(author.getName());
        book.setAuthor(au);
        book.setTitle(this.title);
        book.setPrice(this.price);
        return book;
    }
}

進(jìn)行測(cè)試

Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化,Java,java,jvm,開(kāi)發(fā)語(yǔ)言

package com.tianju.auth.reflect;

public class TestDemo{
    public static void main(String[] args) throws CloneNotSupportedException {
        Author author = new Author();
        author.setName("吳承恩");
        Book book = new Book("三國(guó)演義", author,12.56);
        Book book1 = book;

        System.out.println(book1==book);// == 兩個(gè)引用是否指向同一個(gè)對(duì)象

        // clone創(chuàng)建了一個(gè)新的對(duì)象,只是值一樣
        Book bookClone = (Book) book.clone();
        // 深拷貝,創(chuàng)建了新的對(duì)象,上面的淺拷貝,只是拷貝了引用
        Book deepClone = book.deepClone();

        System.out.println(bookClone==book);
        System.out.println("克隆前:"+book);
        System.out.println("克隆后:"+bookClone);

        author.setName("小柯基");
        System.out.println("修改后的原對(duì)象:"+book);
        System.out.println("修改后的clone對(duì)象:"+bookClone);

        // 深拷貝
        System.out.println("***********");
        System.out.println("深拷貝的方法:"+deepClone);
    }
}

序列化和反序列化

對(duì)象流-把對(duì)象存儲(chǔ)為dat文件

要點(diǎn):

(1)實(shí)體類需要實(shí)現(xiàn)序列化接口 public class Car implements Serializable;【標(biāo)記接口】

(2)序列化的版本號(hào)最好不要寫,交給JVM實(shí)現(xiàn),要保證版本號(hào)一致;

功能:

ObjectOutputStream—->對(duì)象寫入文件

Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化,Java,java,jvm,開(kāi)發(fā)語(yǔ)言

Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化,Java,java,jvm,開(kāi)發(fā)語(yǔ)言

Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化,Java,java,jvm,開(kāi)發(fā)語(yǔ)言

serialVersionUID :在序列化的時(shí)候指定的編號(hào), 在反序列化時(shí)應(yīng)該保證版本號(hào)一致。

Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化,Java,java,jvm,開(kāi)發(fā)語(yǔ)言

案例:把car類存儲(chǔ)到dat文件中

1)類需要實(shí)現(xiàn)序列化的接口

public class Car implements Serializable { // 需要實(shí)現(xiàn)序列化的接口
    // 序列化的版本號(hào),不要寫,交給jvm實(shí)現(xiàn);保證讀的和寫的對(duì)象實(shí)體類要一樣
//    private static final long serialVersionUID = 2L;

    private Integer id;
    private String name;

    public Car() {
    }
}

2)從內(nèi)存寫入硬盤文件,為out,用write

ObjectOutputStream out =
        new ObjectOutputStream(
                new FileOutputStream("D:\\Myprogram\\idea-workspace\\IOStrem\\IOStrem\\src\\com\\woniuxy\\resources\\car.dat")
        );
// 存多個(gè)的解決方法,存到List中
List<Car> list = new ArrayList<>();
list.add(new Car(1, "BMW"));
list.add(new Car(2, "BYD"));
list.add(new Car(3, "BMW"));
out.writeObject(list); // list也實(shí)現(xiàn)了Serializable
out.flush();
out.close();

3)從硬盤讀入內(nèi)存,為in,用read

ObjectInputStream in =
    new ObjectInputStream(
    new FileInputStream("D:\\Myprogram\\idea-workspace\\IOStrem\\IOStrem\\src\\com\\woniuxy\\resources\\car.dat")
);
// Car car = (Car) in.readObject(); // 讀對(duì)象,向下轉(zhuǎn)型
// System.out.println(car);
List<Car> list = (List<Car>) in.readObject();
System.out.println(list);
list.forEach(car -> System.out.println(car)); // list的lamda表達(dá)式
list.forEach(System.out::println); // 上面的簡(jiǎn)化寫法
in.close(); // 記得關(guān)閉

總結(jié)

1.類什么時(shí)候被加載到JVM中,new,Class.forName: Class.forName(“包名.類名”);
2.創(chuàng)建對(duì)象的方式,反射,本質(zhì)是獲得類的類對(duì)象Class;
3.克隆clone,深拷貝,淺拷貝的對(duì)比;
4.序列化和反序列化的方式;文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-657112.html

到了這里,關(guān)于Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • JVM運(yùn)行時(shí)區(qū)域——對(duì)象創(chuàng)建內(nèi)存分配過(guò)程

    JVM運(yùn)行時(shí)區(qū)域——對(duì)象創(chuàng)建內(nèi)存分配過(guò)程

    ????????新創(chuàng)建的對(duì)象 , 都存放在伊甸園區(qū)域 ,當(dāng)垃圾回收時(shí),將伊甸園區(qū)域的垃圾數(shù)據(jù)銷毀,然后將存活的對(duì)象轉(zhuǎn)移到幸存者0區(qū)域,之后創(chuàng)建的新的對(duì)象還是存放在伊甸園區(qū)域,等到再次垃圾回收后,將伊甸園區(qū)域和幸存者0區(qū)域中存活的對(duì)象一起轉(zhuǎn)移到幸存者1區(qū)域中

    2024年02月15日
    瀏覽(22)
  • JVM面試題-JVM對(duì)象的創(chuàng)建過(guò)程、內(nèi)存分配、內(nèi)存布局、訪問(wèn)定位等問(wèn)題詳解

    JVM面試題-JVM對(duì)象的創(chuàng)建過(guò)程、內(nèi)存分配、內(nèi)存布局、訪問(wèn)定位等問(wèn)題詳解

    內(nèi)存分配的兩種方式 指針碰撞 適用場(chǎng)合:堆內(nèi)存 規(guī)整 (即沒(méi)有內(nèi)存碎片)的情況下。 原理:用過(guò)的內(nèi)存全部整合到一邊,沒(méi)有用過(guò)的內(nèi)存放在另一邊,中間有一個(gè)分界指針,只需要向著沒(méi)用過(guò)的內(nèi)存方向?qū)⒃撝羔樢苿?dòng)對(duì)象內(nèi)存大小位置即可。 使用該分配方式的GC收集器:

    2024年02月08日
    瀏覽(19)
  • [JVM] Java類的加載過(guò)程

    [JVM] Java類的加載過(guò)程

    在Java中,類的加載是指在程序運(yùn)行時(shí)將類的二進(jìn)制數(shù)據(jù)加載到內(nèi)存中,并轉(zhuǎn)化為可以被JVM執(zhí)行的形式的過(guò)程。類的加載過(guò)程主要包括以下幾個(gè)步驟: 加載 (Loading):通過(guò)類的全限定名,使用類加載器將類的二進(jìn)制數(shù)據(jù)加載到JVM中。類加載器會(huì)根據(jù)類的名稱找到對(duì)應(yīng)的字節(jié)碼

    2024年01月16日
    瀏覽(19)
  • 【Java】JVM執(zhí)行流程、類加載過(guò)程和垃圾回收機(jī)制

    【Java】JVM執(zhí)行流程、類加載過(guò)程和垃圾回收機(jī)制

    JVM,就是Java虛擬機(jī),Java的的程序都是運(yùn)行在JVM當(dāng)中。 程序在執(zhí)行之前先要把java源代碼轉(zhuǎn)換成字節(jié)碼(class文件),JVM 首先需要把字節(jié)碼通過(guò)一定的方(類加載器(ClassLoader)) 把文件加載到內(nèi)存中的運(yùn)行時(shí)數(shù)據(jù)區(qū)(Runtime Data Area) ,而字節(jié)碼文件是 JVM 的一套指令集規(guī)范,并

    2024年02月16日
    瀏覽(23)
  • 【Mybatis源碼】XMLConfigBuilder構(gòu)建器 - 加載XML與創(chuàng)建Configuration對(duì)象的過(guò)程

    XMLConfigBuilder是Mybatis中定義的進(jìn)行構(gòu)建Configuration對(duì)象的類,此類用于讀取XML配置文件創(chuàng)建并初始化Configuration對(duì)象;本篇我們主要介紹加載XML文件與創(chuàng)建Configuration對(duì)象的過(guò)程。 下面是從Configuration類中取到的代碼片段:

    2024年02月08日
    瀏覽(24)
  • 深入JVM了解Java對(duì)象實(shí)例化過(guò)程

    深入JVM了解Java對(duì)象實(shí)例化過(guò)程

    new :最常見(jiàn)的方式、 Xxx 的靜態(tài)方法, XxxBuilder/XxxFactory 的靜態(tài)方法 Class的newInstance 方法:反射的方式,只能調(diào)用空參的構(gòu)造器,權(quán)限必須是public Constructor的newInstance(XXX) :反射的方式,可以調(diào)用空參、帶參的構(gòu)造器,權(quán)限沒(méi)有要求 使用 clone() :不調(diào)用任何的構(gòu)造器,要求當(dāng)

    2023年04月24日
    瀏覽(16)
  • 深入理解Java虛擬機(jī)jvm-對(duì)象的內(nèi)存布局

    深入理解Java虛擬機(jī)jvm-對(duì)象的內(nèi)存布局

    在HotSpot虛擬機(jī)里,對(duì)象在堆內(nèi)存中的存儲(chǔ)布局可以劃分為三個(gè)部分:對(duì)象頭(Header)、實(shí)例 數(shù)據(jù)(Instance Data)和對(duì)齊填充(Padding)。 HotSpot虛擬機(jī)對(duì)象的對(duì)象頭部分包括兩類信息。第一類是用于存儲(chǔ)對(duì)象自身的運(yùn)行時(shí)數(shù)據(jù),如哈 希碼(HashCode)、GC分代年齡、鎖狀態(tài)標(biāo)志、

    2024年02月09日
    瀏覽(17)
  • 【JVM】Java堆 :深入理解內(nèi)存中的對(duì)象世界

    【JVM】Java堆 :深入理解內(nèi)存中的對(duì)象世界

    人不走空 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? 目錄 ? ????????個(gè)人主頁(yè):人不走空?????? ??系列專欄:算法專題 ?詩(shī)詞歌賦:斯是陋室,惟吾德馨 ?編輯 什么是Java堆? 作用和特點(diǎn) 1. 存儲(chǔ)對(duì)象實(shí)例 2. 垃圾收集 3. 對(duì)象

    2024年01月19日
    瀏覽(30)
  • 【JVM】詳細(xì)解析java創(chuàng)建對(duì)象的具體流程

    【JVM】詳細(xì)解析java創(chuàng)建對(duì)象的具體流程

    目錄 一、java創(chuàng)建對(duì)象的幾種方式 1.1、使用new ?1.2、反射創(chuàng)建對(duì)象 1.2.1、Class.newInstance創(chuàng)建對(duì)象 1.2.2、調(diào)用構(gòu)造器再去創(chuàng)建對(duì)象Constructor.newInstance ?1.3、clone實(shí)現(xiàn) 1.4、反序列化 二、創(chuàng)建對(duì)象的過(guò)程 2.1、分配空間的方式 1、指針碰撞 2、空閑列表 3、怎么選擇分配方式 三、

    2024年02月15日
    瀏覽(14)
  • java對(duì)象創(chuàng)建的過(guò)程

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包