Java中的构造方法和方法重载
一、构造方法
定义:用来创建对象的方法(实例化对象的方法)
作用:创建对象过程中对成员变量进行初始化
分类:无参构造方法 & 有参构造方法
格式:
public class 类名 {
修饰符 类名 (【参数列表】){
方法体
}
}
特点:
(1)方法名和类名相同,采用大驼峰命名法。
(2)无返回值(不用写void)
(3)每创建一个类,系统自动为这个类添加一个无参构造方法(默认存在)。
(4)通过无参构造方法创建对象,没有给对象的属性赋值,那么对象的属性值全部为默认值
(5)当你在类中添加了其它的构造方法后,默认的无参构造方法会被覆盖,如果你还想使用无参构造方法,需要手动添加
二、this关键字
语法知识:
(1)this修饰的变量用于指代成员变量
(2)方法被哪个对象调用,this就指代哪个对象
(3)this关键字调用方法时,this关键字调用方法的语句必须放在第一行
(4)方法的形参如果没有和成员变量重名,不带this关键字修饰的变量指的是成员变量
(5)方法的形参如果和成员变量重名,不带this关键字修饰的变量指的是形参而不是成员变量。
作用:
(1)this关键字可以调用成员方法。
(2)this关键字用于指代当前对象,所以this关键字可以调用属性。
(3)this关键字解决了成员变量和局部变量的名称冲突问题,防止成员变量名被局部变量名隐藏。
(4)this关键字可以调用构造方法:
1.在构造方法中使用this关键字调用其他构造方法时,不能在成员方法中使用。
2.在构造方法中使用this关键字调用其他构造方法,this关键字调用构造方法的语句必须是该方法的第一条执行语句,且只能出现一次。
注意: 不能在一个类的两个构造方法中使用this互调。
范例代码
package test;
public class Person {
public String name;
public String gender;
public int age;
//无参构造方法
public Person() {
System.out.println("我是无参构造方法");
}
//有参构造方法
public Person(String name, String gender, int age) {
//调用无参构造方法,必须放在第一行
this();
//调用属性
this.name = name;
this.gender = gender;
this.age = age;
System.out.println("姓名:"+name+" "+"性别:"+gender+" "+"年龄:"+age);
System.out.println("我是有参构造方法");
}
}
//测试类
package test;
public class PersonTest {
public static void main(String[] args) {
//创建对象
Person person = new Person("张三", "男", 25); //实例化对象
}
}
三、方法重载
定义:在同一个类中,一组方法名相同,参数列表不同,就构成方法重载
特点:
(1)在同一个类中
(2)方法名相同
(3)参数列表不同(参数个数、参数顺序、参数类型)
(4)与访问权限修饰符和返回值类型无关
优点:
方法重载其实是对原有方法的一种升级,可以根据参数的不同,采用不同的实现方法,而且不需要编写多个名称,简化了类调用方法的代码
范例代码:
package homework;
public class Demo {
//定义两个int类型数据相加的方法
public int sum(int a,int b){
return a+b;
}
//定义两个double类型数据相加的方法
public double sum(double a,double b){
return a+b;
}
//定义两个double类型数据相加的方法
public int sum(int a,int b,int c){
return a+b+c;
}
//定义三个double类型数据相加的方法
public double sum(double a,double b,double c){
return a+b+c;
}
/*方法重载特点:
(1)在同一个类中
(2)方法名相同
(3)参数列表不同(参数个数、参数类型)
(4)与访问权限修饰符和返回值类型无关
*
*/
}
//测试类
package homework;
public class DemoTest {
public static void main(String[] args) {
Demo demo = new Demo();
//两个int类型的数据相加
int result1 = demo.sum(10, 20);
System.out.println("两个int类型的数据相加和为:"+result1);
//两个double类型的数据相加
double result2 = demo.sum(10, 20);
System.out.println("两个double类型的数据相加和为:"+result2);
//三个int类型的数据相加
int result3 = demo.sum(10, 20,30);
System.out.println("三个int类型的数据相加和为:"+result3);
//三个double类型的数据相加
double result4 = demo.sum(10, 20,30);
System.out.println("三个double类型的数据相加和为:"+result4);
}
}
四、static关键字
1.静态变量
静态变量:static关键字修饰的成员变量
实例变量(非静态变量):没有static关键字修饰的变量
特点:
(1)静态变量被该类所有对象共享
(2)static关键字修饰的属性,属于类,不属于对象
(3)静态变量会随着类的加载而加载,而优先于对象出现
注意:static只能修饰成员变量,不能修饰局部变量
调用方式:
1.类名调用(推荐)
格式:类名.成员变量名
2.对象名调用
格式:对象名.成员变量名
范例代码:
package test;
public class Student {
//成员变量
private String name;
private String gender;
private int age;
public static String schoolName;
//创建无参构造方法
public Student() {
super();
}
//创建有参构造方法
public Student(String name, String gender, int age) {
super();
this.name = name;
this.gender = gender;
this.age = age;
}
//创建get方法和set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//成员方法
public void method() {
System.out.println("姓名:"+name+","+"性别:"+gender+","+"年龄:"+age+","+
"就读于"+schoolName);
}
}
//测试类
package test;
public class StudentbtTest {
public static void main(String[] args) {
//静态变量赋值
Student.method(); //通过类名调用静态变量并赋值
//创建第一个对象
Student st1 = new Student();
st1.setName("张三");
st1.setGender("男");
st1.setAge(21);
//创建第二个对象
Student st2 = new Student();
st1.setName("李四");
st1.setGender("男");
st1.setAge(20);
}
}
/*
运行结果:
姓名:张三,性别:男,年龄:21,就读于清华大学
姓名:李四,性别:男,年龄:22,就读于清华大学
结果分析:
通过结果可以看出使用类名调用静态变量scoolName并赋值,对象st1和对象st2都显示出了
清华大学,从中可以得出static关键字能实现共享的特点
*/
2.静态方法
静态方法:static关键字修饰的成员方法
实例方法(非静态方法):没有static关键字修饰的方法
调用方式:
1.类名调用
格式:类名.成员方法名
2.对象名调用
格式:对象名.成员方法名
特点:
(1)静态方法里不能使用this关键字
(2)静态方法只能调用静态方法和静态变量,不能调用非静态的方法和变量
(3)非静态方法可以调用非静态的成员方法和成员变量,也可以调用静态方法和静态变量
package homework;
public class Person {
String name;
String gender;
int age;
/*非静态成员方法的形参中都隐藏一个this关键字,这个this不能在调用方法时手动赋值,
* 它是调用方法的时候,虚拟机给这个this赋值,就是谁调用当前方法,那么this就表示谁的地址值
* this表示当前方法调用者的地址值,也表示当前调用对象
*/
//成员方法
public void method(Person this) { //方法的形参中含有隐藏的关键字
System.out.println("this:"+this); //打印方法调用者的地址值
System.out.println("我是非静态方法");
//谁调用method方法,this就指的时谁
System.out.println("姓名:"+this.name+","+"性别:"+this.gender+","+"年龄:"+this.age);
way();//非静态方法可以调用静态
}
//静态方法
public static void way() { //静态方法形参中无隐藏的this关键字
System.out.println("我是静态方法");
}
}
//测试类
package homework;
public class PersonTest {
public static void main(String[] args) {
//创建对象
Person person1 = new Person();
//调用非静态方法
person1.method();//peson1调用method方法,method方法形参中的this指的就是peson1
System.out.println("person1:"+ person1); //输出对象person1的地址值
System.out.println("-------------------------------------------");
//创建对象
Person person2 = new Person();
//调用非静态方法
person2.method();//peson2调用method方法,method方法形参中的this指的就是peson2
System.out.println("person2:"+ person2);//输出对象person2的地址值
System.out.println("-------------------------------------------");
Person.way(); //类名调用静态方法
person1.way();//对象名调用静态方法
}
}