关于Java中名字,初学者对于某些知识点容易出现混淆,本文重点介绍Java中的构造方法、方法重载、方法重写
本文提醒:
1.本文代码基于:Jdk1.8-191
2.本文代码工具:eclipse2018.9
3.使用系统:windows10
4.本文每一段代码均为一个类
正文开始
构造法方法与方法重载容易混淆的原因在于,他们在一个类中都可以存在多个名字都相同的方法,本文将介绍其区别
构造方法即跟类名同名、没有返回类型,构造方法在类被实例化的时候,就是将类new后,这个方法会第一时间执行,即使你没有写构造方法,虚拟机也会创建一个空参构造方法执行一次。如果类中只创建了空参构造方法或带参构造方法,那么在类被实例化的时候只能执行空参构造方法(默认构造方法)或带参构造方法,详见下文实例1.3
基本语法([ ]内的内容表示可有可无)
[访问修饰符] 类名([参数1类型 参数2标识符] , [参数2类型 参数2标识符] , [参数n类型 参数n标识符]){
[构造体或方法体或函数体]
}
1.空参构造方法
2.携带形式参数的构造方法(带参构造方法)
实例1.1 TestClass:
public class TestClass {
//空参构造方法
public TestClass() {
System.out.println("来自TestClass 空参构造方法(默认构造方法)消息--1");
}
//带参构造方法
public TestClass(String info) {
System.out.println("来自TestClass 带参构造方法消息--2,传入参数:" + info);
}
//带参构造方法(多参数)
public TestClass(int x, int y, int z, String info) {
System.out.println("来自TestClass 消息:以下两行控制台输出是来自于TestClass 多餐构造方法的输出");
System.out.println("the sum is : " + (x + y + z));
System.out.println("the informathion is : " + info);
}
}
在类的继承中,如果执行子类的构造方法,子类会优先执行父类的构造方法,然后执行子类的构造方法,实例1.2 TestClassOne (继承自TestClass):
//TestClassOne(本类)继承自TestClass
public class TestClassOne extends TestClass {
//空参构造方法(默认构造方法)
public TestClassOne() {
System.out.println("来自TestClassOne 消息: 这是TestClassOne 空参构造方法输出消息--1");
}
//带参构造方法
public TestClassOne(String info) {
System.out.println("来自TestClassOne 消息: 这是TestClassOne 带参构造方法输出消息--2,接收到的参数是:" + info);
}
public static void main(String[] args) {
new TestClassOne();
}
}
此时执行TestClassOne 控制台输出:
来自TestClass 消息: 这是空参构造方法(默认构造方法)--1
来自TestClassOne 消息: 这是TestClassOne 空参构造方法输出消息--1
如果子类执行父类的带参构造方法(小白注意:此处涉及 类的继承 概念),空参构造方法将不再被执行,实例1.3 TestClassTwo:
//这是测试类TestClassTwo
public class TestClassTwo extends TestClass {
public TestClassTwo() {
System.out.println("来自TestClassTwo 消息: 这是来自于TestClassTwo 的空参构造方法(默认构造方法)方法的消息--1");
}
public static void main(String[] args) {
//小白注意:以下代码涉及 类的继承 概念
new TestClass(1, 2, 3, "info");
}
}
控制台输出内容如下:
来自TestClass 消息:以下两行控制台输出是来自于TestClass 多餐构造方法的输出
the sum is : 6
the informathion is : info
由此可知空参构造方法没有执行,只执行了多参构造方法。
方法重载和构造方法相似,原因在于他们在同一个类中可以存在多个同名且不能跟类名相同的方法,不严谨的说,构造方法其实也算方法重载。但是,构造方法在类被实例化的时候肯定会默认执行 空参构造方法(默认构造方法)、带参构造方法 中的一种;而方法重载必须通过 类.方法 的语法(形式或规则)调用构造方法;再者构造方法调用区分在于形式参数,不能用访问修饰权限和返回的值来区别重名的方法,即在外部调用一个累的重载方法的时候只能根据方法的形式参数的不同来调用不同的重载方法
基本语法([ ]内的内容表示可有可无):
[访问修饰符] [返回的数据类型/void] 方法名([参数1类型 参数2标识符] , [参数2类型 参数2标识符] , [参数n类型 参数n标识符]){
[方法体或函数体]
}
以下我将通过代码区别方法重载与构造方法1.4:
public class TestClassFour {
//TestClassFour的无参构造方法
TestClassFour() {
System.out.println("来自TestClassFour消息:这是TestClassFour默认构造方法(无参构造方法)输出消息--1");
}
//TestClassFour的带参构造方法
TestClassFour(String info) {
System.out.println("来自TestClassFour消息:这是TestClassFour带参构造方法输出消息--2,接收到的参数是:" + info);
}
//以下均为重载方法,即重名的方法
public int demo(int x, int y, int z) {
System.out.println("来自TestClassFour消息:这是demo带参方法输出消息--3,接收到的参数分别是: " + x + "," + y + "," + z);
return (z + y + z);
}
public void demo() {
System.out.println("来自TestClassFour消息:这是demo无参方法输出消息--4");
}
void demo(String info) {
System.out.println("来自TestClassFour消息:这是访问修饰权限为默认的demo带参方法输出消息--5,接收到的参数是:" + info);
}
public static void main(String[] args) {
//默认的无参构造方法(默认构造方法)将执行,因为被实例化的时候回默认执行一种构造方法
TestClassFour tcf = new TestClassFour();
//调用tcf的无参重载方法
tcf.demo();
//调用tcf的带参重载方法,给予三个参数,该方法返回三个参数的和
int i = tcf.demo(1, 6, 3);
System.out.println("来自TestClassFour消息:这是主方法(main)的控制台输出,接收到来自demo(int x, int y, int z)的返回数据:"+i);
}
}
运行代码,得出以下控制台输出:
来自TestClassFour消息:这是TestClassFour默认构造方法(无参构造方法)输出消息--1
来自TestClassFour消息:这是demo无参方法输出消息--4
来自TestClassFour消息:这是demo带参方法输出消息--3,接收到的参数分别是: 1,6,3
来自TestClassFour消息:这是主方法(main)的控制台输出,接收到来自demo(int x, int y, int z)的返回数据:12
通常构造方法与方法重载相混淆,与方法重载区别在于
1.构造方法没有返回值、而方法重载有返回值
2.构造方法在类被实例化的时候会默认执行,方法重载则需要写另外的代码执行
3.构造方法的名字与类名是一致的,而方法重载不能与类名一致
方法重写的概念存在于类的继承中,只有类的继承中才会涉及这个概念。方法重写就是子类重写父类的方法,但是有个条件,即父类方法名字,返回值 ,参数和子类方法名字,返回值 ,参数一样的时候,在子类执行这个与父类方法名字一样的时候,会执行子类的方法,就像子类重新构造了父类同名方法一样,所以称之为方法重写。原因在于:在继承中,子类执行一个方法或使用一个参数(属性)的时候,本类找不到方法或参数(属性)的时候,会向父类去找方法或参数(属性),如果父类找不到就再往上去找祖父类的方法或参数(属性)。那它为什么会自动向上找参数或属性?原因在于,在类的继承中,规定了被继承的类(父类),其子类可以使用非私有的所有方法和属性(参数),因为子类可以使用所有父类的所有非私有方法和属性(参数),所以等于说父类的所有非私有就是子类自己的方法和属性了,所以才会向上去找子类没有的属性(参数)和方法。
在上面的实例1.3已经对子类去找父类方法有所体现,下面我简单示例一下就行:
public class TestClassFive extends TestClassFour {
//此处重写了父类TestClassFour demo()方法
public void demo() {
System.out.println("来自TestClassFive消息:这是TestClassFive 空参方法demo()的控制台输出--1");
}
public static void main(String[] args) {
new TestClassFive().demo();
}
}
执行以上代码控制台输出:
来自TestClassFour消息:这是TestClassFour默认构造方法(无参构造方法)输出消息--1
来自TestClassFive消息:这是TestClassFive 空参方法demo()的控制台输出--1
此时我们没有看到父类TestClasssFour的无参方法demo()方法输出的控制台消息,因为本中已经重新构造了无参方法demo(),所以讲不会执行父类无参方法demo()。那么要怎么执行父类同名方法呢?使用关键词,super,我们在TestClassFive中加上一行代码:
public class TestClassFive extends TestClassFour {
//此处重写了父类TestClassFour demo()方法
public void demo() {
//这是我对TestClassFive 后来加上的代码
super.demo();
System.out.println("来自TestClassFive消息:这是TestClassFive 空参方法demo()的控制台输出--1");
}
public static void main(String[] args) {
new TestClassFive().demo();
}
}
加上一行代码后,程序输出如下:
来自TestClassFour消息:这是TestClassFour默认构造方法(无参构造方法)输出消息--1
来自TestClassFour消息:这是demo无参方法输出消息--4
来自TestClassFive消息:这是TestClassFive 空参方法demo()的控制台输出--1
由此可见,子类重写了父类的同名、同参、同返回数据类型、同修饰符的时候可以通过super关键词调用父类方法。这就是方法重写