java面向对象(上)--构造方法与this关键字
Posted 北林日记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java面向对象(上)--构造方法与this关键字相关的知识,希望对你有一定的参考价值。
构造方法的定义
实例化一个对象后,如果要为这个对象中的属性赋值,则必须要通过直接访问对象的属性或调用setXxx()的方式才可以。如果需要在实例化对象的同时就为这个对象的属性赋值,可以通过构造方法来实现。构造方法是类的一个特殊成员,它会在类实例话对象时被自动调用。
在一个类中如果定义的方法满足以下三个条件,该方法被称为构造方法:
-
方法名与类名相同。
-
在方法名的前面没有返回值类型的声明,包括void。
- 在方法中不能使用return语句返回一个值。
这时候大家可能会产生疑问,构造方法不是没有返回值吗?为什么不能用 void 声明呢?
简单的说,这是 Java 的语法规定。实际上,类的构造方法是有返回值的,当使用 new 关键字来调用构造方法时,构造方法返回该类的实例,可以把这个类的实例当成构造器的返回值,因此构造器的返回值类型总是当前类,无须定义返回值类型。但必须注意不要在构造方法里使用 return 来返回当前类的对象,因为构造方法的返回值是隐式的。
注意:构造方法不能被 static、final、synchronized、abstract 和 native(类似于 abstract)修饰。构造方法用于初始化一个新对象,所以用 static 修饰没有意义。构造方法不能被子类继承,所以用 final 和 abstract 修饰没有意义。多个线程不会同时创建内存地址相同的同一个对象,所以用 synchronized 修饰没有必要。
无参构造方法
1 public class Person { 2 //下面是类的构造方法 3 public Person() { 4 System.out.println("无参的构造方法被调用了...."); 5 } 6 } 7 8 class Example { 9 public static void main(String[] args) { 10 Person p = new Person(); //实例化Person对象 11 12 } 13 }
运行结果:
有参构造方法
在一个类中除了定义无参的构造方法,还可以定义有参的构造方法。通过有参的构造方法就可以实现对属性的赋值
1 public class Person { 2 int age; 3 4 //定义有参的构造方法 5 public Person(int a) { 6 age = a; 7 } 8 public void speak(){ 9 System.out.println("我今年" + age +"岁!"); 10 } 11 } 12 13 class Example { 14 public static void main(String[] args) { 15 Person p = new Person(20); //实例化Person对象 16 p.speak(); 17 } 18 }
运行结果:
构造方法的重载
与普通方法一样,构造方法也可以重载,在一个类中可以定义多个构造方法,只要每个构造方法的参数类型或参数个数不同即可。在创建对象时,可以提供调用不同的的构造方法为不同的属性赋值。
1 public class Person { 2 String name; 3 int age; 4 5 //定义一个参数的构造方法 6 public Person(String con_name,int con_age) { 7 name = con_name; 8 age = con_age; 9 } 10 //定义一个参数的构造方法 11 public Person(String con_name) { 12 name = con_name; 13 } 14 15 public void speak(){ 16 System.out.println("大家好!我叫"+name +",我今年" + age +"岁!"); 17 } 18 } 19 20 class Example { 21 public static void main(String[] args) { 22 //分别创建两个对象p1,p2 23 Person p1 = new Person("张三"); 24 Person p2 = new Person("李芳",20); 25 //通过p1,p2调用speak()方法 26 p1.speak(); 27 p2.speak(); 28 } 29 }
运行结果:
注意:在java中的每个类都至少有一个构造方法,如果在一个类中没有定义构造方法,系统会自动为这个类创建一个默认的构造方法,这个默认的构造方法没有参数,在其方法体中没有任何代码,即什么也不做。由于系统提供的构造方法往往不能满足需求,因此,我们可以自己在类中定义构造方法,一旦为该类定义了构造方法,系统就不再提供默认的构造方法。在一个类中如果定义了有参的构造方法,最好再定义一个无参的构造方法,避免产生不必要的错误!!!
简单点来说:构造方法用来初始化 java 类,提供类的初始化和实例化,以便调用。
总结:
1.当没有指定构造方法时,系统会自动添加无参的构造方法。
2.构造方法可以重载:方法名相同,但参数不同的多个方法,调用时会自动根据不同的参数选择相应的方法。
3.构造方法是不被继承的
4.当我们手动的指定了构造方法时,无论是有参的还是无参的,系统都将不会再添加无参的构造方法。
5. 构造方法不能被static、final、synchronized、abstract和native修饰。
this关键字
在上面的例子中,构造方法中使用的是con_age,成员变量使用的是age,这样的程序可读性很差,这时需要将一个类中表示年龄的变量进行统一的命名,例如都声明为age。但是这样做又会导致成员变量与局部变量的名称冲突,在方法中将无法访问对象的成员变量age。为了解决这个问题,java中提供了一个关键字this,用于在方法中访问对象的其他成员。
1.通过this关键字可以明确地去访问一个类的成员变量,解决与局部变量名称冲突问题。
2.通过this关键字调用成员方法。
1 public class Person { 2 String name; 3 4 public Person(String name) { 5 this.name = name; 6 } 7 8 public String getName() { 9 return name; 10 } 11 12 public void setName(String name) { 13 this.name = name; 14 } 15 16 17 public void speak(){ 18 System.out.println("大家好!我叫"+name +"!"); 19 } 20 21 public void openMouth(){ 22 this.speak(); 23 } 24 } 25 26 class Example { 27 public static void main(String[] args) { 28 //创建对象p1, 29 Person p1 = new Person("张三"); 30 //通过p1调用openMouth()方法
31 p1.openMouth(); 32 } 33 }
运行结果:
在上面的openMouth()方法中,使用this关键字调用speak()方法,此处的this关键字可以省略不写,也就是说this.speak()和speak(),效果是完全一样的。
3.构造方法是在实例化对象时被java虚拟机自动调用的,在程序中不能像调用其他方法一样去调用构造方法,但可以在构造方法中使用“this([参数1,参数2....])”的形式来调用其他的构造方法。
运行结果:
在使用this关键字调用类的构造方法时,应注意以下几点:
1.只能在构造方法中使用this调用其他的构造方法,不能再成员方法中使用。
2.在构造方法中使用this调用构造方法的语句必须位于第一行,且只能出现一次。
3.不能在一个类中的两个构造方法中使用this互相调用。
以上是关于java面向对象(上)--构造方法与this关键字的主要内容,如果未能解决你的问题,请参考以下文章