自学Java第二天,本文介绍构造方法以及关键字this。
从前文可知,实例化一个类的对象后,要为这个对象的属性进行赋值,就要通过访问对象的属性或调用setXxx方法。而构造方法可以在实例化对象的同时为此对象的属性进行赋值。
条件:
public class Person{
public Person(){
System.out.println("调用无参的构造方法!");
}
}
public class Demo01{
public static void main(String[] arges){
Person p1=new Person();
}
}
说明:"new Person()"的作用不仅是实例化Person对象,同时会自动调用构造方法Person()。
定义有参的构造方法,通过有参的构造方法实现对属性的赋值。
public class Person{
int age;
public Person(int a){
age=a;
}
public void speak(){
System.out.println("今年我已经"+age+"岁了!");
}
}
public class Demo02{
public static void main(String[] arges){
Person p1=new Person(20);//在实例化对象的同时调用有参的构造方法传入参数20
p1.speak();
}
}
在一个类中可以定义多个构造方法,只要每个构造方法的参数类型或参数个数不同即可。通过调用不同的构造方法为不同的属性赋值。
public class Person{
String name;
int age;
public Person(String con_name,int con_age){
name=con_name;
age=con_age;
}
public Person(String con_name){
name=con_name;
}
public void speak(){
System.out.println("今年我已经"+age+"岁了!");
}
}
public class Demo03{
public static void main(String[] arges){
Person p1=new Person("小明");
Person p2=new Person("小红",20);
p1.speak();
p2.speak();
}
}
说明:在创建p1对象和p2对象时,根据传入的参数不同,分别调用不同的构造方法。
注:每个类中都至少有一个构造方法,即使没有构造方法,系统也会自动为这个类创建默认的构造方法,这个方法没有参数,在方法体内没有任何代码。
class Person{
class Person{
=====> public Person(){
}
} }
两种写法效果一样。
当在方法中出现了局部变量和成员变量同名的时候,可以在成员变量名前面加上 this. 来区别成员变量和局部变量。
三种用法:
public class Person{
public Person(){
System.out.println("无参构造方法被调用");
}
public Person(String name){
this();
System.out.println("有参构造方法被调用");
}
}
public class Demo04{
public static void main(String[] ages){
Person p=new Person("name");
}
}
输出:无参构造方法被调用
有参构造方法被调用
使用this调用类的构造方法时注意:
class Person{
public Person{
this("小明");
System.out.println("无参的构造方法被调用了");
}
public Person(String name){
this();
System.out.println("有参的构造方法被调用了");
}
}
随机点名器案例:
public class Student {
private String name;
private int age;
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
}
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Random;
public class RandomText {
public static void main(String[] ages){
ArrayList<Student> list=new ArrayList<Student>();
addStudent(list);
printStudent(list);
randomStudent(list);
}
public static void addStudent(ArrayList<Student>list){
Scanner sc =new Scanner(System.in);
for (int i=0;i<3;i++){
Student s=new Student();
System.out.println("存储第"+i+"个学生姓名:");
String name=sc.next();
s.setName(name);
System.out.println("存储第"+i+"个学生年龄:");
int age=sc.nextInt();
s.setAge(age);
list.add(s);
}
}
public static void printStudent(ArrayList<Student> list){
for (int i=0;i<list.size();i++){
Student s=list.get(i);
System.out.println("姓名:"+s.getName()+",年龄:"+s.getAge());
}
}
public static void randomStudent(ArrayList<Student> list){
int index=new Random().nextInt(list.size());
Student s=list.get(index);
System.out.println("被随机点名的同学:"+s.getName()+",年龄:"+s.getAge());
}
}