zoukankan      html  css  js  c++  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;
    	
    	//<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();
    	}
    }
    

      

  • 相关阅读:
    Ibatis入门基本语法(转) good
    zip文件压缩(转)
    联合创始人股权分配,五五分是最糟糕的做法(转)
    家长如何检查孩子的家庭作业
    oracle存储过程实例
    MachineKey
    写写我那天參加过的《文明之光》书友会
    各种加解密算法比較
    算法分析---查找最大回文子串
    随机数是骗人的,.Net、Java、C为我作证
  • 原文地址:https://www.cnblogs.com/liuwei6/p/6568651.html
Copyright © 2011-2022 走看看