封装的概念:
将类的某些信息给他隐藏在类的内部,不循序外部程序直接访,而是通过该类提供的方法来实现对隐藏信息的操作和访问
封装的两大原则:
把尽可能多的东西藏起来,对外提供便捷的接口
把所有的属性隐藏起来
封装的步骤
1.用private 隐藏属性:防止错误的修改
2.用getter、setter方法 ,用于属性的读写
3.在getter、setter方法中加入属性控制语句:对属性值的合法性判断
封装的好处:
便于使用者正确使用系统,防止错误修改属性
有助于系统之间的松耦合,提高系统的独立性
提高了软件的可重用性
降低了构建大型系统的风险
//先隐藏属性
private String name="无名氏";//名字
private int health=100;//健康值:默认值是100,健康值在0-100之间,小于60为不健康
private int love=0;//亲密度
private String sex="Q仔";//品种
//创建setter方法
public void setName(String name){
this.name=name;
}
//创建getter方法
public String getName(){
return this.name;
}
//创建setter方法
public void setHealth(int health){
if(health<0||health>100){
System.out.println("请输入0-100的数");
this.health=60;
return;
}
this.health=health;
}
//创建getter方法
public int getHealth(){
return this.health;
}
//创建setter方法
public void setLove(int love ){
if(love<0||love>100){
System.out.println("请输入0-100的数");
this.love=60;
return;
}
this.love=love;
}
//创建getter方法
public int getLove(){
return this.love;
}
//创建setter方法
public void setSex(String sex){
this.sex=sex;
}
//创建getter方法
public String getSex(){
return this.sex;
}
/*
* 输入企鹅的信息
*/
public void print(){
System.out.println("宠物自述\n我的名字叫做"+this.name+",健康值"+this.health+",和主人的亲密度是"+this.love+",我是一只"+this.sex);
}private String name="无名氏";//名字
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
//隐藏属性
private int health=100;//健康值:默认值是100,健康值在0-100之间,小于60为不健康
//创建setter方法:属性赋值:属性的具体操作(正确判断等)
public void setHealth(int health){
if(health<0&&health>100){
this.health=60;
return;
}
this.health=health;
}
//创建getter语句
public int getHealth(){
return this.health;
}
private int love=0;//亲密度
public void setLove(int love){
this.love=love;
}
public int getLove(){
return this.love;
}
private String strain="阿拉斯加";//品种
public void setStrain(String strain){
this.strain=strain;
}
public int getStrain(){
return this.getStrain();
}
/*
*
* 输出狗狗信息
*
*/
public void print(){
System.out.println("宠物自述\n我的名字叫做"+this.name+"健康值"+this.health+"和主人的亲密度是"+this.love+"我是一只"+this.strain);
}
测试类
System.out.println("欢迎您来到小玉宠物店!");
System.out.println("请输入你要领养动物的名字");
//创建Scanner类获取值
Scanner sc = new Scanner(System.in);
String name = sc.next();
System.out.println("请选择你要领养宠物的类型:(1.狗狗2.企鹅3.香猪)");
int num=sc.nextInt();
int health;
//选择你要买的动物
switch(num){
case 1:
System.out.println("请选择小狗品种:(1.哈士奇2.拉布拉多)");
int strainId = sc.nextInt();
String strain = (strainId==1)?"哈士奇":"拉布拉多";
System.out.println("请输入小狗健康值:");
health =sc.nextInt();
//创建Dog类的对象
Dog dog =new Dog();
dog.setName(name);
dog.setHealth(health);
dog.setStrain(strain);
dog.print();
break;
case 2:
System.out.println("请选择企鹅性别:(1.公的2.母的)");
int sex = sc.nextInt();
String sexs = (sex==1)?"公的":"母的";
System.out.println("请输入企鹅健康值:");
health =sc.nextInt();
//创建penguin类的对象
Penguin p = new Penguin();
p.setHealth(health);
p.setName(name);
p.setSex(sexs);
p.print();
break;
case 3:
System.out.println("请选择香猪性别:(1.公的2.母的)");
int sexId= sc.nextInt();
String sex1 = (sexId==1)?"公的":"母的";
System.out.println("请输入香猪健康值:");
health =sc.nextInt();
//创建pig类的对象
Pig pig = new Pig();
pig.setHealth(health);
pig.setName(name);
pig.setSex(sex1);
pig.pigPrint();
break;
default:
System.out.println("没有此类型的宠物");
break;
}
包的作用:
允许组成较小的单元(类似文件夹),易于找到和使用相应的文件
防止命名冲突区分名字相同的类
有助于实施访问权限控制
创建包:
作为java源代码第一条语句
用package声明包,以分号结尾
包的命名规范
包名有小写字母组成,不能一圆点开头或结尾
报名之前最好加上唯一的前缀,通常使用组织倒置的网络域名
包后续部分以不同机构内部的ifang不同而不同
JDk提供基本包
Java.lang:虚拟机自动引入
java.util:提供一些实用类
Java.io:输入,输出
使用包的注意事项
一个类同时引用了两个来自不同的同类名
必须通过完整类名来区分
每个包都是独立的,顶层包不会包含自爆的类
package和import的顺序是固定的
package必须位于第一行(忽略注释行)
只允许有一个package语句
其次是import
接着是类的声明
访问权限控制
类的访问修饰符
public修饰符:共有访问级别
默认修饰符:包级私有访问级别
修饰符/作用域
|
同一个类中
|
同一个包中
|
子类中
|
任何地方
|
public
|
可以
|
可以
|
可以
|
可以
|
protected |
可以
|
可以
|
可以
|
不可以
|
默认修饰符
|
可以
|
可以
|
不可以
|
不可以
|
private
|
可以
|
不可以
|
不可以
|
不可以
|
static可以用来修饰
成员变量:静态变量, 可以直接通过类名进行访问
成员方法:静态方法,可以直接通过类名访问
代码块:静态代码块,当java虚拟机加载类时,就会执行该代码块
Jvm加载类时,加载静态代码块
如果有多个静态块,按顺序加载
每个静态代码只会被执行一次
static变量
类成员变量包括
类变量(静态变量)
被static修饰的变量
在内存中只有一个拷贝
类内部,可在任何方法内直接访问静态变量
其他类中,可以直接通过类名访问
实力变量
没有被static修饰的变量
每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响
static 变量的作用:
能被类的所有实例共享,可作为实例之间交流的共享数据
如果类中所有的实例变量都包含一个相同的常量的属性,可以把这个属性定义为静态常量类型,从而节省空间