Java——引用传递实例分析(进阶分析、对象比较、类与类的关联实现)
目录
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 键盘 对象
-
}
以上同样属于引用,这样的方式在设计模式中属于合成设计模型。
4、总结
- 不要把程序当成纯粹的程序;
- 引用传递除了进行数据分析外,还要掌握类与类的联系使用;
- 代码链的使用必须掌握
作于202004061250,已归档
———————————————————————————————————
本文为博主原创文章,转载请注明出处!
若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!
祝君升职加薪,鹏程万里!
文章来源: winter.blog.csdn.net,作者:Winter_world,版权归原作者所有,如需转载,请联系作者。
原文链接:winter.blog.csdn.net/article/details/105330131
- 点赞
- 收藏
- 关注作者
评论(0)