一、什么是封装
封装是面向对象三大特征之一,对象代表什么,就得封装对应的数据,并提供数据对应的行为
二、private的使用
当把学生测试类的age设置成如下结果时,会有什么样的结果呢?
s.name = "张三";
s.age = -23;
System.out.println(s.name);
System.out.println(s.age);
年龄为负数,这是不符合常理的,这时就需要用到private了
private是个权限修饰符,可以修饰成员变量和成员方法,被private修饰的成员只能在本类中使用
private int age;
再使用s.age=-23会报错,可是s.age=23还会报错,因为private修饰的age只能在Student类中使用
接下来每一个属性都要提供一个由public修饰的set和get方法
//设置值 给成员变量赋值
public void setAge(int a) {
if (a > 0 && a < 120) {
age = a;
} else {
System.out.println("输出有误");
}
}
//获取值 对外提供成员变量的值
public int getAge() {
return age;
}
这样,学生的测试类代码如下:
//创建对象
Student2 s=new Student2();
//赋值
s.setName("张三");
s.setAge(13);
//获取并输出
System.out.println(s.getName());
System.out.println(s.getAge());
当年龄设置成负数时,代码如下:
//创建对象
Student2 s=new Student2();
//赋值
s.setName("张三");
s.setAge(-13);
//获取并输出
System.out.println(s.getName());
System.out.println(s.getAge());
会有以下结果:
三、this的使用
以上代码中的set和get方法不够严谨,因为定义的变量不能做到见名知意,如setAge中的int a,应该inr age,String na同样如此,完整代码如下:
package oopText;
public class Student2 {
private String name;
private int age;
//设置值
public void setAge(int age) {
if (age > 0 && age < 120) {
age = age;
} else {
System.out.println("输出有误");
}
}
//获取值
public int getAge() {
return age;
}
public void setName(String name) {
name = name;
}
public String getName() {
return name;
}
public void show() {
System.out.println(name + "..." + age);
}
}
可是测试类中会有以下输出结果:
package oopText;
public class StudentTest2 {
public static void main(String[] args) {
//创建对象
Student2 s=new Student2();
//赋值
s.setName("张三");
s.setAge(13);
//获取并输出
System.out.println(s.getName());
System.out.println(s.getAge());
s.show();
}
}
由输出可知,成员变量的赋值失败了,原因:方法中的局部变量和成员变量重名了,当重名时,java会使用就近原则,简单来说就是那个变量离我更近,我就使用谁,由代码可以,局部变量更近,所以name=name使用的都是局部变量,局部变量自己给自己赋值,根本没有触碰到成员变量,所以会输出String 的默认值null,age同样是这个道理。
如果想要重名,还要局部变量给成员变量赋值,就需要使用this关键字,将等号左边的name改为this.name
学生类代码:
package oopText;
public class Student2 {
private String name;
private int age;
//设置值
public void setAge(int age) {
if (age > 0 && age < 120) {
this.age = age;
} else {
System.out.println("输出有误");
}
}
//获取值
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void show() {
System.out.println(name + "..." + age);
}
}
学生测试类代码:
package oopText;
public class StudentTest2 {
public static void main(String[] args) {
//创建对象
Student2 s=new Student2();
//赋值
s.setName("张三");
s.setAge(13);
//获取并输出
System.out.println(s.getName());
System.out.println(s.getAge());
s.show();
}
}
输出如下:
由以上可知:this关键字的作用可以调用本类的成员变量或成员方法,解决局部变量和成员变量的重名问题