封装和包
封装
封装、继承、多态——面向对象的三大特征。
封装包含两方面的意思:
——隐藏:隐藏的内部实现细节。
——暴露:将一些操作界面暴露出来。
如果通过暴露的界面来操作对象,该对象的内部状态不会被破坏。
简而言之:封装要求合理隐藏、合理暴露。
访问控制器
private ——> 不写(默认) ——> protected ——> public
private(类访问权限):该修饰符修饰的成员,只能在该类中被访问。 ——(彻底隐藏)
不写(包访问权限):该修饰符修饰的成员,只能在该类及其该类所在包中被访问。——(部分隐藏)
protected(子类访问权限):该修饰符修饰的成员,只能在该类、及其该类所在包、该类的子类中被访问。——(部分暴露)
public(公共):该修饰符修饰的成员可以在任意地方被访问。——(彻底暴露)
指定原则:
- 成员变量(实例变量),通常用private修饰,为了隐藏实现细节。
- 为每个成员变量提供public的getter、setter方法,用于控制该成员变量的方法。
- 需要暴露的方法,通常用public修饰。
- 如果希望一个方法主要用于被子类重写,用protected修饰。
包
不同公司完全可以定义同名的类,为了解决不同公司、不同项目的类名重复的问题。
Java就引入“包”机制——就是在类名添加一个前缀。taobao的User
Java程序如何为类定义包?
——在源代码中用 package 包名;
——将生成的class文件要放在对应的文件结构下
包名的命名规范:
语法要求:只要标识符即可。
专业要求:推荐用公司域名倒写,再加项目名
【备注】一旦你为类指定了包名之后,使用该类时应该用完整类名:包名+类名
导入包
import的作用:为了省略写包名。
如果不用import,每次用类时都需要使用包名+类名的形式。
import 包名 . 类名;——每次导入一个类。
import 包名 . * ;——导入指定包的所有类。
此时只能代表类,包名不能用 *。
Java程序默认已导入java.lang包下所有类。
静态导入 import static ——Java 1.5 引入。
import的作用:为了省略写包名。
import static 的作用:可以省略写类名。
用于导入指定类的所有静态成员,导入之后,即可省略写类名。
import static 包名. 类名.静态成员名;——每次只导入一个静态成员。
import static 包名. 类名.*;——导入指定类的所有静态成员。
Java源程序的结构:
一条package语句
N条import语句
N个class定义
public class User {
//将成员变量隐藏——private只能在该类的类体(两个花括号之间)被访问
private String name;
private int age;
//项目要求,用户名的长度必须在6~10位之间
//set方法是没有返回值的
public void setName(String name)
{
if(name.length()>10 || name.length()<6)
{
System.out.println("您设置的用户名长度必须为6~10之间: "+name);
return ;
}
this.name = name;
}
//get方法是一定有返回值的 ,而且返回的跟成员变量的类型是一样的
public String getName()
{
return this.name;
}
//项目要求,用户年龄必须在18~60岁之间
public void setAge(int age)
{
if(age>80 || age<18)
{
System.out.println("您的年龄不符合:" + age);
return;
}
this.age = age;
}
public int getAge()
{
return this.age;
}
}
public class UserTest {
public static void main(String[] args)
{
User u = new User();
// u.name = "卢金鸿";
u.setName("卢金鸿");
System.out.println(u.getName());
u.setName("帅气的卢金鸿");
System.out.println(u.getName());
u.setAge(2);
System.out.println(u.getAge());
}
}