哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路!
这一节啊,咱们要学习的内容还是Java的面向对象。
1. 构造方法
构造方法和new关键字是一对好拍档。
在之前GirlFriend的例子中,我们写了两个构造方法,一个是带参的,一个是无参的。
//类的构造方法 public GirlFriend(String name,String hair,boolean glasses,String skirt,String color){ this.name = name; this.hair = hair; this.glasses = glasses; this.skirt = skirt; this.color = color; } public GirlFriend() { }
Java 构造方法是在创建 Java 类的实例时被调用的方法,它会为实例分配内存并初始化实例变量。
构造方法有两个特点:
1、构造方法的名称必须和类名相同,可以有参数,也可以没有参数;
2、构造方法没有返回值类型,不能使用return关键字。
记住这两点即可!
接下来看看构造方法的作用:
1、为实例变量赋初始值:
class Student{ private String name; private int age; public Student(){ this.name = "张三"; this.age = 18; } }
这段代码中的构造方法实现了给实例变量name和age赋初始值,即当创建新的Student实例时,name和age的值分别为“张三”和18。
2、可以通过构造方法实现重载:
class Student{ private String name; private int age; public Student(){ this.name = "张三"; this.age = 18; } public Student(String name,int age){ this.name = name; this.age = age; } }
这段代码中的构造方法实现了重载,即通过传入不同的参数,可以创建不同的Student实例,name和age的值可以根据传入的参数而定。没错,构造方法也是可以重载的。
3、可以调用其他构造方法:
class Student{ private String name; private int age; public Student(){ this.name = "张三"; this.age = 18; } public Student(String name,int age){ this(name); this.age = age; } public Student(String name){ this.name = name; } }
这段代码中的构造方法实现了调用其他构造方法,即通过调用其他构造方法,可以创建不同的Student实例,name和age的值可以根据调用的构造方法而定。
4、可以通过构造方法实现父类构造方法的调用:
class Person{ public Person(){ System.out.println("Person的构造方法"); } } class Student extends Person{ private String name; private int age; public Student(){ super(); this.name = "张三"; this.age = 18; } }
这段代码中的构造方法实现了父类构造方法的调用,即在创建Student实例之前,会先调用其父类的构造方法,即Person的构造方法。继承相关的知识我们会在后面讲到。
因此,构造方法是java编程中非常重要的组成部分,它可以实现对象的初始化,并且可以实现类的重载,支持多种构造方法,满足不同的需求。
还有一点就是上一节遇到的,如果你写了有参构造,就要显示定义无参构造方法。这是因为当程序运行时,会调用类中的构造函数,如果有参构造函数被定义,但是没有定义无参构造函数,那么程序就无法正常运行,因为它不知道如何去调用构造函数,从而导致程序运行出错。
所以程序强制要求你显示定义无参构造方法。
咱们再缕一缕:
-Java写个带参的构造方法,那默认的无参的就必须再显示写一个,但这是为什么呢?
-很简单
-jvm会在语义分析过程中来为没有构造函数的类搭建构造函数。
-如果有构造函数的话就不会自己默认搭建构造函数。
-如果设置了无论是否有构造函数都写构造函数
-那就有一个问题,如果已经有一个无参构造函数了,再构造一个,到时候调用哪个呢?
也就是说当一个类你没有给他构造函数,则编译器会自动补上一个无参的,若有的话就不会,你需要显示将此无参的构造函数写出来。这是编译器帮你做的,防止你忘了写无参构造函数,没什么好纠结的,记住就行了。
2.this关键字
this是java中的一个关键字,它代表当前对象的引用,它可以在构造方法、普通方法中使用。尤其在构造方法中可以指定某个属性,可以避免类的属性
和构造方法参数
重名的尴尬。
例如:
public class Person { private String name; private int age; public Person(){ this.name="张三"; //使用this关键字来引用name变量 this.age=18; //使用this关键字来引用age变量 } }
this关键字还有一个作用,就是在构造方法中调用另一个构造方法。注意,你不能在普通方法里面调用构造方法。只能在构造方法中用this去调用另一个构造方法。
public class Person { private String name; private int age; public Person(){ this.name="张三"; //使用this关键字来引用name变量 this.age=18; //使用this关键字来引用age变量 } //重载1 public Person(String name){ this.name = name; } //重载2 public Person(String name,int age){ this(name); //根据参数的类型和格式,会自动地去匹配对应地重载构造方法 this.age = age; } }
为了方便测试,我们用idea生成一下toString方法:
@Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; }
测试:
public class TestPerson { public static void main(String[] args) { Person p = new Person("jack",18); System.out.println(p); } }
结果:
Person{name='jack', age=18}
this还可以用来在普通方法中调用属性和其他普通方法。
3.课后作业
又到课后练习啦,这一节比比较重要,大家不要偷懒,一定要把习题做一做哦!
创建一个汽车类Car,拥有品牌brand和颜色color两个属性。分别用带参构造器和无参构造器来实例化Car类,并编写toString方法。再写一个测试类,在测试类的main方法中进行测试。
顺便附上上一节的答案,题目是:
设计一个宠物类Pet,构造方法用于接收宠物的名字、类型及性别,实例化宠物后,可以用实例化的宠物对象来访问宠物的名字、类型及性别,并实现宠物的叫声功能,要求叫声不同类型的宠物不同,实现叫声时可以显示出宠物的名字和类型。
参考答案:
public class Pet { private String name;//宠物名字 private String type;//宠物类型 private String gender;//宠物性别 public Pet(String name, String type, String gender) { this.name = name; this.type = type; this.gender = gender; } //获取宠物名字 public String getName() { return name; } //获取宠物类型 public String getType() { return type; } //获取宠物性别 public String getGender() { return gender; } //宠物叫声 public void cry() { if (type.equals("dog")) { System.out.println(name + ": 汪汪汪"); } else if (type.equals("cat")) { System.out.println(name + ": 喵喵喵"); } else { System.out.println("叫声未知"); } } }
有任何不懂的地方,可以点击下方的“发消息”给我留言。
PS:从这一节开始,欢迎你使用任何你喜欢的IDE完成作业,比如eclipse,IDEA,如果不会使用工具,可以去B站搜索相关的视频进行学习哈。