17.1初步了解引用传递

对象的实例化分配内存操作
Book book=null;
book =new Book();
book.title="java program design";
book.price=39.8;
book.info();

17.2 引用数据类型的传递

//基本数据类型的传递
//一下操作之后,a和b的数值并没有改变,和c语言一样
class Test{public static void main(String[] args){int a=2,b=4;swap(a,b);System.out.print(a+","+b);}public static void swap(int a,int b){int tmp;tmp=a;a=b;b=tmp;}
}
//引用数据类型的传递
public static void change(int[] count)//数组是引用数据类型可以传递
//对象的引用传递
Person p1;
Person p2;
p1=p2;
//引用传递的使用
public void setHouse(House house)
{this.house=house;//引用传递
}

17.3 引用传递与现实生活

/*** @(#)Test.java*** @author * @version 1.00 2019/4/9*/
public class Test {public Test() {}public static void main(String[] args){System.out.println("Hello,World!");Person per=new Person("42932","zhangsan");House h=new House(666,"zhongguancun");h.setPerson(per);//房子属于人per.setHouse(h);//人有房子System.out.println(per.getPersonInfo());System.out.println(per.getHouse().getHouseInfo());System.out.println(h.getPerson().getPersonInfo());}}class Person{private String no;private String name;private House house;//表示一个房子public Person(String no,String name){this.no=no;this.name=name;}public String getPersonInfo(){return "人的编号:"+this.no+",name:"+this.name;}public void setHouse(House house){this.house=house;//引用传递}public House getHouse(){return this.house;}
}
class House{private double area;private String address;private Person person;public House(double area,String address){this.area=area;this.address=address;}public String getHouseInfo(){return "House's area:"+this.area+", address:"+this.address;}public void setPerson(Person person){this.person=person;//引用传递}public Person getPerson(){return this.person;}
}

17.4 集成设计模式

通过分析,我们发现不同的事物类之间都是依靠引用进行连接的

class MainBoard{private Cpu cpu;private Memory memory;private Disk disk;
}class Cpu{}
class Disk{}
class Memory{}
class Box{private Power power;private MainBoard mainBoard;
}class Power{}
class Screen{}
class KeyBoard{}
class Mouse{}class Computer{private Box box;private Screen screen;private KeyBoard keyboard;private Mouse mouse;
}

17.5 对象克隆

Book A=new Book();
BooK B=new (Book)bookA.clone();//对象克隆
/*** @(#)Test.java*** @author * @version 1.00 2019/4/9*/
public class Test {public Test() {}public static void main(String args[])throws Exception{Book bookA=new Book("Java from primamry to higher",79.8);Book bookB=(Book)bookA.clone();//对象克隆,我想知道克隆有什么好,好像与bookB=bookA有区别bookB.setPrice(100.64);System.out.println(bookA);System.out.println(bookB);}}
class Book implements Cloneable{private String title;private double price;public Book(String title,double price){this.title=title;this.price=price;}public String getTitle(){return title;}public void setTtile(String title){this.title=title;}public double getPrice(){return price;}public void setPrice(double price){this.price=price;}@Overrideprotected Object clone()throws CloneNotSupportedException{return super.clone();}@Overridepublic String toString(){return "Book[title="+title+",price="+price+"]";}
}

//result
Book[title=Java from primamry to higher,price=79.8]
Book[title=Java from primamry to higher,price=100.64]

17.6 反射机制

~  反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个类,都能够调用它的任意一个方法,这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制
  Java反射机制主要提供了一下功能:
  在运行时判断任意一个对象所属的类;
  在运行时构造任意一个类的对象;
  在运行时判断任意一个类所具有的成员变量和方法;
  在运行时调用任意一个对象方法

//根据对象找到类
Date date=new Date()
Class<?>cls=date.getClass();//通过Java反射机制得到类的包名
//reuslt
class java.util.Date
//根据对象找到类
Class<?>cls=Class.forName("Book");
Book book=new (Book)cls.newInstance();
//传统的工厂设计模式
interface Book{}
class MathBook implements Book{}
class Factory{public static Book getInstance(String className)
}
Book book=Factory.getInstance("mathbook");//实例化一个对象//使用反射机制的工厂模式
book=(Book)Class.forName(className).newInstance();

17.6.2 反射的其他操作

//调用构造方法取得实例化对象
Class<?>cls=Class.forName("Book");
Constructor<?> cons=cls.getConstructor(String.class,double.class);
Book book=(Book)cons.newInstance("java development",85.45);
System.out.println(book);
//setter、getter的使用
import java.lang.reflect.Method;
public class Test {public Test() {}public static void main(String args[])throws Exception{String fieldName="title";//设置要操作的属性String titleValue="Java development classic";Class<?>cls=Class.forName("Book");Object obj=cls.newInstance();Method setMethod=cls.getMethod("set"+initcap(fieldName),String.class);Method getMethod=cls.getMethod("get"+initcap(fieldName));setMethod.invoke(obj,titleValue);System.out.println(getMethod.invoke(obj));}public static String initcap(String str){return str.substring(0,1).toUpperCase()+str.substring(1);}
}class Book{private String title;public void setTitle(String title){this.title=title;}public String getTitle(){return title;}
}

//result
Java development classic

17.7总结

1.对象引用相等
引用相等:即指引用到堆上同一个对象的两个引用时相等的

Book A=new Book();
Book B=A;
A.setTitle="Java Program Design";
B.setTitle="Java Web Development";
A==B;//true
A.equals(B);//true
//需要说明的是,A和B指向同一堆内存,内存地址及内容一致,都是判断引用相等
//如果每个对象单独new,即便内容是一致的但是引用绝对不相等

2.Java垃圾回收机制
每一个栈内存只能保存一块堆内存的地址,但是反过来,一块堆内存可以同时被多个占内存所指向,在这种情况下,如果改变某个占内存的保存地址内容,则必须先断开已有的堆内存地址链接,才可以指向新的内存空间,而如果一块堆内存空间没有任何的栈内存所指向的话,那么这块空间就会成为垃圾,所有的垃圾将等待JVM中的GC进行定期收集,同时进行内存空间的释放。

虽然Java提供了垃圾的自动回收机制,但是考虑到性能的问题,建议操作过程中还是尽量少产生垃圾。

Java从入门到精通 第17章 对象的引用与传递相关推荐

  1. Java从入门到精通 第22章 多线程

    Java从入门到精通 第22章 多线程 //单一线程的运行流程 public class Nanjing {public static void main(String[] args) {// TOD ...

  2. java从入门到精通第11章_《Java从入门到精通》第十章学习笔记

    第10章 Java集合类 一.概述 Java中的java.util包中提供了一些集合类,也被称为容器,不同于数组,集合的长度是可变的,存放的是对象的引用.常用的集合有List集合.Set集合.Map集 ...

  3. java从入门到精通第8章_《Java从入门到精通》第七章学习笔记

    第7章 类和对象 一.类和对象的定义及关系 1.类是同一类别对象的抽象定义:可以理解为是某一类具体对象的模子,确定对象将会拥有的特性,包括该类对象具备的属性和方法. 2.对象是对类的一种具体化的客观存 ...

  4. 《Java从入门到精通》第九章学习笔记

    第9章 类的高级特性 一.抽象类 抽象类只声明方法的存在,不能被实例化,就是说抽象类不能创建其对象,在定义抽象类时要在class前面加上abstract关键字. 1 /*定义一个抽象类Fruit,并定 ...

  5. Java从入门到精通章节练习题——第六章

    Java从入门到精通章节练习题--第六章 Exercise 1 简易计算器 Exercise 2 购买电影票 Exercise 3 计算平均分 Exercise 4 厘米与英寸互转 Exercise ...

  6. Java从入门到精通 第九章 数字处理类

    Java从入门到精通 第九章 数字处理类 一.数字格式化 二.数学运算 1)Math类 2)常用数学运算方法 三.随机数 1)Math.random()方法 2)Random类 四.大数字运算 1)B ...

  7. java从入门到精通第四版明日科技书籍简介及下载

    Java从入门到精通(第4版)(附光盘) 平装 – 2016年10月20日 <Java从入门到精通(第4版)(附光盘)>从初学者角度出发,通过通俗易懂的语言.丰富多彩的实例,详细介绍了使用 ...

  8. java从入门到精通 ppt_《Java从入门到精通》第4版全书完整PPT课件

    [实例简介] <Java从入门到精通>第4版全书完整PPT课件 [实例截图] [核心代码] e3a1ab08-ca73-47e5-9a3a-bec0b60c991a └── <Jav ...

  9. java从入门到精通_想要开始学java?你要的java从入门到精通布列如下!

    java从入门到精通,让我来告诉你! 毫无疑问,java是当下最火的编程语言之一.对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握java看似是一件十分困难的事.其实,只要掌握了科学的学习方法 ...

  10. 阿文的《Java从入门到精通(第二版)》学习日记DAY1

    目录 1️⃣前言: 2️⃣书籍:<Java从入门到精通(第二版)>张玉宏主编 3️⃣学习导图: 第0章 Java的学习指南 4️⃣学习笔记:

最新文章

  1. “神人”or“闲人”?你的未来由AI与大数据决定
  2. 流媒体(视频)服务器调研
  3. [蓝桥杯][2018年第九届真题]调手表(BFS)
  4. 30万大银行的大额存单,三年给4.25,还有更高的吗?
  5. [系列文章]上传文件管理控件v2
  6. System.Int32是个啥?
  7. Dubbo 框架设计与源码解读(配置解析优先级、线程分配、负载均衡、容错方案)
  8. python----动态规划
  9. iOS 计步器的几种实现方式
  10. 查询php copy函数源码,PHP copy函数使用案例代码解析
  11. 一次性杯子机器人挂件手工制作_变废为宝 ———环保笔筒制作
  12. android打印机驱动4521,三星SCX-4521打印机驱动
  13. gee微端服务器系统设置,geem2微端服务器设置
  14. 2022年1~10月语音合成(TTS)和语音识别(ASR)论文月报
  15. iris莺尾花matplotlib实验柱状图饼图直方图
  16. android 8华为屏幕录制,数码知识:华为nova8pro如何屏幕录制怎么录屏
  17. IDEA查看Event log
  18. 组件通信之sync-父子数据同步
  19. 文本框输入关键字提示
  20. 【朝花夕拾】Android自定义View之(一)手把手教你看懂View绘制流程——向源码要答案

热门文章

  1. 15.1 异常(异常的基本概念+自定义异常)
  2. 线程(进程线程的比较)
  3. weUI多页面切换效果
  4. 外部库依赖以及 编译
  5. 关于数据库“事务”“索引”“实例”的含义
  6. 处理ionic项目中,输入框的光标不自动定位,键盘不弹出的问题
  7. Oracle 9.2.0.4的一个简单安装脚本(含安装前补丁p3006854)
  8. 修改表结构的执行效率
  9. java如何实现进程间的通信?
  10. ASP.NET MVC显示UserControl控件(扩展篇)