Java -- 初始化与清理(构造方法,重载,this,初始化,参数列表)

初始化与清理(构造方法,重载,this,初始化,参数列表):

初始化与清理为计算机科学的发展提供了一种安全的处理方式。

下面是初始化与清理的几个要点和需要注意的地方:

1.构造器:

初始化是保证程序安全的方法之一,为了保证程序在操作对象之前被初始化,我们就有了构造器这个概念。

a.构造器的名字:与类名相同。

eg:

import java.util.Random;

class Gclass{
	Gclass(){     //构造方法
		System.out.println("我是一个构造方法");
	}
}

class Pclass{
	public void cclass(){    //普通方法
			System.out.println("我是一个普通方法");
	}
}

public class a {

	public static void main(String[] args) {
		new Gclass();      //构造方法的调用
		Pclass t = new Pclass();
		t.cclass();        //普通方法的调用
	}

}

output:
我是一个构造方法
我是一个普通方法

b.构造器参数:

不接受任何参数的构造器叫做无参构造器

eg:

import java.util.Random;

class Gclass{
	Gclass(int i){     //构造方法
		System.out.println("我是一个构造方法");
	}
}

class Pclass{
	public void cclass(int i){    //普通方法
			System.out.println("我是一个普通方法");
	}
}

public class a {

	public static void main(String[] args) {
		for(int i = 0;i < 5;i++){
			new Gclass(i);      //构造方法的调用
			Pclass t = new Pclass();
			t.cclass(i);        //普通方法的调用
		}	
		
	}

}

output:
我是一个构造方法
我是一个普通方法
我是一个构造方法
我是一个普通方法
我是一个构造方法
我是一个普通方法
我是一个构造方法
我是一个普通方法
我是一个构造方法
我是一个普通方法

c.构造器的返回值:构造器没有返回值,即使void也不行。

2.方法重载

多数语言要求每个方法都提供独一无二的标识符。但是由于构造器名字相同,所以就有了重载的概念,通俗说,重载就是几个方法名字相同。为了区别和使用相同名字的方法,但是,重载的参数列表必须不同。

a.方法重载:

eg:

class TreeHeight{
	int h;
	TreeHeight(){
		System.out.println("This is tree!");
	}
	
	TreeHeight(int hh){
		System.out.println("This is new tree "+hh+" feet tall");
	}
}

public class d {

	public static void main(String[] args) {
		for(int i = 0;i < 5;i++){
			new TreeHeight(i);
			new TreeHeight();
		}
		
	}

}
output:
This is new tree 0 feet tall
This is tree!
This is new tree 1 feet tall
This is tree!
This is new tree 2 feet tall
This is tree!
This is new tree 3 feet tall
This is tree!
This is new tree 4 feet tall
This is tree!

b.重载方法的区分:

每个重载的方法都必须有一个独一无二的参数列表,即便仅仅是参数的顺序不同。

3.this关键字

在我们使用this时,this一般出现在类的方法里面,当这个方法还没有调用的时候this指的是谁并不知道,但是实际当中如果new一个对象出来之后,this指的就是当前这个对象。通俗讲,this就是为了便于区分和方便,完全可以被替代。

eg:

public class D {
	int pp = 0;
	String s = "initial value";
	D(int p){
		pp = p;
		System.out.println("a w/ int oo,pp= " + pp);
	}
	
	D(String ss){
		System.out.println("a w/ String oo,s = " + ss);
		s = ss;
	}

	D(String s,int p){
		this(p);
		//this(s);   //在构造发法中,使用this调用构造方法的语句必须放在第一行,且只能出现一次,
		this.s = s;
		System.out.println("Strign & int");
	}
	
	D(){
		this("hi",47);
		System.out.println("aaaaaaaa");
	}
	
	void Dd(){
		//this(11);   //只能在构造方法中使用this调用其它的的构造方法,不能再成员方法中使用。
		System.out.println("pp = " + pp +" s = "+s);
	}
	
	public static void main(String[] args) {
		D d = new D();     //执行构造方法
		d.Dd();
	}

}
output:
a w/ int oo,pp= 47
Strign & int
aaaaaaaa
pp = 47 s = hi

需要注意:

  • 1、只能在构造方法中使用this调用其它的的构造方法,不能在成员方法中使用。
  • 2、在构造发法中,使用this调用构造方法的语句必须放在第一行,且只能出现一次,
  • 3、不能在一个类的两个构造方法中使用this互相调用。

4.初始化

a.静态数据初始化:

eg:

/*
 * 初始化顺序:
 * 1.先初始化变量,按照顺序
 * 2.再处理构造器
 * 3.再初始化静态对象
 * 4.处理完静态对象后再处理非静态对象
 * 通俗讲就是静态对象先执行。
 */

class Bowl{
	Bowl(int marker){
		System.out.println("Bowl("+ marker +")");
	}
	void f1(int marker){
		System.out.println("f1("+ marker +")");
	}
}

class Table{
	static Bowl bowl1 = new Bowl(1);
	Table(){
		System.out.println("Table()");
		bowl2.f1(1);
	}
	void f2(int marker){
		System.out.println("f2("+ marker +")");
	}
	static Bowl bowl2 = new Bowl(2);
}

public class StaticClass {
	public static void main(String[] args){
		System.out.println("aaaaaaaaaaaaaa");
	}
	static Table table = new Table();  //静态对象先执行。

}
output:
Bowl(1)
Bowl(2)
Table()
f1(1)
aaaaaaaaaaaaaa

eg2:对照上个程序,更易理解

class Bowl{
	Bowl(int marker){
		System.out.println("Bowl("+ marker +")");
	}
	void f1(int marker){
		System.out.println("f1("+ marker +")");
	}
}

class Table{
	static Bowl bowl1 = new Bowl(1);
	Table(){
		System.out.println("Table()");
		bowl2.f1(1);
	}
	void f2(int marker){
		System.out.println("f2("+ marker +")");
	}
	static Bowl bowl2 = new Bowl(2);
}

class Cupboard{
	Bowl bowl3 = new Bowl(3);
	static Bowl bowl4 = new Bowl(4);
	Cupboard(){
		System.out.println("Cupboard()");
		bowl4.f1(2);
	}
	void f3(int marker){
		System.out.println("f3("+ marker +")");
	}
	static Bowl bowl5 = new Bowl(5);
}

public class StaticClass {
	public static void main(String[] args){
		System.out.println("aaaaaaaaaaaaaa");
		new Cupboard();
		System.out.println("aaaaaaaaaaaaaa");
		new Cupboard();
		table.f2(1);
		cupboard.f3(1);
	}
	static Table table = new Table();
	static Cupboard cupboard = new Cupboard();

}
output:
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
aaaaaaaaaaaaaa
Bowl(3)
Cupboard()
f1(2)
aaaaaaaaaaaaaa
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)

b.非静态实例初始化:

/*
 * 初始化顺序:
 * 1.先初始化变量,按照顺序
 * 2.再处理构造器
 * 3.再初始化静态对象
 * 4.处理完静态对象后再处理非静态对象
 * 通俗讲就是静态对象先执行。
 */

class Bowl{
	Bowl(int marker){
		System.out.println("Bowl("+ marker +")");
	}
	void f1(int marker){
		System.out.println("f1("+ marker +")");
	}
}

class Table{
	
	Table(){
		System.out.println("Table()");
		bowl2.f1(1);
	}
	void f2(int marker){
		System.out.println("f2("+ marker +")");
	}
	Bowl bowl2 = new Bowl(2);Bowl bowl1 = new Bowl(1);
}

public class StaticClass {
	public static void main(String[] args){
		System.out.println("aaaaaaaaaaaaaa");
		Table table = new Table(); 
		table.f2(2);
	}
}
output:
aaaaaaaaaaaaaa
Bowl(2)
Bowl(1)
Table()
f1(1)
f2(2)

5.可变参数列表,基本类型与基本类型包装类

a.基本类型与基本类型包装类:

  • Java的基本数据类型包括boolean、char、byte、short、int、float、long、double 8种。
  • 其分别对应的包装类是:Boolean、Character、Byte、Short、Integer、Float、Long、Double类。

b.可变参数列表:

可变参数列表可以方便的创建对象并调用方法,常应用于参数个数和类型未知的场合。

  • 所有的类都间接或直接继承于Object类。

c.可变参数列表与基本类型包装实例:

eg:

public class bie {
	
	/*
	 * 所有的类都间接或直接继承于Object类。
	 * 定义了一个Object的可变参数列表数组
	 * 遍历打印每一个参数
	 */
	static void printarray(Object[] args){
		for(Object obj : args){
			System.out.println(obj + " ");
		}
	} 
	
	/*
	 * 定义了一个包装类型为Integer的的可变参数列表数组
	 * 遍历打印每一个参数
	 */
	static void inf(Integer...args){
		for(Integer i : args){
			System.out.println(i + " ");
		}
	}
	
	public static void main(String args[]){
		
		printarray(new Object[]{
				new Integer(23),   //可变参数为int型
				new Float(3.14)    //可变参数为float型
		});
		printarray(new Object[]{"one","two","three",new Integer(1)});
		
		inf(111,222,333);  //直接可以传入int型参数
	}

}
Output:
23 
3.14 
one 
two 
three 
1 
111 
222 
333 

以上时Java初始化与清理常见的问题,希望通过我的文章可以对大家的学习有所帮助。

本人原创,转载请说明,谢谢!

猜你喜欢

转载自blog.csdn.net/weixin_40042248/article/details/81914650