[零基础学JAVA]Java SE面向对象部分-09.面向对象基础(04)

简介:
上季内容回顾: 
String类 
· 不可改变 
· 要使用直接赋值的方式 
· 一个字符串就是一个String类的匿名对象 
· String类的相关操作方法
本季主要知识点:
引用传递
this关键字
本季开头先讲解了三种引用传递的范例帮助读者加强对引用传递的理解,之后重点阐述了this关键字的使用及对象的比较操作实现方式。
引用传递
类是引用数据类型,则传递的是一个地址。
方法的参数传递
image
我们来看个实例ooDemo01:
image
输出的值为60
image
我们来分析下这个实例的内存操作哈~
首先是M m=new M();代码
image
然后是m.x=30;赋值
image
其后fun(m);调用fun()方法,在fun()方法中将对象m的地址赋值给m1
image
接着m1.x=60;代码修改了堆内存中x的值为60。
image
public static void fun(M m1) 
    { 
        m1.x=60; 
    }
现在这个方法调用完了,m1对堆内存中的连接已经断开了。
image
现在虽然m1对x属性断开了引用,但是在堆内存所作的改动已经被保存下来了哈~所以打印输出m.x时值为60。
我们再来看个实例ooDemo03:
image
输出结果是abc
image
我们还是来分析下内存操作哈:
首先String str="abc";
image
fun(str);调用fun()方法,将str的地址指定s
image
关键一步来了哈~s="bcd";将"bcd"赋值给s,我们上次已经说过了,一个对象不可能有两个地址的引用哈,所以在“bcd”赋值之前,对象s要先断开与“abc”的指向,才能与“bcd”建立连接。
image
然后
image
fun()方法调用完后,s指向的"bcd"这块空间就被回收了哈~
image
因此str没有被更改哈~
再观察以下一种情况:
image
输出是c哈,字符串的修改被保存下来了
image
我们还是来分析下内存操作:
首先M m=new M();开辟空间,M类中的对象x的属性是"a"
image
m.x="b";
image
fun(m);调用fun()方法,将m的指向传递给m1
image
m1.x="c";修改堆内存x的值为“c”
image
最后System.out.println(m.x);输出的是最终修改的c
image
到这里我们已经讲了三个对象引用传递问题。
this关键字的使用
image
使用this调用属性的操作:
image
看下效果
image
以上程序中稍微有一点的不妥。从构造方法的参数处是否可以知道它传入的两个参数分别表示什么吗?在外部我们不知道n和a到底表示什么哈~所以我们在构造方法的参数处就将n改为name,a改为age
image
我们现在看下效果
image
发现程序没有报错,但是name输出为null,age为0哈~在程序执行到
public Person(String name,int age) 
    { 
        name=name; 
        age=age; 
    }
时,程序已经可以找到name和age的属性,所以不会再访问
private String name; 
private int age;
中的name和age,如果我们要访问的话,我们就要加上this.
image
这里就可以访问封装的属性了,我们看下效果
image
这就是this关键字调用属性的操作,应该不难理解。
This可以在一个类中调用其他方法(普通方法) 
This可以调用本类中的其他构造方法,我们看下实例ooDemo06
image
我们发现没有调用
public Person() 
    { 
        System.out.println("新的对象产生!~"); 
    }
image
如果System.out.println("新的对象产生!");这行代码有几百行的话,那我们在构造方法处也要重复写几百行代码,非常麻烦哈~所以我们希望在构造方法赋值前先调用其上面的无参构造方法,我们来修改一下这个实例:
image
看下效果,发现已经通过一个样构造方法调用本类中其他的构造方法了哈~
image
如果在另外一个构造方法中也调用其他构造方法了,即所有的构造方法是可以不断的循环调用的时候,则会出错:
image
image
总结:
在使用this调用构造方法时,至少留一个构造方法(里面是不包含this),作为构造方法的出口。 
另外如果使用this调用构造方法,则必须放在构造方法的首行。
我们来验证下,将this()与this.name和this.age换个位置,这样我们发现当name和age已经赋值完毕后,就不会执行this()了,这样程序就会报错,我们来看下实例
image
image
现在我们来看下this最重要的一个特点:表示当前对象。  
谁调用了这个方法,则this就表示那个对象。我们来看下面的实例哈~
image
image
如果要想使用this的操作,在JAVA EE比较常见的只有一种叫做对象比较的情况最为常用

前提的概念: 
JAVA中有一个特点,说私有属性是不能被对象直接访问的,私有属性是可以在同一类中直接进行访问的。
image
image
综合应用以上的特性(this表示当前对象及私有属性是可以在同一类中直接进行访问的概念),就可以得出一个程序: 比较两个对象是否相等。我们看一下本季最后一个实例ooDemo10哈~
image
image
上面的程序也可以简写成这样:
image
image
ooDemo10在定义p1、p2时,我们修改一下年龄不一样滴话,程序输出应该是false,我们验证一下。
image
ok,验证正确是false哈~
image
这就是一个对象比较的基本模型,通俗滴说哈就是拿自己出发与其他人做比较。this表示当前对象在此实例中用得比较多哈~
 
总结 
1、对象的引用传递和方法中接收参数的情况 
2、this关键字的使用 
· 属性重名时,可以通过this找到类中的属性(this.属性=当前对象.属性) 
· 调用构造方法:必须放在构造方法的首行,而且必须留有一个出口 
· 表示当前对象:要结合对象的引用传递和对象访问属性的一些特征,完成对象的比较操作。





本文转自redking51CTO博客,原文链接: http://blog.51cto.com/redking/122802 ,如需转载请自行联系原作者
相关文章
|
3月前
|
Java
Java基础语法与面向对象
重载(Overload)指同一类中方法名相同、参数列表不同,与返回值无关;重写(Override)指子类重新实现父类方法,方法名和参数列表必须相同,返回类型兼容。重载发生在同类,重写发生在继承关系中。
151 1
|
3月前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
416 1
|
3月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
129 0
|
4月前
|
安全 Java 编译器
Java面向对象
本文深入讲解了Java面向对象编程(OOP)的四大特性:封装、继承、多态与抽象,以及方法的设计与使用。通过示例展示了如何用类和对象组织代码,提升程序的可维护性与扩展性。
|
5月前
|
存储 Java 测试技术
Java基础 - 面向对象
面向对象编程是Java的核心,包含封装、继承、多态三大特性。封装隐藏实现细节,提升代码可维护性与安全性;继承实现类间IS-A关系,支持代码复用;多态通过继承、重写与向上转型,实现运行时方法动态绑定,提升系统扩展性与灵活性。
|
6月前
|
设计模式 算法 Java
Java SE 与 Java EE 组件封装使用方法及实践指南
本指南详细介绍了Java SE与Java EE的核心技术使用方法及组件封装策略。涵盖集合框架、文件操作、Servlet、JPA、EJB和RESTful API的使用示例,提供通用工具类与基础组件封装建议,如集合工具类、文件工具类、基础Servlet、实体基类和服务基类等。同时,通过分层架构集成示例展示Servlet、EJB和JPA的协同工作,并总结组件封装的最佳实践,包括单一职责原则、接口抽象、依赖注入、事务管理和异常处理等。适合希望提升代码可维护性和扩展性的开发者参考。
197 0
|
7月前
|
人工智能 Java 编译器
Java:面向对象
本文介绍了Java编程中的核心概念,包括包的命名规范与自动导入机制、构造方法的特点与使用、`this`和`super`关键字的作用、继承的基本规则、访问权限的设置、封装的意义、多态的实现原理以及`static`关键字的用法。通过详细解析每个知识点,并结合代码示例,帮助读者深入理解Java面向对象编程的核心思想与实践技巧。内容适合初学者及进阶开发者学习参考。
170 0
|
9月前
|
缓存 安全 Java
java面试-基础语法与面向对象
本文介绍了 Java 编程中的几个核心概念。首先,详细区分了方法重载与重写的定义、发生阶段及规则;其次,分析了 `==` 与 `equals` 的区别,强调了基本类型和引用类型的比较方式;接着,对比了 `String`、`StringBuilder` 和 `StringBuffer` 的特性,包括线程安全性和性能差异;最后,讲解了 Java 异常机制,包括自定义异常的实现以及常见非检查异常的类型。这些内容对理解 Java 面向对象编程和实际开发问题解决具有重要意义。
|
12月前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
131 1
|
JavaScript 前端开发 Java
还不明白面向对象? 本文带你彻底搞懂面向对象的三大特征(2024年11月Java版)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。如果你从我的文章中受益,欢迎关注我,我将持续更新更多优质内容。你的支持是我前进的动力!🎉🎉🎉
127 0
还不明白面向对象? 本文带你彻底搞懂面向对象的三大特征(2024年11月Java版)