1、封装性(private)
首先我们来看一个例子:
public class People {
int age;
String name;
}
public class Test {
public static void main(String[] args) {
People people = new People();
people.name = "张三";
people.age = 28;
System.out.println(people.name);
System.out.println(people.age);
people.age = -1000;
System.out.println(people.age);
}
}
测试结果:
张三
28
-1000
人怎么可能有负数的年龄,这样很不合理。其他类随便访问,而且随便修改值,这样很不安全。
为什么要封装?好处是?
- 封装把复杂的事物变成简单的事物,通过一个操作入口。
- 封装之后才会形成真正的对象,真正的独立体。
- 封装意味着可以重复使用,适应性强、安全性高。
封装步骤:
- 所有属性私有化,使用private关键字就行修饰。(private表示私有,修饰的数据只能在本类中访问)
- 有private修饰但是我还想在其它类访问怎么办——>使用getter/setter方法(可以会有疑问,既然能通过getter/setter在其它类也能访问,那封装来干嘛。别急看第二大点)
2、getter/setter方法
下面的例子通过private来就行封装,所以其他类通过(引用.变量)的方式访问不了了,必须通过(引用.方法)来访问,而方法里面可以写限制的条件,这样就保证了安全性。
public class People {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
if( age < 0 || age>150){
System.out.println("你赋值的年龄不合法");
}else{
this.age = age;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Test {
public static void main(String[] args) {
People people = new People();
people.setName("张三"); //setter方法用来赋值
people.setAge(28);
System.out.println(people.getName()); //getter方法用来取值
System.out.println(people.getAge());
people.setAge(-1000); //这个条件被限制了,所以没有改变到值
System.out.println(people.getAge()); //输出原来的值
}
}
测试结果:
张三
28
你赋值的年龄不合法
28
建议:setter方法和getter方法采用自动生成。如果不是自动生成,必须按照他的语法规则来写。
3构造方法
构造函数(constructor)是一种特殊的方法,只不过他是与new运算符一起使用在创建对象的语句中 。
每一个类都会自动生成一个构造方法,只是不给你看见而已,而且构造函数方法可以被重载。
其作用具体有:
- 用来在创建对象
- 为对象成员变量赋初始值
上面我们知道setter可以为变量赋值,而构造方法的作用2也有赋值功能。
当有很多变量时就要写很多的setter方法(这样太麻烦了),直接把他们变成构造方法。
代码可以改成:
public class People {
private int age;
private String name;
public int getAge() {
return age;
}
/*
public void setAge(int age) {
if( age < 0 || age>150){
System.out.println("你赋值的年龄不合法");
}else{
this.age = age;
}
}
*/
public String getName() {
return name;
}
/*
public void setName(String name) {
this.name = name;
}
*/
public People(int age, String name) { //默认的构造方法是空的,这里重载了构造方法并带有形参;
if( age < 0 || age>150){
System.out.println("你赋值的年龄不合法");
}else{
this.age = age;
}
this.name = name;
}
}
public class Test {
public static void main(String[] args) {
People people = new People(28,"张三"); //这里通过new调用带有形参的构造方法,创建了对象并赋值
/*
people.setName("张三"); //setter方法用来赋值
people.setAge(28);
*/
System.out.println(people.getName()); //getter方法用来取值
System.out.println(people.getAge());
People people1 = new People(-1000,"张三");
System.out.println(people.getAge());
}
}
测试结果:
张三
28
你赋值的年龄不合法
28
建议:构造方法采用自动生成(生成时可以挑选哪个变量作为你的形参)。如果不是自动生成,必须按照他的语法规则来写。