构造器、this关键字、setter和getter
作者:互联网
构造器、this关键字、setter和getter
构造器
我们一直在学习怎么封装class,一个class封装好之后的目的一般是创建实例对象,我们其实已经做过了。
Dog dog = new Dog();
new 一个对象的时候到底发生了什么事情呢?
- java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的权限定名来加载,这个过程我们后边聊。
- 加载并初始化类完成后,再进行对象的创建工作。
我们先聊聊创建的过程:
- 在堆区分配对象需要的内存。
- 对所有实例变量赋默认值。
- 执行构造方法,比如我们可以使用构造方法赋值。(不太准确,以后会慢慢补充)
- 在栈区定义引用变量,然后将堆区对象的地址赋值给它。
构造方法,也叫构造器,会在new对象的时候主动被调用。
但是,事实上,我们并没有看到任何构造方法。
每个java类,会默认送你一个构造方法,这个方法它是这个样子的:
public Dog(){
}
我们可以写出来,也可以不写,这个构造方法什么都没做,我们可以想办法让它做一些事情,比如:
public Dog(){
name = "teddy";
age = 12;
}
public static void main(String[] args) {
Dog dog = new Dog();
System.out.println(dog.name);
System.out.println(dog.age);
}
我们并没有调用这个方法啊:
但是,结果却出来了:
teddy
12
当然如果我们想自己按照自己的意愿去构造实例,我们还可以定义这样的构造器:
同时new的时候就要传递参数了:
public Dog(String name,int age){
System.out.println("验证构造方法被调用的时机:【"+ name + "】被创建!");
this.name = name;
this.age = age;
}
public static void main(String[] args) {
Dog dog = new Dog("jinmao",23);
System.out.println(dog.name);
System.out.println(dog.age);
}
结果:
验证构造方法被调用的时机:【jinmao】被创建!
jinmao
23
此时,如果我们把那个没有参数的构造器删除,
你会发现已经不能这么去new对象了。
【注】一旦自己写了构造器,系统将不再赠送,所以我们一般【会自己补充上】。
#6、this关键字
- 记住一点:每一个方法都会默认传入一个变量叫this,它永远指向调用它的【当前实例】。
#(1)this访问属性和方法
写段代码:
//构造方法和其他方法一样可以重载,可以有参数,名字必须和类名一样,不能有一点区别
public Dog(String name){
System.out.println("验证构造方法被调用的时机:【"+ name + "】被创建!");
this.name = name;
}
public void eat(){
// this也可以在成员方法中使用
System.out.printf("【%s】再吃骨头。",this.name);
}
public static void main(String[] args) {
//直接new对象看看new的时候是不是调用了构造方法,事实证明是的
new Dog("哈士奇").eat();
}
一个方法只有在调用的时候,才能明确方法中的【this】具体指向哪个实例对象。
我们可以使用this访问当前对象的方法和属性。
#(2)this访问构造器
还可以访问当前类的构造器:
//构造方法和其他方法一样可以重载,可以有参数,名字必须和类名一样,不能有一点区别
public Dog(String name){
System.out.println("验证构造方法被调用的时机:【"+ name + "】被创建!");
this.name = name;
}
public Dog(){
this("default");
}
如果我们使用无参构造会传入一个默认值,这就是典型的案例
this当做构造器只能放在第一行
#7、setter和getter
我们之前调用一个实例对象的属性的时候,都是 dog.name
但事实上,java程序员从来不会这么干。
我们有这样的规定,所有的属性必须私有化,使用setter和getter赋值或者取值,
public class Dog {
//有哪些特点
//定义狗有颜色这个属性
private String color;
//定义狗有种类这个属性
private String type;
//定义狗有年龄这个属性
private int age;
//java约定使用setter和getter方法进行属性的取值和赋值
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//..狗还有很多属性和方法,我们无法一一列举
}
为什么呢?
- getter方法能够按照客户的期望返回格式化数据。
- setter方法可以限制和检验setter方法传入的参数,隐藏对象内部数据结构。
- 属性不具备多态性。
举个例子:
public class Girl {
private int age;
public int getAge() {
// 你问我多大了,真实年龄大于18岁,都是18岁
if(this.age > 18){
return 18;
}
return age;
}
public void setAge(int age) {
// 每过一年,如果我超过了18岁,我永远是18岁。
if(age > 18){
this.age = 18;
}
this.age = age;
}
}
所以,正确的定义一个类,一定是
- 所有的属性私有化。
- 每个属性都有对应的getter和setter放。
这是规矩,你得遵守。
package com.ydlclass;
public class Girl {
//第一块成员变量
private String name;
private int age;
private int weight;
//第二块构造器
public Girl(){
}
public Girl(String name){
this.name = name;
}
public Girl(int age,int weight){
this.age = age;
this.weight = weight;
}
//第三块成员方法
int feeling = 0;
public void happy(int feeling){
if (feeling >= 60){
System.out.println(name+"很开心!");
}else if (feeling >= 0 & feeling < 60){
System.out.println(name+"很平静!");
}else {
System.out.println(name+"很伤心!");
}
}
//第四块get和set
public void setName(String name){
this.name = name;
}
public String getName() {
return this.name;
}
public void setAge(int age){
this.age = age;
}
public int getAge() {
return this.age;
}
public void setWeight(int weight){
this.weight = weight;
}
public int getWeight(){
return this.weight;
}
}
package com.ydlclass;
public class Test {
public static void main(String[] args) {
Girl girl = new Girl();
girl.setName("安妮");
girl.setAge(19);
girl.setWeight(50);
System.out.println("女孩的名字叫:"+girl.getName());
System.out.println("她的年龄:"+girl.getAge()+"岁");
System.out.println("她的体重:"+girl.getWeight()+"kg");
girl.happy(60);
}
}
女孩的名字叫:安妮
她的年龄:19岁
她的体重:50kg
安妮很开心!
Process finished with exit code 0
标签:name,String,int,age,System,关键字,getter,public,setter 来源: https://www.cnblogs.com/zuifengdeyang/p/16286469.html