偶然间,在写代码的时候突然发现课本上的代码没有用setter方法只用了getter方法。于是我就想不用一套setter和getter可以吗?
看课本P104:
属性封装:private 属性类型 属性名称;
class Person{
private String name;
public void tell(){
System.out.println("姓名"+name);
}
}
public class Test{
public static void main(String[] args){
Person per = new Person();
per.name="张三";
}
}
程序在编译过程中会出现错误
EnTest.java:10:name has private access in Person
per.name="张三" //错误,无法访问封装属性
因为name是私有属性,所以不能由对象直接访问。只要是被封装的属性,则必须通过setter和getter方法设置和取得。
setter设置,getter取得。
这只是常规方法
还可以用构造方法在对象实例化时直接把对象的值赋给属性。
例如:
class Test{
private String name; //定义了三个私有属性
private int age;
private char sno;
public Test(String name,int age,char sno) { //构造方法
this.name=name;
this.age=age;
this.sno=sno;
}
public void say() {
System.out.println(name+","+age+","+sno);
}
public String toString() { //Object 类中输出打印的方法
return this.name;
}
}
public class Lianxi0312 {
public static void main(String[] args) {
Test t1 = new Test("李阿虎",18,'a');
t1.say();
System.out.println(t1);//调用toString()方法
}
}
在这段代码中没有setter和getter方法一样可以为私有属性赋值。需要学习的除了构造方法可以在实例化时直接为属性赋值外,还有构造方法中的赋值方式。
对于私有属性在构造方法中可以this.name=name;的形式,
还可以利用setter方法this.setName(name);
在输出时(say方法中)可以直接写name或this.name,
或者利用getter方法,getName()或this.getName()。
下面附上一段使用了setter和getter方法的代码:
class Test{
private String name;
private int age;
private char sno;
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 char getSno() {
return sno;
}
public void setSno(char sno) {
this.sno = sno;
}
public Test(String name,int age,char sno) {
this.setName(name);
this.setAge(age);
this.setSno(sno);
}
public void say() {
System.out.println(this.getName()+","+getAge()+","+this.getSno());
}
public String toString() {
return this.getName();
}
}
public class Lianxi0312 {
public static void main(String[] args) {
Test t1 = new Test("李阿虎",18,'a');
t1.say();
System.out.println(t1);
}
}
注意this关键字的使用,say方法中name和age的取得方法。
运行结果: