referenceDelivery
    引用传递是整个java 的精髓,也是所有初学者最难学的地方
        引用的本质:同一块堆内存可以被不同的栈内存所指向
    下面通过三道程序来进行引用传递分析
    范例:第一道引用范例

class Demo{
private int num = 10:
public Demo(int num){
this.num = num: }
public void setNum(int num){
this.num = num:
}
public int getNum(){
return this.num:
}
}
public class referenceDelivery{
public static void main(String args[]){
Demo demo = new Demo(100):
fun(demo): // Demo temp = demo
System.out.println(demo.getNum()):
}
public static void fun(Demo temp){
temp.setNum(30):
}
}
// 结果: 30

范例:第二道引用传递

public class referenceDelivery{
public static void main(String args[]){
String str = "hello":
fun(str):
System.out.println(str):
}
public static void fun(String temp){
temp = "world":
}
}
// 结果: hello

字符串一旦声明则不可改变,字符串对象内容的改变依靠的是引用的改变实现的
        如果觉得以上的代码看起来很麻烦,那么不如换一个思路:不要把String当成引用类型,而只当成基本数据类型

public class referenceDelivery{
public static void main(String args[]){
int str = 10:
fun(str):
System.out.println(str):
}
public static void fun(int temp){
temp = 30:
}
}
//结果:10

范例:第三道引用传递

class Demo{
private String msg = "Hello":
public Demo(String msg){
this.msg = msg:
}
public void setMsg(String msg){
this.msg = msg:
}
public String getMsg(){
rrturn this.msg:
}
}
public class referenceDelivery{
public static void main(String args[]){
Demo demo = new Demo ("world"):
fun(demo):
System.out.println(demo.getMsg()):
}
public static void fun(String temp){
temp.setMsg("MLDN"):
}
}
//结果: MLDN

引用传递一定要耐心使用内存分析,String这种类型额数据需要特殊处理    
*/

/* Object comparison 对象比较
        对象比较的实现以及引用的操作
        所谓的对象比较指的就是可以判断两个对象是否相等
        实际上现在对象是否相同只能够依靠地址是否相同但是有些时候可能会出现地址不相同
        但是内容相同的的情况,就好比String类的“==”与“equals()”的关系
        那么我们希望可以实现一个属性自己的对象比较操作
        然而要进行对象比较操作那么首先要做的事情就是必须将两个对象中的每个属性内容分别比较
        如果属性内容全部相同那么就表示同一个对象,否则就认为不是同一个对象
        范例:对象比较的基础实现

class Person{
private String name:
private int age:
public Person (String name,int age){
this.name:
this.age|:
}
public String getName(){
rrturn this.name:
}
public int getAge(){
rrturn .this,age:
}
}
public class referenceDelivery{
public static void main(String args[]){
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:
this.age|:
}
public String getName(){
rrturn this.name:
}
public int getAge(){
rrturn .this,age:
}
// 此时需要接收一个要比较的对象(对象的本质就是数据的集合)
// 同时在本类方法里面还有一个隐藏的对象:this
// 此时的compare()方法接收了自己本类的引用
// 由于此时的person参数对象在Person类中了,所以可以直接访问私有属性
public boolean compare(Person person){
if(person == null){// 就不要比较了
rrturn false:
}
if(this == person){ // 防止自己与自己比较,地址比较
rrturn true:
}
if(this.name.equals(person,name)&&this.age == person.age){
rrturn true:
}
rrturn false:
}
}
public class referenceDelivery{
public static void main(String args[]){
Person perA = new Person("张三",20):
Person perB = new Person("李四",20):
if(perA.compare(perB)){
System.out.println("是同一个人"):
}else{
System.out.println("不是同一个人"):
}
}

对象比较更多的是在分析层次上使用,而在实际之中,只有String用的比较多

对象比较一定是一个类自己具备的功能,所以一定要在类中写一个比较方法
        进行对象比较时一定是将对象中的每一个属性进行逐步判断,所有属性都相同了,就表示对象是相同的,相等的
*/

/*    引用传递实例分析
        将程序与生活联系在一起
        一直以来一直强调:程序是生活的浓缩。生活的抽象,也就是说日常中的一切概念都可以通过程序来进行描述
        下面描述这样的一个程序:一个人有一辆车
        在描述以上概念之前希望可以有一个对比,如果说现在你进行数据库的设计,要描述以上的操作形式,你的数据表该如何设计呢?
            CREATE TABLE person(
                pid        NUMBER,
                name    VARCHAR2(50),
                CONSTRAINT pk_pid PRIMARY KEY(pid)
            );
            CREATE TABLE car(
                pid        NUMBER,
                cname    VARCHAR2(50),
                CONSTRAINT pk_pid PRIMARY KEY(pid),
                COMSTRAINT fk_pid2 FOREIGN KEY(pid)REFERENCES person(pid)
            )
            如果说现在要是进行类的设计,也需要两个类: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 getPersonlnfo(){
return"身份号:"+this.pid+",姓名:"+this.name:
}
public void setCar(Car car){
this.car = car:
}
public Car getCar(){
return this.car;
}
}
class Car{
private String cname;
// 如果人有车了,那么必须同时修改车与人对的关系
private Person person; // 一辆车属于一个人
public Car(String cname){
this.cname = cname:
}
public void setPerson(Person person){
this.person = person:
}
public Person getPerson(){
return this.person:
}
public String getCarlofo(){
return "汽车名称:"+this.cname:
}
}
public class biji{
public static void main(String args[]){
// 第一步:根据已有的结构设置内容
Person per = new Person(450802,"少爷"):
Catr car = new Car("保时捷356A"):
per,setCar(car): // 现在人有车了
car.setPerson(per): // 现在车属于一个人了
// 第二步:根据关系取出数据
System.out.println(per,getPersonlnfo()):
System.out.println(per,getCar().per,getCarlnfo()): // 代码链
System.out.println(car.getPerson().getPersonlnfo()):
}
}
/* 结果: 身份号:450802,姓名:少爷
汽车名称:保时捷356A
身份号:450802,姓名:少爷
*/

此时程序中使用了自定义的数据类型,Person Car都是类。那么随后的操作主要是进行代码的测试
            但是测试分为两步:第一步设置内容,第二步取出内容
            代码链别看单词,就看每一个方法的返回值是什么东西。如果是一个类的对象则可以继续调用该类的方法
            
            那么也可以针对于此代码进行进一步额扩展。每个人还有孩子,每个孩子也可能有车
            实际上这里面需要注意的是每一个人的孩子一定还是人,并且具备有跟人同样的属性信息,那么就可以在Person里面设计一个孩子的属性

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 void setChild(Person child){
this.child = child:
}
public Person getChild(){
return this.child
}
public String getPersonlnfo(){
return"身份号:"+this.pid+",姓名:"+this.name:
}
public void setCar(Car car){
this.car = car:
}
public Car getCar(){
return this.car;
}
}
class Car{
private String cname;
// 如果人有车了,那么必须同时修改车与人对的关系
private Person person; // 一辆车属于一个人
public Car(String cname){
this.cname = cname:
}
public void setPerson(Person person){
this.person = person:
}
public Person getPerson(){
return this.person:
}
public String getCarlnfo(){
return "汽车名称:"+this.cname:
}
}
public class biji{
public static void main(String args[]){
// 第一步:根据已有的结构设置内容
Person per = new Person(450802,"少爷"):
Person chd = new Person(450803,"小少爷"): // 有了孩子
Catr car = new Car("保时捷356A"):
Car c = new Car("布加迪威龙银河版"):
per,setCar(car): // 现在人有车了
car.setPerson(per): // 现在车属于一个人了
per.setChild(chd): // 一个人有一个孩子
chd.setCar(c): // 孩子有车
// 第二步:根据关系取出数据
System.out.println(per.getChild().getPersonlnfo()):
// 通过父亲的车找到父亲的信息,再找到父亲的孩子的车的信息
System.out.println(car.getPerson().getChild().getCar().getCarlnfo):
}
}

结果:    身份号:450803,姓名:小少爷
                    汽车名称:布加迪威龙银河版

                引用的关系可以描述出不同类之间的引用关系
                在现实的生活中这样的设计实际上并不麻烦了,理论上任何的事物都可以进行这样的整合
                
            范例:抽象出衣服
                class 袖子{}
                class 衣领{}
                class 衣服{
                    private 袖子 左:
                    private 袖子 右:
                    private 衣领 对象:
                }
            范例:抽象电脑
                class cpu{}
                class 内存{}
                class 显卡{}
                class 硬盘{}
                class 主板{
                    private CPU 对象 :
                    private 内存 对象[]:
                    private 硬盘 对象[]:
                    private 显卡 对象:
                }
                class 键盘{}
                class 鼠标{}
                class 主机{
                    private 主板 对象:
                    private 鼠标 对象;
                    private 键盘 对象:
                }
                此处也同样属于引用。这样的形式的代码在设计模式上讲称为合成设计模式
                
    1.不要把程序只当程序
    2.引用传递除了进行数据的分析之外,还需要掌握类与类的联系使用
    3.代码链的使用必须熟练

菜鸡的Java笔记 第十六 - java 引用传递的更多相关文章

  1. 菜鸡的Java笔记 第二十六 - java 内部类

    /*    innerClass        从实际的开发来看,真正写到内部类的时候是在很久以后了,短期内如果是自己编写代码,几乎是见不到内部类出现的        讲解它的目的第一个是为了解释概念 ...

  2. 菜鸡的Java笔记 第二十八 - java 包的定义

    包的主要作用以及定义    包的导入操作    系统常见的开发包    jar 程序命令        包的定义        在任何的操作系统之中都有一个统一的共识:同一个目录下不能够存在有相同的文 ...

  3. 菜鸡的Java笔记 第二十四 - java 接口的基本定义

    1.接口的基本定义以及使用形式        2.与接口有关的设计模式的初步认识        3.接口与抽象类的区别                 接口与抽象类相比,接口的使用几率是最高的,所有的 ...

  4. 菜鸡的Java笔记 第二十二 - java 对象多态性

    本次只是围绕着多态性的概念来进行讲解,但是所讲解的代码与实际的开发几乎没有关系,而且多态一定是在继承性的基础上才可以操作的,        而本次将使用类继承的关系来描述多态的性质,实际的开发中不会出 ...

  5. 菜鸡的Java笔记 第十九 - java 继承

    继承性的主要目的,继承的实现,继承的限制                继承是面向对象中的第二大主要特点,其核心的本质在于:可以将父类的功能一直沿用下去                为什么需要继承? ...

  6. 菜鸡的Java笔记 第十八 - java 代码块

    代码块  code block                content (内容)        在程序结构之中使用"{}"定义的内容就称为代码块,但是会根据其声明的位置以及关 ...

  7. 菜鸡的Java笔记 第十二 - java 构造方法与匿名对象

    1.点    构造方法的作用以及定义要求    匿名对象的使用    构造方法:        只要出现()的都表示方法        构造方法就是类构造对象时调用的方法,主要用来实例化对象.> ...

  8. 菜鸡的Java笔记 第二十九 - java 单例设计模式

    SingleCase 单例设计模式        1.单例设计模式的特点        2.多例设计模式的特点    内容    单例设计模式        现在如果说有这么一个程序类 class S ...

  9. Java笔记(二十六)……IO流上 字节流与字符流

    概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...

随机推荐

  1. 3-等待线程终止的join方法

    等待线程终止的join方法 在项目实践中经常会遇到一个场景,就是需要等待某几件事完成之后才能继续往下执行,比如线程加载资源等等. package com.heiye.learn1; public cl ...

  2. NOIP 模拟 六十八

    咕了十几场了,还是写一写吧.. T1 玩水 发现满足三个人路径不同必须要有2个及以上的斜线相同结构,需要注意如果同一行或者同一列的话必须要相邻才行. #include<bits/stdc++.h ...

  3. 架构师必备:MySQL主从同步原理和应用

    日常工作中,MySQL数据库是必不可少的存储,其中读写分离基本是标配,而这背后需要MySQL开启主从同步,形成一主一从.或一主多从的架构,掌握主从同步的原理和知道如何实际应用,是一个架构师的必备技能. ...

  4. django3上线部署踩的坑

    好久没有用过django写项目了,最近公司开发个官网,一时兴起就拿来练练手,这不用不知道,一用吓一跳啊. 才多久,版本都到3.0了. 踩坑一:运行项目时失败报错,后来查找资料发现, 当你使用djang ...

  5. 使用CSS选择器(第一部分)

    目录 使用CSS选择器(第一部分) 使用CSS基本选择器 选择所有元素 通用选择器 代码清单1 使用通用选择器 根据类型选择元素 元素类型选择器 代码清单2 使用元素类型选择器 提示 根据类选择元素 ...

  6. python函数参数类型:位置参数、默认参数、动态参数、关键字参数

    1.位置参数:调用函数的时候传的参数,参数默认按顺序赋值,如果是指定那个参数赋值,不关注顺序.指定参数a=1,b=2 就在函数体内a=1,b=2 2.默认参数:在定义函数的时候,给某个参数设置默认值 ...

  7. 【UE4 C++】 UnrealPak 与 Pak 的制作、挂载、加载

    简介 通过 UnrealPak,可以将资源打包成 Pak 文件 Pak文件是UE4游戏生成的数据包文件. Pak 之前一般先有 Cooked 步骤,将资源烘焙为对应平台支持的资源 一般打包后的项目使用 ...

  8. Hadoop集群的配置(一)

    摘要: hadoop集群配置系列文档,是笔者在实验室真机环境实验后整理而得.以便随后工作所需,做以知识整理,另则与博客园朋友分享实验成果,因为笔者在学习初期,也遇到不少问题.但是网上一些文档大多互相抄 ...

  9. dfs初步模板解析

    #include<stdio.h> int a[10],book[10],n; //这里还有需要注意的地方C语言全局变量默认为0 void dfs(int step){ //此时在第ste ...

  10. 最长子序列(线性DP)学习笔记

    子序列和子串不一样.子串要求必须连续,而子序列不需要连续. 比如说\(\{a_1,a_2\dots a_n\}\),他的子串就是\(\{a_i,a_{i+1},\dots, a_j|1\leq i\l ...