Java构造器与传值学习总结

本文主要学习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);
        }
}

哪些情况下是传值,哪些情况下是传引用,我认为不是一篇简单的博客就可以解释的明白的,更重要的还是多打代码,自己就能总结出什么情况是传值,什么情况下是传引用了。经验都是自己慢慢总结出来哒,我也只是在这里跟小伙伴们提出这样一个概念这样子啦。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java基础第三篇 构造器与方法重载

    目录 1.定义构造器 2.初始化方法的优先级 3.方法重载 4.总结 在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initialization).初始化时,对象的数据成员被赋予初始值.我们可以显式初始化.如果我们没有给数据成员赋予初始值,数据成员会根据其类型采用默认初始值.显式初始化要求我们在写程序时就确定初始值,这有时很不方便.我们可以使用构造器(constructor)来初始化对象.构造器可以初始化数据成员,还可以规定特定的操作.这些操作会在创建对象时自动执行 1.定

  • java 静态工厂代替多参构造器的适用情况与优劣

    背景 假如现在你要想一个汉堡,有一个汉堡类:Hamburg.那么一般情况下你会: Hamburg hamburg = new Hamburg(); 情景一:不同参数数目的构造器 制作汉堡可以选择自定义,加肉,加菜,或者不添加,直接默认配方即可,那么会有以下几个构造器: Hamburg(); Hamburg(Meat meat); Hamburg(Meat meat,Vegetable vegetable); 当你要制作汉堡的时候,看到这么多的构造器,但是却不知道他们是什么意思,返回的汉堡到底有什

  • Java中的static关键字你了解多少

    目录 一.static关键字的用途 1)static方法 2)static变量 3)static代码块 二.static关键字的误区 1.static关键字会改变类中成员的访问权限吗? 2.能通过this访问静态成员变量吗? 3.static能作用于局部变量么? 三.常见的笔试面试题 1.下面这段代码的输出结果是什么? 2.这段代码的输出结果是什么? 3.这段代码的输出结果是什么? 总结 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “static方法就是没有th

  • Java构造器方法深入理解

    目录 重载 1.构造器的重载 2.方法的重载(overload) 重写 重载 1.构造器的重载 因为构造器的名字必须与类名相同,所以同一个类的所有构造器名肯定相同,构成重载:为了让系统能区分不同的构造器,多个构造器的参数列表必须不同. class Person{ int age; String name; public Person(){ } public Person(int age){ this.age = age; } public Person(int age,String name){

  • java构造器 默认构造方法及参数化构造方法

    目录 1.构造器 1.1 权限修饰符是public 1.2 显示定义构造器 1.构造器 构造器也叫构造方法.构造函数,是一种特殊类型的方法,负责类中成员变量(域)的初始化.构造器的用处是在创建对象时执行初始化,当创建一个对象时,系统会为这个对象的实例进行默认的初始化. 有两种类型的构造方法: 1.默认构造方法(无参数构造方法) 2.参数化构造方法 1.1 权限修饰符是public 权限修饰符是public,表示内部属性能被其他类访问到. java默认的构造方法是无参的. Java编译器会自动创建

  • JAVA构造器是否为静态方法你知道吗

    在thinking in java中,第96页提到,“即使没有显示地使用static关键字,构造器实际上也是静态方法“,对此我产生了疑惑,于是找相关资料进行确认,在一篇大神的博客中得到了答案,那就是构造器不是静态方法. 主要是以下几点原因: Java虚拟机规范第二版中定义了四种不同的字节码指令来处理Java程序中不同种类的方法的调用: invokestatic - 用于调用类(静态)方法 invokespecial - 用于调用实例方法,特化于super方法调用.private方法调用与构造器调

  • Java构造器与传值学习总结

    本文主要学习Java构造器与传值,供大家参考,具体内容如下 构造器 构造器介绍 构造器是Java学习中一个很重要的概念,每个类的对象在使用关键字new实例化的时候,Java虚拟机都会给这个实例化的对象自动调用一个无参构造器,但是当我们自己写有构造器时,Java虚拟机将不再为我们调用这个无参构造器,而是我们要遵循我们自己写的构造器的参数规则来进行实例化.构造器不需要返回值类型,同时它也可以提供很多方法,最主要的功能是初始化类的变量成员.一个类可以有多个不同的构造器,但是这些构造器的参数列表的数量.

  • Java构造器使用方法及注意事项

    Java构造器使用方法及注意事项 超类的构造器在子类的构造器运行之前运行,也就是说,在创建对象时,先运行超类中的构造器,然后再运行子类中的构造器,此时,如果在执行超类构造器的时候,构造器执行了可覆盖的方法,那么就会去调用子类中的该方法,而此时子类还未被实例化,此时就有可能出问题. 以一个例子说明: public class Super { int age = 10; protected void say() { System.out.println("super"); } public

  • Java构造器(构造方法)与方法区别说明

    构造器,又称为构造方法.构造器用于构造该类的实例,也就是对象. 格式如下:[修饰符] 类名 (形参列表){//n条语句} 构造方法是一种特殊的方法,与一般的方法区别: 1.构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有. 2.构造方法的调用是在创建一个对象时使用new操作进行的.构造方法的作用是初始化对象. 3.不能被static.final.synchronized.abstract和native修饰.构造方法不能被子类继承. 构造方法可以被重载.没有参数的构造方

  • java构造器的重载实现实例讲解

    说到重载的问题,已经提过很多次了.我们可以把名称一致,但是内在参数不同的对象看成重载,可以说这些类的名称相同是很有迷惑性的.同时,构造器中装有许多的方法,那么构造器也是可以实现重载的功能.下面我们就构造方法格式.注意事项进行简单介绍,然后带来构造起的重载实例. 1.构造方法格式 public class 类名(){ 类名(String name); 类名 对象=new 类名(String name): } 2.注意事项 构造器必须与主类同名 构造器可以有参数 构造器可以重载 没有返回值 不添加构

  • Java的Synchronized关键字学习指南(全面 & 详细)

    前言 在Java中,有一个常被忽略 但 非常重要的关键字Synchronized今天,我将详细讲解 Java关键字Synchronized的所有知识,希望你们会喜欢 目录 1. 定义 Java中的1个关键字 2. 作用 保证同一时刻最多只有1个线程执行 被Synchronized修饰的方法 / 代码 其他线程 必须等待当前线程执行完该方法 / 代码块后才能执行该方法 / 代码块 3. 应用场景 保证线程安全,解决多线程中的并发同步问题(实现的是阻塞型并发),具体场景如下: 修饰 实例方法 / 代

  • Java数据结构与算法学习之双向链表

    目录 双向链表的储存结构示意图 双向链表的初始化结构 1.双向链表的结点 2.双向链表的头结点 3.总代码 双向链表中的指定文件插入元素  1.插入的为第一个位置 2.其他位置插入 总代码 双向链表的删除 1.删除第一个元素 2.删除其他位置元素 总代码 双向链表的储存结构示意图 双向链表的初始化结构 1.双向链表的结点 代码实现 //双向链表的结点,包含一个数据域,两个指针域 typedef struct DoublyNode { ElementType date; //数据域 struct

  • Java数据结构与算法学习之循环链表

    目录 存储结构示意图 初始化循环链表  循环链表的插入 首位置 代码实现 其他位置 代码实现(总) 循环链表的删除 1.操作的为第一个元素 2.操作元素不为第一个元素 代码实现(总) 循环链表的常见操作  存储结构示意图 优点 : 能够通过任意结点遍历整个链表结构 初始化循环链表  1.循环链表的结点 typedef struct CircularNode { ElementType date; //数据域 struct CircularNode* next; //指向下一个结点的指针域 }Ci

  • Java中反射的学习笔记分享

    目录 简介 一个简单的例子 设置使用反射 模拟instanceof运算 了解类的方法 获取有关构造函数的信息 查找类字段 按名称调用方法 创建新对象 更改字段的值 使用数组 总结 简介 反射是Java编程语言中的一个特性.它允许执行的Java程序检查或 操作 自身,并操作程序的内部属性.例如,Java类可以获取其所有成员的名称并显示它们. 从程序内部检查和操作Java类的能力听起来可能不太显示,但是在其他编程语言中,这个特性根本不存在.例如,在C或C ++ 程序中无法获取有关该程序中定义的函数的

随机推荐