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);
		}
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值