5.3 封装性
package basic;
class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+name+",年龄"+age);
}
}
public class ClassDemo02 {
public static void main(String[] args) {
Person per=new Person(); //创建并实例化对象
per.name="张三"; //为name属性赋值
per.age=-30; //为age属性赋值
per.tell(); //调用类中的方法
}
}
用对象直接访问类中的属性,这在面向对象法则中是不允许的。为了避免这种错误,在一般的开发中往往要将类中的属性封装(private)
格式:
属性封装: private 属性类型 属性名称;
方法封装: private 方法返回值 方法名称(参数列表){}
package basic;
class Person{
private String name;
private int age;
public void tell(){
System.out.println("姓名:"+name+",年龄"+age);
}
}
public class ClassDemo02 {
public static void main(String[] args) {
Person per=new Person(); //创建并实例化对象
per.name="张三"; //为name属性赋值
per.age=-30; //为age属性赋值
per.tell(); //调用类中的方法
}
}
java: name 在 basic.Person 中是 private 访问控制
private使程序无法通过编译,不能由对象直接访问控制
1.为了解决属性必须封装且又必须访问的矛盾,Java中对私有属性的访问有以下规定“只要是被封装的属性,则必须通过setter和getter方法设置和取得”
2.使用setter和getter方法还有一个原因,就是在Java中存在反射机制,在各个程序中,反射机制都会利用setter和getter设置和取得属性内容
package basic;
class Person{
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;
}
public void tell(){
System.out.println("姓名:"+name+",年龄"+age);
}
}
public class ClassDemo02 {
public static void main(String[] args) {
Person per=new Person(); //创建并实例化对象
per.setName("张三"); //调用setter设置姓名
per.setAge(-30); //调用setter设置年龄
per.tell(); //输出信息
}
}
如果想对设置进去的值进行检查,只需在setter()方法处加入检查代码即可
package basic;
class Person{
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) { //设置年龄
if (age >= 0 && age < 150) {
this.age = age;
}
}
public void tell(){
System.out.println("姓名:"+name+",年龄"+age);
}
}
public class ClassDemo02 {
public static void main(String[] args) {
Person per=new Person(); //创建并实例化对象
per.setName("张三"); //调用setter设置姓名
per.setAge(-30); //调用setter设置年龄
per.tell(); //输出信息
}
}
姓名:张三,年龄0
Process finished with exit code 0
关于private的补充说明:
1.类中全部属性都必须封装,封装之后的属性必须通过setter和getter进行访问
2.面向对象的封装性并不是单单指private关键字。private声明的属性或方法只能在其类的内部被调用,而不能在类的外部被调用
3.正常情况下,类中的方法直接写上方法名就可以完成本类中的方法调用,如果非要强调是本类的方法,可以以this.方法名()的形式调用。建议使用这种形式,标准且查错方便