重载java_方法重载

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;

//

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

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值