java学习笔记(十)
来源:互联网 发布:kmp算法 数据结构 编辑:程序博客网 时间:2024/05/12 02:53
封装
1:封装的目的:
封装就是保护内容,保证某些属性或方法可以不被外部看见。
class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+name+" 年龄:"+age);
}
}
public class test06
{
public static void main(String args[]){
Person per1 = null;
Person per2 = null;
per1 = new Person();
per2 = new Person();
//Person per = null;
//per = new Person();
per1.name="张三";
per1.age = 30;
per2.name="李四";
per2.age = 33;
per2 = per1;//把per1的堆内存空间使用权给per2
per1.tell();
per2.tell();
}
}
此时如果把per1.age = 30;语句改为per1.age = -30;
class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+name+" 年龄:"+age);
}
}
public class test06
{
public static void main(String args[]){
Person per1 = null;
Person per2 = null;
per1 = new Person();
per2 = new Person();
//Person per = null;
//per = new Person();
per1.name="张三";
per1.age = -30;
per2.name="李四";
per2.age = 33;
per2 = per1;//把per1的堆内存空间使用权给per2
per1.tell();
per2.tell();
}
}
后,在java语法上没有任何问题,但是从实际角度看,以上的代码绝对不符合要求。
为什么呢?
#因为没有人的年龄是负数。
而不合适的根本原因在与此处让属性可以直接被外部所访问。
此时只能通过封装解决:
2:封装实现:
为属性封装:private 属性类型 属性名称
为方法封装:private 方法返回值 方法名称(参数列表){}
class Person{
private String name;
private int age;
public void tell(){
System.out.println("姓名:"+name+" 年龄:"+age);
}
}
public class test06
{
public static void main(String args[]){
Person per1 = null;
Person per2 = null;
per1 = new Person();
per2 = new Person();
//Person per = null;
//per = new Person();
per1.name="张三";
per1.age = -30;
per1.tell();
}
}
此时再次编译,出现问题:
F:\test>javac test06.java
test06.java:17: name 可以在 Person 中访问 private
per1.name="张三";
^
test06.java:18: age 可以在 Person 中访问 private
per1.age = -30;
^
2 错误
提示是一个私有的访问权限,则意味着,外部根本就无法调用。
3:访问封装的内容
因为这些属性肯定是要表示出一些实际的意义,那么这些有意义的内容肯定应该有外部设定,所以在整个java中对于封装性的访问就给出了一个明确的原则,此原则必须遵守。
被封装的属性如果需要被访问,则需要编写setter及getter方法完成。
如:private String name;
Setter(设置):public void setName(String n){}
Getter(取得):public String getName();
class Person{
private String name;
private int age;
public void setName(String n){
name = n;
}
public void setAge( int a){
age = a;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public void tell(){
System.out.println("姓名:"+name+" 年龄:"+age);
}
}
public class test06
{
public static void main(String args[]){
Person per1 = null;
Person per2 = null;
per1 = new Person();
per1.setName("张三");
per1.setAge(-30);
per1.tell();
}
}
此时程序运行结果如下:
F:\test>javac test06.java
F:\test>javac test06.java
F:\test>java test06
姓名:张三 年龄:-30
注:
以上的代码只是可以访问封装属性了,但是并没有加入检错错误的措施。
如果年龄设置的有问题,则不应该为属性赋值。
在setter方法中加入检测
getter直接取值就行啦
加入验证后的代码:
class Person{
private String name;
private int age;
public void setName(String n){
name = n;
}
public void setAge( int a){
if(a>=0&&a<=150){
age = a;
}
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public void tell(){
System.out.println("姓名:"+name+" 年龄:"+age);
}
}
public class test06
{
public static void main(String args[]){
Person per1 = null;
Person per2 = null;
per1 = new Person();
per1.setName("张三");
per1.setAge(-30);
per1.tell();
}
}
结果为:
F:\test>javac test06.java
F:\test>java test06
姓名:张三 年龄:0
总结:
#封装性在java中有很多形式,private致死最基本的一种形式,也是一种比较常见的形式
#类中的每一个属性都必须封装
- java学习笔记(十)
- Java学习笔记(十)
- Java学习笔记(十)
- Java学习笔记(十)
- java学习笔记(十)
- Java学习笔记(十)
- Java学习笔记十
- Effective Java学习笔记(十)
- Java Web学习笔记(十)dwr
- Java学习笔记十(注解)
- 张孝祥java视频学习笔记(十)
- java-J2SE学习笔记(十)
- Java SE 学习笔记(十)
- java学习笔记<十>接口
- [Java]学习笔记,随笔【十】
- 学习笔记(十)
- java学习笔记(十) -- java和PostgreSQL的连接
- Java学习笔记(十):Java中的JNDI
- Rails3 入门之四 Hello Rails
- 一笺天 之 工作第一年
- C#插入图片到Excel中
- windows azure 架构
- Java多线程编程中关键点说明
- java学习笔记(十)
- 免票
- 央视国际总经理汪文斌
- Export data to Excel from Silverlight/WPF DataGrid
- java学习笔记(十一)
- C++ vector 类学习笔记
- java学习笔记(十二)
- Paul Graham:未来的互联网创业(下)
- 导出网页中的table到excel