Java学习—Day02

雨燕双飞 提交于 2020-02-17 05:37:57

自学Java-Day02

自学Java第二天,本文介绍构造方法以及关键字this。

一、构造方法

从前文可知,实例化一个类的对象后,要为这个对象的属性进行赋值,就要通过访问对象的属性或调用setXxx方法。而构造方法可以在实例化对象的同时为此对象的属性进行赋值
条件:

  1. 方法名与类名相同;
  2. 方法名的前面没有返回值类型的声明;
  3. 在方法中不能使用return语句返回一个值,但可以用return语句来作为方法的结束。
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关键字

当在方法中出现了局部变量和成员变量同名的时候,可以在成员变量名前面加上 this. 来区别成员变量和局部变量。
三种用法:

  1. 利用this关键字访问一个类的成员变量,解决成员变量与局部变量名称冲突的问题。 this.age=age;
  2. 利用this关键字调用成员方法。
  3. 在构造方法中利用this([参数1,参数2…])来调用其他构造方法。
    案例:
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调用类的构造方法时注意:

  1. 只能在构造方法中使用this调用其他构造方法,不能在成员方法中使用。
  2. 在构造方法中,使用this调用构造方法的语句必须在第一行,且只能出现一次
  3. 不能在一个类的两个构造方法中使用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());
    }
}

输出:
在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!