1、方法重載
/*
方法重載
我們將名字相同,參數列表不同的兩個(或多個)方法
稱為重載方法。
參數列表的不同體現在以下兩點:
1 參數的類型不同
2 參數的個數不同
方法參數列表的不同,是編譯器用來區分調用哪一個
重載方法的依據。
*/
public class Overload {
public void f(int x) {
System.out.println("f(int x)");
}
public void f(float a) {
System.out.println("f(float a)");
}
public void g() {
System.out.println("g()");
}
public void g(int x) {
System.out.println("g(int x)");
}
public void g(int x, int y) {
System.out.println("g(int x, int y)");
}
public static void main(String[] args) {
Overload o = new Overload();
int r = 1;
float t = 1.0f;
//調用f(int x)方法
o.f(r);
//調用f(float a)方法
o.f(t);
//調用g()方法
o.g();
//調用g(int x)方法
o.g(r);
//調用g(int x, int y)方法
o.g(r, r);
}
}
/*
以下條件不同,是否構成方法重載:
1 參數名字的不同
2 方法的返回類型不同
*/
public class Overload2 {
/*
僅參數名字不同的方法,不能構成重載。
public void f(int a) {
}
public void f(int b) {
}
*/
/*
僅方法返回類型不同,不能構成重載。
因為我們在調用方法時,可以忽略返回值。
public int g() {
return 5;
}
public String g() {
return "";
}
public byte g() {
return (byte)5;
}
*/
public static void main(String[] args) {
Overload2 o = new Overload2();
//o.f(5);
//int x = o.g();
//String s = o.g();
//double d = o.g();
//o.g();
}
}
2、重載方法
/*
重載方法:
聲明原則:我們應該將功能相似的兩個(或多個)
方法聲明為重載方法。而不應該將功能不相關的
兩個(或多個)方法聲明為重載方法。因為這樣會
帶來混淆。
實現原則:因為重載方法具有功能上的相似性,
因此,重載方法的代碼也會有很大的相似性,此時,
很可能會出現重復的代碼。所以,我們應該考慮
一個重載方法使用另外一個重載方法來實現,而不是
每個重載方法都有各自的實現。
調用原則:參數少的方法調用參數多的方法。
*/
public class Overload3 {
/*
非常不合適
public void operation(int a, int b) {
//相加操作
int sum = a + b;
}
public void operation() {
System.out.println("輸出操作");
}
*/
//標准格式*輸出
public void printStar() {
/*for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}*/
printStar(5);
}
public void printStar(int row) {
for (int i = 1; i <= row; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
public static void main(String[] args) {
}
}
3、構造器
/*
構造器
聲明:
構造器與類名相同,並且沒有返回類型(沒有返回類型與
返回類型是void不同)。訪問權限與參數列表與普通方法
相同,沒有限制。
構造器會在創建對象時,由系統自動調用。
默認的構造器
當類中沒有顯式的聲明構造器時,編譯器會為該類自動
生成一個默認的構造器。默認的構造器訪問權限與
類的訪問權限相同,參數列表為空。
如果我們顯式的聲明了構造器,不論我們聲明的構造器
是否含有參數,默認的構造器都將不復存在。
*/
public class Cons {
int x;
int y;
int z;
//構造器
/*public Cons() {
//System.out.println("構造器執行了。");
x = 1;
y = 1;
z = 1;
}*/
//含有參數的構造器
//可以進行更加靈活的初始化。
public Cons(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
public static void main(String[] args) {
/*Cons c = new Cons();
System.out.println(c.x);
System.out.println(c.y);
System.out.println(c.z);*/
/*c.x = 1;
c.y = 1;
c.z = 1;
Cons c2 = new Cons();
c2.x = 2;
c2.y = 2;
c2.z = 2;*/
Cons c = new Cons(1, 2, 3);
Cons c2 = new Cons(4, 5, 6);
}
}
4、構造器重載
/*
構造器重載
可以在類中聲明多個構造器,因為構造器的名字與
類名相同,因此,如果聲明了多個構造器,則
多個構造器必然會重載。
我們可以在類中聲明多個構造器,進而可以實現
多種初始化方式。
*/
public class ConOverload {
int x;
int y;
//默認的初始化方式
public ConOverload() {
//x = 10;
//y = 20;
//錯誤
//ConOverload(10, 20);
this(10, 20);
}
//指定初始化方式
public ConOverload(int x, int y) {
this.x = x;
this.y = y;
}
public static void main(String[] args) {
ConOverload c = new ConOverload();
ConOverlaod c2 = new ConOverload(50, 100);
}
}
5、構造器調用的原則
/*
構造器調用的原則:
1 在調用方式上
需要使用this來調用構造器,而不能通過構造器的
名字調用構造器。
2 在調用位置上
只能在構造器中對構造器進行調用,而不能在構造器
之外對構造器進行調用。
3 在語句順序上
調用構造器的語句必須是構造器中的第一條語句。
*/
public class ConCall {
public ConCall() {
//錯誤!
//ConCall(5);
//System.out.println("abc");
this(5);
}
public void outCon() {
//錯誤!
//this(5);
}
/*
public void ConCall(int x) {
}
*/
public ConCall(int x) {
}
}
6、this的使用
/*
this的使用:
1 this指代當前的對象,可以通過this訪問
類中聲明的成員。
2 可以通過this來調用構造器。
this:this指代當前的對象。
當前對象:誰調用的該方法(構造器),當前對象
就是誰。
*/
public class ThisTest {
int x;
public ThisTest() {
//通過this調用構造器。
this(5);
}
public ThisTest(int x) {
this.x = x;
}
public void setX(int x) {
//通過this訪問被局部變量所遮蔽的成員變量。
this.x = x;
}
public void f() {
this.x = 1;
this.setX(5);
x = 1;
setX(5);
}
/*
public void f(ThisTest this) {
this.x = 1;
this.setX(5);
x = 1;
setX(5);
}
*/
public static void main(String[] args) {
ThisTest t = new ThisTest();
//ThisTest t = new ThisTest(t);
t.f();
//t.f(t);
ThisTest t2 = new ThisTest();
t2.f();
//t2.f(t2);
}
}
7、成員變量的初始化
/*
成員變量的初始化(實例成員變量)
1 在實例變量聲明處初始化
2 使用初始化塊
3 使用構造器
三種初始化的順序:
1 實例變量聲明處初始化與初始化塊按照類中聲明
的順序執行。
2 實例變量聲明處初始化與初始化塊會在構造器之前
得到執行。
*/
public class Init {
//在實例變量聲明處初始化
//int x = 1;
//int x = System.out.println("初始化塊1執行");
int x = initX();
//初始化塊
{
//x = 1;
System.out.println("初始化塊1執行");
}
//構造器
public Init() {
//x = 1;
System.out.println("構造器執行");
}
{
x = 1;
System.out.println("初始化塊2執行");
}
int y = initY();
public int initX() {
System.out.println("x聲明處初始化執行");
return 1;
}
public int initY() {
System.out.println("y聲明處初始化執行");
return 1;
}
public static void main(String[] args) {
Init i = new Init();
//System.out.println(i.x);
}
}
/*
聲明處初始化與初始化塊中的語句會復制到
每個構造器的最前面。(init)。
如果構造器中,使用this調用了其他的構造器,
則不會進行上述的復制。(避免重復的初始化。)
*/
public class Init2 {
/*
{
System.out.println(this.x);
}
*/
//int x = 1;
int x = initX();
int y = 2;
{
System.out.println("aaa");
}
public int initX() {
System.out.println(y);
return 1;
}
/*public Init2() {
this(10);
//System.out.println("bbb");
}*/
public Init2(int k) {
//x = 1;
//y = 2;
//System.out.println("aaa");
}
public static void main(String[] args) {
//Init2 i = new Init2();
new Init2(5);
}
}
/*
public class Init2 {
int x;
int y;
//<init>
public Init2() {
System.out.println(x);
x = 1;
y = 2;
System.out.println("aaa");
System.out.println("bbb");
}
public static void main(String[] args) {
//Init2 i = new Init2();
new Init2();
}
}
*/
8、可變參數
/*
可變參數
可變參數使用...表示,可以接受0個到多個參數。
可變參數實際上就是一個數組。每個實參都是作為
數組的一個元素。
對於main方法的String[] args,實際上就是一個可變
參數。因此,main方法也可以寫成如下形式:
public static void main(String... args) {
}
可變參數的限制:
可變參數必須作為方法參數列表的最后一個參數。
這意味着,方法的參數列表最多只能有一個類型
為可變參數類型。
*/
public class VarArgs {
public static void main(String... args) {
VarArgs v = new VarArgs();
System.out.println(v.add());
System.out.println(v.add(2));
System.out.println(v.add(2, 3));
System.out.println(v.add(2, 3, 4, 5, 6));
}
/*
public int add(int x, int y) {
return x + y;
}
public int add(int x, int y, int z) {
return x + y + z;
}
*/
public int add(int... x) {
int sum = 0;
for (int i : x) {
sum += i;
}
return sum;
}
/*
add(1, 2, 3, 4, 5);
public int add(int... x, int k) {
//實現
}
public int add(int... x, int... y) {
}
public int add(int k, int... x) {
}
*/
}
9、可變參數的重載
/*
可變參數的重載
當可變參數參與重載時,可變參數的方法會后考慮,
這是為了做到對以前程序的兼容。
*/
public class VarOverload {
public void f(int x) {
System.out.println("f(int x)");
}
public void f(int... x) {
System.out.println("f(int... x)");
}
public static void main(String[] args) {
VarOverload v = new VarOverload();
v.f(10);
v.f();
}
}
