封装
一·封装的作用
public class Penguin{
public int health;
}
Penguin p = new Penguin();
p.health = -1000;
因为以前传统的方式,允许外部直接访问本类中的信息(属性)!不安全!
二. 会使用封装
**封装:**将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。(把尽可能多的东西藏起来,对外提供便捷的接口<方法>)
封装实现步骤:
- 属性私有化(以前我们是public -> private 私有化之后 这个属性只能在本类中使用)
- 提供公共的(public)getter/setter方法
- 在对应的getter/setter方法中加入控制语句(根据需求去选择性的添加控制语句)
/**
* 大象
* @author Charles
*
*/
public class Elephant {
// 特征/属性/成员变量/字段
/*public String name;
public int age;
public int health;
public int love;*/
// 1.私有化属性
private String name;
private int age;
private int health;
private int love;
// 通过接口访问属性
// 2.公共的getter/setter方法
public void setHealth(int health) {
// 3.加入控制语句
if(health < 0 || health > 100) {
System.out.println("健康值非法!已经自动进行更正为60");
this.health = 60;
}
}
public int getHealth() {
return health;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// ....
/**
* 宠物自我介绍
*/
public void printPetInfo() {
System.out.println("宠物自白:");
System.out.println("姓名:"+name);
System.out.println("年龄:"+age);
System.out.println("健康值:"+health);
System.out.println("亲密度:"+love);
}
}
封装的优势:
- 便于使用者正确使用系统,防止错误修改属性
- 有助于系统之间的松耦合,提高系统独立性
- 提高软件的可重用性
- 降低了构建大型系统的风险
最好的系统架构是:高内聚、低(松)耦合。
三.会使用java中的包组织类
**出现的原因:**如果没有包!不方便查找、分类!而且不能出现同名类!
包的特点:
所有字母都小写!
规范:公司域名的倒序 + 项目名 +开发组名...。
// 声明包 它必须出现在类文件有效代码第一行
package cn.bdqn.demo4;
// 如果是java.lang包下的类不需要导包
import java.util.Scanner;
// 导包 必须出现在包声明下方 在类声明上方
// 可以导入具体的类 也可以批量导入 该包中所有内容 * *号优先级比较低
import cn.bdqn.demo3.Student;
public class Test {
public static void main(String[] args) {
// 如果没导入包 默认去当前包中查找指定的类
Student stu = new Student();
// 如果在一个类中 使用了两个相同名的类
// 那么必然有一个是全类名/全限定名/全路径 的形式
cn.bdqn.demo4.Student student = new cn.bdqn.demo4.Student();
// Ctrl+Shift+O 全局导包 而且会自动去除没有使用的包
Scanner input = new Scanner(System.in);
}
}
扩展:
com.tencent.tim
com.taobao
com.neteasy.cloudmusic
安卓区分不同的程序:
1.依靠包来进行区分! 公司的域名倒序
2.签名(随机生成字符串)
四.掌握访问修饰符,理解访问权限
访问修饰符 \作用域 | 本类中 | 同包中 | 子类中(继承) | 本项目任何位置 |
---|---|---|---|---|
public(最开放) | √ | √ | √ | √ |
protected(受保护的) | √ | √ | √ | |
默认的(package/default) | √ | √ | ||
private(私有的,最保守的) | √ |
五.static关键字
**static可以修饰变量:**静态变量/类变量
**static也可以修饰方法:**静态方法/类方法
**static也可以修饰代码块:**静态代码块
public class Dog {
// 成员代码块/构造代码块/非静态代码块:会随着对象的创建而执行里面的代码片段(创建一次对象就执行一次) 它优先于构造方法执行
{
}
// 静态代码块:会随着类的加载而执行里面的代码片段(只会执行一次)
static {
}
}
static修饰的类信息等和普通的成员(实例/对象)信息等的区别:
-
生命周期不同
类信息随着类加载而创建
实例信息随着对象产生而创建
-
"作用域"不同
类信息被该类的所有的对象共享,只要有一个对象更改,所有的对象获取的结果都会变化。
实例信息仅仅被自身对象所使用,不同对象之间的实例信息相互独立存在。
-
调用上有所不同
实例信息必须通过先创建对象,然后才能使用
类信息,直接可以用
类名.
的形式调用(当然也可以用对象来调用)
注意事项:
- 如果在多个对象之间,有共享的数据,且这个数据不会发生变动,最好定义为静态常量,可以有效提升效率。
static final修饰...
- 在类信息中,如果使用实例信息,需要注意先创建对象才能使用。而反之则无所谓。(自己思考谁先出生和谁后出生)
static代码块随着类一起加载
1)如果有多个静态块,按顺序加载
2)每个静态代码块只会被执行一次
静态方法:可直接通过类名访问
1)静态方法中不能使用this和super
2)不能直接访问所属类的实例变量和实例方法
3)可直接访问静态变量和静态方法
实例方法:通过实例访问
可直接访问所属类的实例变量、实例方法、静态变量、静态方法
静态方法必须被实现