Java——引用傳遞實例分析(進階分析、對象比較、類與類的關聯實現)

      網友投稿 840 2022-05-28

      目錄

      1、引用傳遞進階分析

      2、對象比較

      3、引用傳遞實際應用

      4、總結

      1、引用傳遞進階分析

      引用傳遞是Java的精髓所在,也是初學者比較難學的地方。下面通過三個程序進行分析。

      【舉例】:第一個,較簡單

      protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      Demo demo = new Demo(100);

      fun(demo);

      System.out.println(demo.getNum());//輸出30

      }

      private void fun(Demo temp) {

      temp.setNum(30);

      }

      class Demo{

      private int num =10;

      public Demo(int num){

      this.num = num;

      }

      public int getNum() {

      return num;

      }

      public void setNum(int num) {

      this.num = num;

      }

      }

      【舉例】:第二個

      protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      String str = "hello";

      fun(str);

      System.out.println(str); //輸出hello

      }

      public static void fun(String temp) {

      temp = "world";

      }

      以上輸出的是hello,注意字符串一旦聲明則不可改變,字符串內容的改變依靠的是引用的改變實現,觀察如下內存分析圖:

      【舉例】:第三個

      protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      Demo demo = new Demo("world");

      fun(demo);

      System.out.println(demo.getMsg());//輸出MLDN

      }

      public static void fun(Demo temp){

      temp.setMsg("MLDN");

      }

      class Demo{

      private String msg = "Hello";

      public Demo(String msg) {

      this.msg = msg;

      }

      public String getMsg() {

      return msg;

      }

      public void setMsg(String msg) {

      this.msg = msg;

      }

      }

      基于String是引用數據類型的認知,見如下內存分析圖:

      引用傳遞一定要耐心使用內存分析,String這種類型 數據需要進行特殊處理。

      2、對象比較

      對象的比較就是判斷兩個對象是否相等,目前對象是否相等只能依靠地址是否相同來完成,但存在地址不同,內容相同的情況,好比String種的==與equals()。

      要實現對象比較,首先必須進行對象種每一個屬性內容進行比較,若完全相同,則為同一個對象,否則不同。

      protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      Person perA = new Person("張三",20);

      Person perB = new Person("李四",20);

      if(perA.getName().equals(perB.getName()) && perA.getAge()==perB.getAge()){

      System.out.println("是同一個人");

      }else {

      System.out.println("不是同一個人");

      }

      }

      class Person{

      private String name;

      private int age;

      public Person(String name, int age) {

      this.name = name;

      this.age = age;

      }

      public String getName() {

      return name;

      }

      public void setName(String name) {

      this.name = name;

      }

      public int getAge() {

      return age;

      }

      public void setAge(int age) {

      this.age = age;

      }

      }

      以上代碼雖然實現了功能,但是可以進一步優化,這種對象的比較操作應該是由自己完成,這時可以在Person類中增加compare方法。具體如下,注意要考慮null和自己與自己比較的場景。

      protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      Person perA = new Person("張三",20);

      Person perB = new Person("李四",20);

      if(perA.compare(perB)){

      System.out.println("是同一個人");

      }else {

      System.out.println("不是同一個人");

      }

      }

      class Person{

      private String name;

      private int age;

      public Person(String name, int age) {

      this.name = name;

      this.age = age;

      }

      public String getName() {

      return name;

      }

      public void setName(String name) {

      this.name = name;

      }

      public int getAge() {

      return age;

      }

      public void setAge(int age) {

      this.age = age;

      }

      //接收要比較的對象,在本方法種有隱藏的對象this

      public boolean compare(Person person){

      if(person==null){ //避免null異常

      return false;

      }

      if(this == person){ //防止自己與自己比較

      return true;

      }

      if(this.name.equals(person.name) && this.age== person.age){

      return true;

      }

      return false;

      }

      }

      對象比較一般是在分析層次上使用,而實際開發種,只有String應用的比較多。

      3、引用傳遞實際應用

      程序是生活的抽象,日常生活中的概念實際都可以用程序描述,eg:一個人有一輛車。

      描述以上概念前,有這樣一個對比,若現在進行數據庫的設計,若描述以上操作形式,數據庫表該如何設計?需要兩個數據庫表;以上進行類的設計,實際也需要兩個類:Person、Car,可以發現兩者的關聯:

      表名稱 = 類名稱;

      表的字段 = 類屬性;

      表的一行記錄 = 一個實例化對象;

      表的多行記錄 = 對象數組;

      表的外鍵關系 = 引用設置;

      所以,正是因為有這樣的匹配關系,所以在實際開發中,簡單java類不是憑空設計的,往往要與數據表的結構一一對應。

      【舉例】:定義類

      class Person{

      private int pid;

      private String name;

      //car 為null表示沒有車

      private Car car;//一個人有一個車

      public Person(int pid, String name) {

      this.pid = pid;

      this.name = name;

      }

      public String getPersonInfo(){

      return "編號:"+this.pid+",姓名:"+this.name;

      }

      public Car getCar() {

      return car;

      }

      public void setCar(Car car) {

      this.car = car;

      }

      }

      class Car{

      private String cname;

      private Person person; //一車屬于一人

      public Car(String cname) {

      this.cname = cname;

      }

      public String getCarInfo(){

      return "汽車名稱:"+this.cname;

      }

      public Person getPerson() {

      return person;

      }

      public void setPerson(Person person) {

      this.person = person;

      }

      }

      以上程序中使用了自定義的數據類型,Person和Car都是類。隨后進行測試:

      (1)設置內容

      (2)取出內容

      protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      //(1)根據已有結構設置內容

      Person per = new Person(1,"張三");

      Car car = new Car("奔馳");

      per.setCar(car); //人有車了

      car.setPerson(per);//車屬于一個人了

      //(2)根據關系取出數據

      System.out.println(per.getPersonInfo());

      System.out.println(per.getCar().getCarInfo());//代碼鏈

      System.out.println(car.getPerson().getPersonInfo());//代碼鏈

      }

      以上就是典型的一對一關系實現,可以進一步擴展下,比如每個人還有孩子,每個孩子還有車。這里孩子也是人,具備跟人一樣的屬性信息,那么可以在Person中設置孩子的屬性。

      protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      //(1)根據已有結構設置內容

      Person per = new Person(1,"張三");

      Person child = new Person(2,"張小三");

      Car car = new Car("奔馳");

      Car car1 = new Car("奧迪");

      per.setCar(car); //人有車了

      per.setChild(child); //人有一個孩子

      child.setCar(car1);//孩子有一個車

      car.setPerson(per);//車屬于一個人了

      //(2)根據關系取出數據

      //找到一個人的孩子信息

      System.out.println(per.getChild().getPersonInfo());

      //根據父親的車-父親的車-父親孩子-孩子的車信息

      System.out.println(per.car.getPerson().getChild().getCar().getCarInfo());

      }

      class Person{

      private int pid;

      private String name;

      private Person child;

      //car 為null表示沒有車

      private Car car;//一個人有一個車

      public Person(int pid, String name) {

      this.pid = pid;

      this.name = name;

      }

      public String getPersonInfo(){

      return "編號:"+this.pid+",姓名:"+this.name;

      }

      public Car getCar() {

      return car;

      }

      public void setCar(Car car) {

      this.car = car;

      }

      public Person getChild() {

      return child;

      }

      public void setChild(Person child) {

      this.child = child;

      }

      }

      class Car{

      private String cname;

      private Person person; //一車屬于一人

      public Car(String cname) {

      this.cname = cname;

      }

      public String getCarInfo(){

      return "汽車名稱:"+this.cname;

      }

      public Person getPerson() {

      return person;

      }

      public void setPerson(Person person) {

      this.person = person;

      }

      }

      引用的關系,可以描述不同類之間的關聯。現實生活中這樣的設計實質上并不麻煩,理論上任何事物都可以進行抽象整合,比如一臺電腦:

      class 內存{}

      class 硬盤{}

      class 顯卡{}

      class CPU{}

      class 鍵盤{}

      class 鼠標{}

      class 主板{

      private CPU 對象;

      private 內存 對象{};

      private 硬盤 對象{};

      private 顯卡 對象{};

      }

      class 電腦{

      private 主板 對象;

      private 鼠標 對象;

      private 鍵盤 對象

      }

      以上同樣屬于引用,這樣的方式在設計模式中屬于合成設計模型。

      Java——引用傳遞實例分析(進階分析、對象比較、類與類的關聯實現)

      4、總結

      不要把程序當成純粹的程序;

      引用傳遞除了進行數據分析外,還要掌握類與類的聯系使用;

      代碼鏈的使用必須掌握

      作于202004061250,已歸檔

      ———————————————————————————————————

      本文為博主原創文章,轉載請注明出處!

      若本文對您有幫助,輕抬您發財的小手,關注/評論//,就是對我最大的支持!

      祝君升職加薪,鵬程萬里!

      Java

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:揭秘華為云DLI背后的核心計算引擎
      下一篇:【云速建站】網站能否備份?
      相關文章
      亚洲日韩VA无码中文字幕| 国产偷国产偷亚洲高清在线| 亚洲国产精品尤物yw在线| 中文字幕亚洲一区二区三区| 亚洲精品美女久久久久9999| 亚洲伊人成无码综合网 | 亚洲第一区二区快射影院| 亚洲日本香蕉视频观看视频| 亚洲黄色免费在线观看| 亚洲综合激情九月婷婷| 久久亚洲国产精品成人AV秋霞| 亚洲综合国产精品| 亚洲视频免费一区| 亚洲国产韩国一区二区| 亚洲国产美女精品久久久久| 亚洲制服在线观看| 亚洲精品美女网站| 亚洲精品无码专区| 最新亚洲人成网站在线观看| 亚洲AV网站在线观看| 亚洲午夜av影院| 国产亚洲婷婷香蕉久久精品| 亚洲AV无码乱码在线观看裸奔| 久久久影院亚洲精品| 亚洲黄色片在线观看| 亚洲人成在线中文字幕| 亚洲伦理中文字幕| 亚洲色精品VR一区区三区| 亚洲高清乱码午夜电影网| 一级毛片直播亚洲| 久久精品国产精品亚洲艾草网美妙| 中文字幕精品无码亚洲字| 亚洲熟妇av一区二区三区漫画| 亚洲国产精品无码久久久秋霞2| 亚洲av网址在线观看| 亚洲精品456在线播放| 精品国产成人亚洲午夜福利| 亚洲爆乳无码专区www| 亚洲偷自拍拍综合网| 亚洲va在线va天堂va四虎| 亚洲成a人片在线观看播放|