------- android培训、java培训、期待与您交流! ----------
1 public int add(int a,int b){}
这个时候就传递了两个整数类型进去了,分别命名为a和b。这个时候方法里面就可以直接拿a和b开始用了。
我们调用的时候就可以直接:
1 add(5,6);
这样我们就把整数5和整数6传递给了名字叫add方法的这个方法。5和6就是实际传给add方法的参数,也就是【实参】。通常情况下,我们可能传入的是两个变量。例如:
1 int x=6;2 int y=7;3 add(x,y);
这个时候x和y就是实参了。分别对应的是add()方法的形参a和b。要注意一点,a和b跟x、y有什么关系呢?其实从名字上看是一点关系都没有的,唯一有关系的就是他们的数据类型必须要一一对应。逗号前面,方法要求传的是整数型,你调用这个方法的时候就必须传递一个整数,后面如果要求传递一个数组,你就必须传递一个数组类型进去,否则就调用错误了。
形参的命名a、b就是的意义就是给传入的两个信息命个名字。第一个我叫a,第二个我叫b。在方法体内部我就可以直接调用了这两个参数了。仅此而已。比如实参传来的两个整数型变量叫a、b形参也叫a、b,这个时候传入的a、b和方法内部的a、b一样吗?表面看一样,其实传入的a和b是方法外的两个变量,方法内部也把重新命名了两个变量叫a和b来接收方法外的两个变量。方法外的方法内部的a和b占用了不同位置的内存的。所以不是同一个东西。
接着说,如果我需要把若干个整数进行相加。有的时候是两个,有的时候是3个,有的时候我还要把5个数进行相加。这个时候我们需要命名不同的函数名吗?Java提供了方法重载的功能。我们就用同一个函数名,需要传两个整数在函数名的小括号里面传入两个整数形参,需要传三个就传入三个整数形参。函数被调用的时候,你传入了几个实参,java就会去寻找能传入几个实参的那个函数,然后把实参挨个传过去就可以了。
这样在调用的时候会很方便。一个函数名就对应一种功能。如果是两个都需要传入两个整数类型的函数,他们的区别只是返回值不同,这是不算方法重载的,这样会报错。因为java会认为他们是同一个功能的函数。简单的说,java看两个方法是不是重复只看形参的类型和个数,不管该方法的返回值。
下面是一个完整的代码实例:
1 package blog; 2 3 public class Overloaddemo { 4 5 public int add(int a,int b){ //传入两个整数形参 6 return a+b; 7 } 8 9 public int add(int a,int b,int c){ //传入三个整数形参10 System.out.PRintln(add(a,b)); //重载的方法中调用了两个整数形参的同名方法11 return a+b+c;12 }13 14 public static void main(String[] args) {15 Overloaddemo test=new Overloaddemo();16 int result=test.add(1,2);17 System.out.println(result);18 19 int result2=test.add(1,3,4);20 21 //System.out.println(result);22 System.out.println(result2);23 }24 25 }
结果是:
3 4 8
二、构造方法及构造方法重载
1 class Demo{2 public Demo(int i){}3 }
可以看出:【1】构造方法的名字必须和类名完全一样。因为java是区分大小写的,所以大小写也不能写错。
【2】构造函数没有返回值,也不能写void。
我们是无法像调用类其他成员方法一样调用类的构造构造方法的。构造方法的运行是通过new关键字创建一个对象的时候,java会自动调用它为对象进行初始化。
构造函数的重载其实跟方法重载差不多,也是在同一个类中因构造函数的形参类型和个数不同构成了重载。new该对象的时候,根据new class()括号中的参数类型和个数不同,调用不同的构造函数。一个类中不同的构造函数之间是可以互相调用的。也就是只要能遵循初始化一个对象只能一开始就初始化,且只能一次的原则就可以了。
我们如果在一个构造方法中调用另一个构造方法,那么可以使用this()的方式,this()括号中的参数为构造方法的参数。也可以省略写。从用this可以看出,构造函数不是类的静态成员。
对构造方法进行调用时,对new的使用特点:
1 package blog; 2 3 public static void main(String[] args) { 4 //通过new初始化一个对象调用了空参的构造函数 5 new Gouzaofangfa(); 6 } 7 8 public Gouzaofangfa(){ 9 //空参的构造函数调用了一个参数的构造函数10 this(3); 11 System.out.println("test");12 } 13 14 public Gouzaofangfa(int i){15 System.out.println(++i); 16 } 17 18 }
结果是:
4test
三、方法重写与多态
在java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。也常叫做方法覆盖。
多态有两种表现形式,分为重载和覆盖。现在讲的就是方法覆盖。
先看看代码:
1 package blog; 2 3 public class DemoPolymorphism{ //演示多态 4 public static void main(String[] args){ 5 Son s1=new Son(); 6 s1.work(); 7 8 // 子类继承父类,子类拥有父类所有的功能,因此可以把子类传给父类 9 Dad s2=new Son();10 s2.work(); //调用了父类的工作方法,但是传递的是儿子对象,儿子对象既是父类对象也是子类对象,儿子的工作是码代码11 12 Dad s3=(Dad)s1;13 s3.work(); //把子类对象强转成父类对象,就相当于化妆成了父亲,但是让其工作还是只会码代码14 15 s1.show(); //调用了子类的show方法,展示的是其父类的工作方法,设计房子16 17 }18 19 20 }21 22 class Son extends Dad{23 //儿子继承了父类,因为儿子的工作是写代码,所以重写了父类的work方法。这个叫方法重写24 public void work(){25 System.out.println("儿子在工作:码代码");26 }27 28 public void show(){29 super.work(); //调用了父类的工作方法,会输出了父类的工作方法,设计房子30 }31 }32 33 class Dad{34 //爸爸的工作内容是设计房子35 void work(){36 System.out.println("爸爸在工作:设计房子");37 }38 }
子类重写了父类的工作方法,因为子类的工作是码代码,父类是设计房子。子类的对象属于子类类型也属于父类类型。
再来一个多态的例子。
1 abstract class Animal 2 { 3 abstract void eat(); 4 } 5 6 class Cat extends Animal 7 { 8 public void eat() 9 {10 System.out.println("吃鱼");11 }12 public void catchMouse()13 {14 System.out.println("抓老鼠");15 }16 }17 18 class Dog extends Animal19 {20 public void eat()21 {22 System.out.println("吃骨头");23 }24 public void kanJia()25 {26 System.out.println("看家");27 }28 }29 30 class DuoTaiDemo31 {32 public static void main(String[] args)33 {34 function(new Cat());35 function(new Dog());36 37 Animal a = new Cat();//向上转型38 a.eat();39 40 Cat c = (Cat)a;//向下转型41 c.catchMouse();42 43 44 }45 46 public static void function(Animal a)47 {48 a.eat();49 //用于子类型有限50 //或判断所属类型进而使用其特有方法51 if(a instanceof Cat)52 {53 Cat c = (Cat)a;54 c.catchMouse();55 }56 else if(a instanceof Dog)57 {58 Dog c = (Dog)a;59 c.kanJia();60 }61 }62 63 64 }
这个例子就把多态用途展现得很充分了。其中定义了一个方法,只要抛入的是动物类型,我就会调用其吃的方法。抛入狗就会啃骨头,抛入猫就会吃鱼。但是要注意的是,这个方法不能含有直接调用动物类型非公有的方法,也就是抽象类中不存在的方法。否则就会出错误。就好像抛入猫,就不能在方法中调用其看家的方法,否则就会出错,即使是狗也不行,因为动物类型没有这个共性的方法,你要调用,你必须强制转型成狗的类型。这个时候你就可以调用看家的方法了。
新闻热点
疑难解答