Java基础——构造器和⽅法的区别
构造函数(构造器)是⼀种特殊的函数。其主要功能是⽤来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符⼀起使⽤在创建对象的语句中。构造函数与类名相同,可重载多个不同的构造函数。在JAVA语⾔中,构造函数与C++语⾔中的构造函数相同,JAVA语⾔中普遍称之为构造⽅法。
构造⽅法的声明:
修饰符 class_name(类名) (参数列表){
逻辑代码
}
构造器特性:
1.如果我们的类当中没有定义任何构造器,系统会给我们默认提供⼀个⽆参的构造器。
2.如果我们的类当中定义了构造器,那么系统就不会再给我们提供默认的⽆参构造器。
作⽤:构建创造⼀个对象。同时可以给我们的属性做⼀个初始化操作。
下⾯主要学习构造器和⽅法的区别:
我们说构造器是⼀种⽅法,就象讲澳⼤利亚的鸭嘴兽是⼀种哺育动物。(按:⽼外喜欢打⽐喻,我也就照着翻译)。要理解鸭嘴兽,那么先必须理解它和其他哺育动物的区别。同样地,要理解构造器,那么就要了解构造器和⽅法的区别。所有学习java的⼈,尤其是对那些要认证考试的,理解构造器是⾮常重要的。下⾯将简单介绍⼀下 ,最后⽤⼀个表作了些简单的总结。
1、功能和作⽤的不同
构造器是为了创建⼀个类的实例。⽤来创建⼀个对象,同时可以给属性做初始化。这个过程也可以在创建⼀个对象的时候⽤到:Platypus p1 = new Platypus();
相反,⽅法的作⽤是仅仅是功能函数,为了执⾏java代码。
2、修饰符,返回值和命名的不同
构造器和⽅法在下⾯三个⽅便的区别:修饰符,返回值,命名。
和⽅法⼀样,构造器可以有任何访问的修饰: public, protected, private或者没有修饰(通常被package 和 friendly调⽤). 不同于⽅法的是,构造器不能有以下⾮访问性质的修饰: abstract, final, native, static, 或者 synchronized。
3、返回类型
⽅法必须要有返回值,能返回任何类型的值或者⽆返回值(void),构造器没有返回值,也不需要void。
4、命名
构造器使⽤和类相同的名字,⽽⽅法则不同。按照习惯,⽅法通常⽤⼩写字母开始,⽽构造器通常⽤⼤写字母开始。
构造器通常是⼀个名词,因为它和类名相同;⽽⽅法通常更接近动词,因为它说明⼀个操作。
5、调⽤:
构造⽅法:只有在对象创建的时候才会去调⽤,⽽且只会调⽤⼀次。
⼀般⽅法:在对象创建之后才可以调⽤,并且可以调⽤多次。
6、"this"的⽤法
构造器和⽅法使⽤关键字this有很⼤的区别。⽅法引⽤this指向正在执⾏⽅法的类的实例。静态⽅法不
能使⽤this关键字,因为静态⽅法不属于类的实例,所以this也就没有什么东西去指向。构造器的this指向同⼀个类中,不同参数列表的另外⼀个构造器,我们看看下⾯的代码:
public class Platypus {
String name;
Platypus(String input) {
name = input;
}
Platypus() {
java重写和重载的区别this("John/Mary Doe");
}
public static void main(String args[]) {
Platypus p1 = new Platypus("digger");
Platypus p2 = new Platypus();
}
}
在上⾯的代码中,有2个不同参数列表的构造器。第⼀个构造器,给类的成员name赋值,第⼆个构造器,调⽤第⼀个构造器,给成员变量name⼀个初始值 "John/Mary Doe".
在构造器中,如果要使⽤关键字this,那么,必须放在第⼀⾏,如果不这样,将导致⼀个编译错误。
7、"super"的⽤法
构造器和⽅法,都⽤关键字super指向超类,但是⽤的⽅法不⼀样。⽅法⽤这个关键字去执⾏被重载的超类中的⽅法。看下⾯的例⼦:
class Mammal {
void getBirthInfo() {
System.out.println("born alive.");
}
}
class Platypus extends Mammal {
void getBirthInfo() {
System.out.println("hatch from eggs");
System.out.print("a mammal normally is ");
}
}
在上⾯的例⼦中,使⽤BirthInfo()去调⽤超类Mammal中被重载的⽅法。
构造器使⽤super去调⽤超类中的构造器。⽽且这⾏代码必须放在第⼀⾏,否则编译将出错。看下⾯的例⼦:
public class SuperClassDemo {
SuperClassDemo() {}
}
class Child extends SuperClassDemo {
Child() {
super();
}
}
在上⾯这个没有什么实际意义的例⼦中,构造器 Child()包含了 super,它的作⽤就是将超类中的构造器SuperClassDemo实例化,并加到Child类中。
编译器⾃动加⼊代码
编译器⾃动加⼊代码到构造器,对于这个,java程序员新⼿可能⽐较混淆。当我们写⼀个没有构造器的类,编译的时候,编译器会⾃动加上⼀个不带参数的构造器,例如:public class Example {}
编译后将如下代码:
public class Example {
Example() {}
}
在构造器的第⼀⾏,没有使⽤super,那么编译器也会⾃动加上,例如:
public class TestConstructors {
TestConstructors() {}
}
编译器会加上代码,如下:
public class TestConstructors {
TestConstructors() {
super;
}
}
仔细想⼀下,就知道下⾯的代码
public class Example {}
经过会被编译器加代码形如:
public class Example {
Example() {
super;
}
}
8、继承
构造器是不能被继承的。⼦类可以继承超类的任何⽅法。看看下⾯的代码:
public class Example {
public void sayHi {
system.out.println("Hi");
}
Example() {}
}
public class SubClass extends Example {
}
类 SubClass ⾃动继承了⽗类中的sayHi⽅法,但是,⽗类中的构造器 Example()却不能被继承。
总结:
主题构造器⽅法
功能建⽴⼀个类的实例java功能语句
修饰不能⽤bstract, final, native, static, or synchronized能
返回类型没有返回值,没有void有返回值,或者void
命名和类名相同;通常为名词,⼤写开头通常代表⼀个动词的意思,⼩写开头
this指向同⼀个类中另外⼀个构造器,在第⼀⾏指向当前类的⼀个实例,不能⽤于静态⽅法super调⽤⽗类的构造器,在第⼀⾏调⽤⽗类中⼀个重载的⽅法
继承构造器不能被继承⽅法可以被继承
编译器⾃动加⼊⼀个缺省的构造器⾃动加⼊(如果没有)不⽀持
编译器⾃动加⼊⼀个缺省的调⽤到超类的构造器⾃动加⼊(如果没有)不⽀持
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论