封装
- 将类的某些信息隐藏在类的内部,不允许外部程序直接访问
- 通过该类提供的方法来实现对隐藏信息的操作与访问
- 隐藏对象的信息
- 留出访问的接口
访问修饰符
default
(即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
private
: 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
public
: 对所有类可见。使用对象:类、接口、变量、方法
protected
: 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
包管理
Java中一个包不能存在同名的类,可以在不同的包中定义两个同名的类。
每个包的功能信息尽量单一
导包
package com.jachie.Food;
import con.jachie.animal.*; // 1.加载 con.jachie.animal 包下所有类
import con.jachie.animal.Cat; // 2.加载 con.jachie.animal 包下指定的Cat类
public class Apple {
public static void main(String[] args) {
// 3.直接加载
con.jachie.animal.CatTest catest = new con.jachie.animal.CatTest();
}
}
- 建议采用`import 包名.类名; 进行加载,提高效率
- 加载类的顺序与Import导入语句的顺序无关
- import 包名.* ;此方式只能访问包名下的类,无法访问子包下的类
常用系统包
包名 | 功能 |
---|---|
java.lang | 包含Java语言基础的类,该包系统加载时默认导入。如:System、String、Math |
java,util | 包含Java语言中常用的工具。如:Scanner、Random |
java.io | 包含输入、输出相关功能的类。如File、InputStream |
包的命名方法:
域名倒序
+ 模块
+ 功能
package
必须放在Java源文件的第一行
package com.jachie.Food; // 定义包
public class Apple {
}
static
通过static
修饰的变量称为静态变量,同样修饰的方法称为静态方法,没有使用static修饰的变量和方法分别称为实例变量和实例方法。
静态变量
所有实例化的成员共享此变量的内存空间,因此变量值会统一。
声明周期
类加载时产生,销毁时释放,生命周期长
访问方式
对象.属性
类名.属性
静态方法
父类中的静态方法无法被子类重写
注意:而如果子类中存在于父类一模一样的完全相同的静态方法,子类中的静态方法会专属于子类调用,会互不干扰,编译器会在把另一个方法隐藏
父类
public class Animal {
public static String info() {
return "animal";
}
}
子类
public class Cat{
public static String info() {
return "Cat";
}
}
输出
System.out.println(Cat.info()); // Cat
System.out.println(Animal.info()); // Animal
访问方式
对象.方法()
类名.方法()
而静态方法无法直接访问同一个类中的非静态成员(方法、属性),只能直接调用同一个类中的静态成员,(
只能通过对象实例化后,通过对象调用非静态陈成员
);在静态方法里不能使用this
代码块
- 普通代码块
- 构造代码块
- 静态代码块
普通代码块
顺序执行,先出现,先执行
构造代码块
创建对象时调用,优先于构造方法执行,在一个类当中可以有多个。
静态代码块
类加载时调用,优先于构造代码块执行
演示实例
NewPro
package com.jachie;
public class NewPro {
public void NewPro() {
System.out.println("构造方法——顺序代码块");
}
{
System.out.println("构造代码块");
} // 构造代码块
static{
System.out.println("静态代码块");
} // 静态代码块
}
Apple
package com.jachie.Food;
import com.jachie.NewPro;
public class Apple {
public static void main(String[] args) {
NewPro np = new NewPro();
np.NewPro();
}
}
输出
静态代码块
构造代码块
构造方法——顺序代码块
注意
静态代码块无论声明多少对象都执行一次
构造代码块声明一个对象执行一次
顺序代码块,调用一次执行一次
仅希望执行一次的程序就可以放到静态代码块里
练习
创建类
Code
,类中编写构造块、静态块以及构造方法
创建CodeBlock
,类中编写构造块、静态块以及构造方法
在主函数中测试他们的执行顺序
要求显示效果如下
CodeBlock静态块
CodeBlock的主方法
产生Code的实例对象
CodeBlock静态块
CodeBlock构造块
CodeBlock构造方法
产生CodeBlock的实例对象
CodeBlock构造块
CodeBlock构造方法
...
...
答案在下方
答案
Code
package com.jachie.stac;
public class Code {
public Code() {
System.out.println("CodeBlock构造方法");
}
{
System.out.println("CodeBlock构造块");
}
static{
System.out.println("CodeBlock静态块");
}
}
CodeBlock
package com.jachie.stac;
public class CodeBlock {
public CodeBlock() {
System.out.println("CodeBlock构造方法");
}
{
System.out.println("CodeBlock构造块");
}
static{
System.out.println("CodeBlock静态块");
}
public static void main(String[] args) {
System.out.println("CodeBlock的主方法");
System.out.println("产生Code的实例对象");
Code c = new Code();
System.out.println("产生CodeBlock的实例对象");
CodeBlock cb = new CodeBlock();
}
}
```n