Java构造器与传值学习总结
作者:Benjamin. 发布时间:2023-03-08 23:18:06
本文主要学习Java构造器与传值,供大家参考,具体内容如下
构造器
构造器介绍
构造器是Java学习中一个很重要的概念,每个类的对象在使用关键字new实例化的时候,Java虚拟机都会给这个实例化的对象自动调用一个无参构造器,但是当我们自己写有构造器时,Java虚拟机将不再为我们调用这个无参构造器,而是我们要遵循我们自己写的构造器的参数规则来进行实例化。构造器不需要返回值类型,同时它也可以提供很多方法,最主要的功能是初始化类的变量成员。一个类可以有多个不同的构造器,但是这些构造器的参数列表的数量、类型、或者顺序上的差异,而不是同类型不同变量名的差异。
构造器代码演示
无参构造器
public class ConstructDisplay {
?? ?public static void main(String[] args) {
?? ??? ?ConstructDisplay display=new ConstructDisplay();
?? ??? ?//我们没有自己定义类的构造器
?? ??? ?//所以Java虚拟机为我们自动调用了无参构造器
?? ?}
}
自定义构造器
public class ConstructDisplay {
?? ?String name;
?? ?int age;
?? ?
?? ?public ConstructDisplay(String name) {
?? ?//this.name指的是调用这个构造器对象的name属性
?? ?//而等号右边的name才是
?? ?//public ConstructDisplay(String name)中的形参name
?? ??? ?this.name=name;
?? ?}
?? ?
?? ?public ConstructDisplay(int age) {
?? ??? ?this.age=age;
?? ?}
?? ?
?? ?public static void main(String[] args) {
?? ??? ?ConstructDisplay display=new ConstructDisplay("1");
? ? ? ? ConstructDisplay display2=new ConstructDisplay(1);
?? ?}
}
在上面的代码中,在我们没有定义无参构造器这种情况下,我们将不能在实例化对象时再调用无参构造器。
this与super
this关键字
当一个对象被创建好之后,Java虚拟机就会为这个对象分配一个引用自身的指针this,Java中为了解决变量命名的冲突与不确定性等问题,引入关键字this代表其所在方法的当前对象。
在代码中使用this关键字
构造器中的this
public class Tree {
?? ??
?? ? ?String name;
?? ? ?int num;
?? ? ?int age;
? ? ? ?? ?
?? ? ?public Tree(String name) {
?? ??? ? ?System.out.print("树的品种是"+name+",");
?? ? ?}
?? ? ?
??? ? ?public Tree(int age) {
?? ??? ? ?this("苹果树");
?? ??? ? ? //调用Tree的其他构造器
?? ??? ? ?System.out.println("它的树龄为"+age+"年.");
?? ? ?}
?? ? ?
?? ? ? public Tree() {
?? ? ? ? this(10);
?? ? ? ? //调用Tree的其他构造器
?? ? ? ? System.out.println(".......");
?? ?}
? ? ? ?? ?
? ? ? ? public static void main(String[] args) {
?? ??? ??? ?Tree tree=new Tree();
?? ??? ?}
}
//run:
//树的品种是苹果树,它的树龄为10年.
//.......
这里需要注意的是,在构造器中使用this调用其他构造器时要把调用的代码放在该构造器的第一句。构造器中赋值this的用法在上面介绍构造器时就使用了这个写法,所以就不在这里重复了。
构造方法中的this
public class Tree {
?? ??
?? ? ?String name;
?? ? ?int age;
? ? ??
?? ? ?
?? ? ?public void setAge(Tree t) {
?? ??? ? ?t.age=10;
?? ? ?}
?? ? ?
?? ? ?public void setName(String name) {
?? ??? ? ?this.name=name;
?? ??? ? ?//将当前调用setName的对象作为实参传给setAge的形参t
?? ??? ? ?setAge(this);
?? ? ?}
? ? ? ?? ?
? ? ? ? public static void main(String[] args) {
?? ??? ??? ?Tree tree=new Tree();
?? ??? ??? ?tree.setName("苹果树");
?? ??? ??? ?System.out.println(tree.name+"的树龄为"+tree.age);
?? ??? ?}
}
//run:苹果树的树龄为10
在代码中使用super关键字
构造器与方法中的super
class BananaTree extends Tree{
?? ?public BananaTree(String name, int age) {
?? ?//第一个super调用父类的构造器
?? ??? ?super(name, age);
? ? //第二个super调用父类的方法setName
?? ??? ?super.setName("香蕉树");
?? ?}
?? ?
}
public class Tree {
?? ??
?? ? ?String name;
?? ? ?int age;
? ? ??
?? ? ?public Tree(String name,int age) {
?? ??? ?this.name=name;
?? ??? ?this.age=age;
?? ?}
?? ? ?
?? ? ?public void setName(String changeName) {
?? ??? ? ?this.name=changeName;
?? ? ?}
?? ? ? ??? ?
? ? ? ? public static void main(String[] args) {
?? ??? ? ? BananaTree tree=new BananaTree("苹果树", 10);
?? ??? ? ? System.out.println(tree.name+"的树龄为"+tree.age);
?? ??? ?}
}
super关键字仅在子类中使用,它用来调用调用父类的属性、构造器或者方法,所以super常与继承一起出现。
传值与传引用
传值与传引用的区别
传值就是将当前变量的值传递给另外一个与当前变量不相关联的另一个变量,另一个变量的操作不会对当前的变量本身造成影响;而传引用就是将本身传递给另一个变量指向,另一个变量对这个变量操作也会影响到当前变量。
传值与传应用代码示例
传值
public class Tree {
?? ??
?? ? ?String name;
?? ? ?int age;
? ? ??
?? ? ?public Tree(String name,int age) {
?? ??? ?this.name=name;
?? ??? ?this.age=age;
?? ?}
?? ? ?
?? ? ?public void setName(String name) {
?? ??? ? ?name="香蕉树";
?? ? ?}
?? ? ? ? ??? ?
? ? ? public static void main(String[] args) {
?? ??? ? ? Tree tree=new Tree("苹果树",10);
?? ??? ? ? tree.setName(tree.name);
?? ??? ? ? System.out.println(tree.name+"的树龄为"+tree.age);
?? ??? ?}
}
传引用
public class Tree {
?? ??
?? ? ?String name;
?? ? ?int age;
? ? ??
?? ? ?public Tree(String name,int age) {
?? ??? ?this.name=name;
?? ??? ?this.age=age;
?? ?}
?? ? ?
?? ? ?public void setName(Tree otherTree) {
?? ??? ? ?otherTree.name="香蕉树";
?? ? ?}
?? ? ? ? ??? ?
? ? ? public static void main(String[] args) {
?? ??? ? ? Tree tree=new Tree("苹果树",10);
?? ??? ? ? tree.setName(tree);
?? ??? ? ? System.out.println(tree.name+"的树龄为"+tree.age);
?? ??? ?}
}
哪些情况下是传值,哪些情况下是传引用,我认为不是一篇简单的博客就可以解释的明白的,更重要的还是多打代码,自己就能总结出什么情况是传值,什么情况下是传引用了。经验都是自己慢慢总结出来哒,我也只是在这里跟小伙伴们提出这样一个概念这样子啦。
来源:https://blog.csdn.net/qq_44836027/article/details/108109889


猜你喜欢
- 一、创建一个cs文件,定义Time 对象 public class WebTimer_AutoRepayment{ &n
- android大家都有很多需要用户上传头像的需求,有的是选方形,有的是圆角矩形,有的是圆形。首先我们要做一个处理图片的自定义控件,把传入的图
- 本文实例讲述了Android编程动态按钮实现方法。分享给大家供大家参考,具体如下:第一种: 该方法通过onTouch来实现,btn3 = (
- 最近学了很多的知识,脑容量小,记不清,还是得做做练习!今天就做了一个扑克牌的练习首先呢..这个逻辑一定要非常清楚,我们要想做出一副扑克牌,必
- 多网卡环境下Eureka服务注册IP选择问题场景服务器上分别配置了eth0和eth1两块网卡,只有eth1的地址可供其它机器访问,在这种情况
- 1. 介绍结合上面的ReentrantLock类图,ReentrantLock实现了Lock接口,它的内部类Sync继承自AQS,绝大部分使
- 分转元private String fenToYuan(String amount){ NumberFormat format
- 本文实例讲述了C#实现启动,关闭与查找进程的方法。分享给大家供大家参考,具体如下:运行效果截图如下:查找/列出进程很容易,但干掉进程得借助系
- 一、什么是备忘录模式定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态
- WHY朋友在群里求助一个问题,问题原型是这样的:String str = "{{10.14, 11.24, 44.55, 41.0
- 一、maven引入依赖,数据库驱动根据项目需求自行引入<!-- https://mvnrepository.com/artifact/
- 这篇文章主要介绍了Java判断主机是否能ping通代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- zuul添加或修改请求参数一、为什么要用到这个在基于 springcloud 构建的微服务系统中,通常使用网关zuul来进行一些用户验证等过
- 1. 前言Spring最重要的一个概念当属Bean了,我们写的Controller、Service、Dao凡是加了对应注解交给Spring管
- 本文实例为大家分享了C#使用Chart绘制曲线的具体代码,供大家参考,具体内容如下新建一个控制台应用程序,程序名:WindowsFormsA
- 1)在我们的项目中添加引用文件:TaskSchedulerEngine.dll(dll定义了一个ITask接口,定义了两个方法Initial
- 最长公共子序列(Longest Common Subsequence)定义:两个或多个已知数列的子序列集合中最长的就是最长公共子序列。其实说
- 配置文件-yaml在spring Boot开发中推荐使用yaml来作为配置文件。基本语法:key: value;kv之间有空格大小写敏感使用
- java实现字符串匹配暴力匹配/** * 暴力匹配 * * @param str1 需要找的总字符串 * @param str2 需要找到的
- producer是生产者的意思:指生产数据的线程,consumer是消费者的意思:指的是使用数据的线程public class Produc