一、包
1、包是什么?
-
包是用来分门别类的管理各种不同类的,类似于文件夹、创建包利于程序的管理和维护。
-
创建包的语法格式:
package 公司域名倒写.技术名称; // 包名建议是全部英文小写,且具备意义 package com.app.javabean; // 包名建议是全部英文小写,且具备意义 public class Student{ }
-
创建包语句必须在第一行,一般IDEA工具会帮助创建。
2、导包
-
相同包下的类可以直接访问,但是不同包下的类必须导包,才可以访问使用!
-
假如一个类中需要用到不同包下相同类名的类时,那么默认只能导入一个类,另一个类要使用包名访问
-
导包的语法格式:
import 包名.类名;
package com.app.d1_package.test;
/**
学生类:用于测试在不同包下的类,需导包后才可使用
*/
public class Student {
public static String name = "不同包下的类";
}
package com.app.d1_package;
/**
老师类:用于测试在相同包下的类,可以直接互相使用
*/
public class Teacher {
public static String name = "相同包下的类";
}
package com.app.d1_package.test2;
/**
学生类:用于测试使用不同包下相同类名的类,此时默认只能导入一个类的包,另一个类要使用包名访问。
*/
public class Student {
public static String name = "使用不同包下相同类名的Student类";
}
package com.app.d1_package;
// 导包
import com.app.d1_package.test.Student; // 学生类
import java.util.Scanner; // 扫描器对象
/**
测试类
目标:理解以下注意点:
*/
public class PackageTest {
public static void main(String[] args) {
// 1、同一个包下的类,可以直接互相访问。
System.out.println(Teacher.name);
// 2、不同包下的类,必须先导包才可以访问。
System.out.println(Student.name);
// 3、当然,你调用Java写好的API的时候,也是需要导包的。
Scanner sc = new Scanner(System.in);
/*
4、如果这个类中使用不同包下相同类名的类,
此时默认只能导入一个类的包,另一个类要使用包名访问。
*/
System.out.println(com.app.d1_package.test2.Student.name);
}
}
3、IDEA工具配置自动导包
二、权限修饰符
1、权限修饰符是什么?
- 权限修饰符:是用来控制一个成员能够被访问的范围。
- 可以修饰成员变量、方法、构造器、内部类,不同权限修饰符 修饰的成员能够被访问的范围也会受到限制。
2、权限修饰符的分类和作用范围
- 权限修饰符有四种:
- private
- 缺省:指的是没有修饰符
- protected
- public
- 作用范围由小到大:private —> 缺省 —> protected —> public
修饰符 | 同一个类中 | 同一个包中其他类 | 不同包下的子类 | 不同包下的无关类 |
---|---|---|---|---|
private | ok | |||
缺省 | ok | ok | ||
protected | ok | ok | ok | |
public | ok | ok | ok | ok |
package com.app.d2_purview_modifier;
/**
本类:父类——>定义全部的权限修饰符修饰的成员
目标:理解权限修饰符,将成员修饰后的作用范围
*/
public class Fu {
/**
1、private修饰的方法:只能在本类中可以访问
*/
private void privateMethod() {
System.out.println("---private修饰的成员---");
}
/**
2、缺省的方法:在本类、同包下的其他类中都可以访问
*/
void method() {
System.out.println("---缺省(无修饰)的成员---");
}
/**
3、protected修饰的方法:在本类、同包下的其他类、其他包下的子类中都可以访问
*/
protected void protectedMethod() {
System.out.println("---protected修饰的成员---");
}
/**
4、public修饰的方法:在本类、同包下的其他类、其他包下的子类、其他包下的无关类中都可以访问
*/
public void publicMethod() {
System.out.println("---public修饰的成员---");
}
public static void main(String[] args) {
// 在本类中测试所有权限修饰符,修饰后的作用范围
Fu f = new Fu();
// 结论:所有权限修饰符修饰后的成员,在本类中都可以访问
f.privateMethod();
f.method();
f.protectedMethod();
f.publicMethod();
}
}
---private修饰的成员---
---缺省(无修饰)的成员---
---protected修饰的成员---
---public修饰的成员---
Process finished with exit code 0
package com.app.d2_purview_modifier;
/**
同包下的其他类
目标:理解权限修饰符,将成员修饰后的作用范围
*/
public class PurviewModifierTest {
public static void main(String[] args) {
// 在同包下的其他类中测试所有权限修饰符,修饰后的作用范围
Fu f = new Fu();
//
/*
结论:private修饰的成员,在同包下的其他类中无法访问,
缺省、protected、public修饰的成员都可以访问
*/
// f.privateMethod(); // 报错
f.method();
f.protectedMethod();
f.publicMethod();
}
}
---缺省(无修饰)的成员---
---protected修饰的成员---
---public修饰的成员---
Process finished with exit code 0
package com.app.d2_purview_modifier.test;
import com.app.d2_purview_modifier.Fu;
/**
其他包下的子类
目标:理解权限修饰符,将成员修饰后的作用范围
*/
public class Zi extends Fu {
public static void main(String[] args) {
// 在其他包下的子类中测试所有权限修饰符,修饰后的作用范围
Zi z = new Zi(); // 因为子类继承了父类,所以使用子类的构造器来构建对象
/*
结论:private、缺省修饰的成员,在其他包下的子类中无法访问,
protected、public修饰的成员都可以访问
*/
// z.privateMethod(); // 报错
// z.method(); // 报错
z.protectedMethod();
z.publicMethod();
System.out.println("-----------");
// 注意点!!子类继承了父类,不要使用父类的构造器来构建对象
Fu f = new Fu();
// f.privateMethod(); // 报错
// f.method(); // 报错
// f.protectedMethod(); // 报错
f.publicMethod();
}
}
---protected修饰的成员---
---public修饰的成员---
-----------
---public修饰的成员---
Process finished with exit code 0
package com.app.d2_purview_modifier.test;
import com.app.d2_purview_modifier.Fu;
/**
其他包下的无关类
目标:理解权限修饰符,将成员修饰后的作用范围
*/
public class unrelated {
public static void main(String[] args) {
// 在其他包下的无关类中测试所有权限修饰符,修饰后的作用范围
Fu f = new Fu();
/*
结论:private、缺省、protected修饰的成员在其他包下的无关类中,都无法访问,
只有public修饰的成员可以访问
*/
// f.privateMethod(); // 报错
// f.method(); // 报错
// f.protectedMethod(); // 报错
f.publicMethod();
}
}
---public修饰的成员---
Process finished with exit code 0
3、学完权限修饰符需具备的能力
- 能够识别其他人定义的成员的访问范围;
- 自己定义成员(变量、方法、构造器等)一般需满足如下要求:
- 成员变量一般私有化;
- 成员方法一般公开化;
- 如果该成员只希望在本类访问,使用private修饰;
- 如果该成员只希望在本类、同一个包下的其他类和子类访问,使用protected修饰;
4、知识总结
1、权限修饰符是什么?
- 是用来控制一个成员(变量、方法、构造器等)能够被访问的范围。
- 有四种作用范围由小到大:private—>缺省—>protected—>public。
三、final关键字
1、final是什么?
- final关键字是最终的意思,可以修饰(类、方法、变量);
2、final的作用
- 修饰类:表明该类是最终类,不能被继承;
- 修饰方法:表明该方法是最终方法,不能被重写;
-
修饰变量:表明该变量第一次赋值后,不能再次被赋值(有且仅能被赋值一次)。
- 修饰局部变量
- 修饰局部变量
- 修饰静态变量
- 修饰实例成员变量
3、final修饰变量的注意点
-
final修饰的变量是基本类型:那么这个变量存储的数据值不能发生改变。
-
final修饰的变量是引用类型:那么这个变量存储的地址值不能发生改变,但是地址指向的对象内容是可以发生改变的。
四、常量
1、常量是什么?
-
常量是使用了 public static final修饰的成员变量,必须有初始值,而且执行过程中其值不能改变。
-
常量的作用和好处:可以用于做系统的配置信息,方便程序的维护,同时也能提高可读性。
2、常量命名规范
-
英文单词全部大写,多个单词用下划线连接起来。
public class Constant { public static final String SCHOOL_NAME = "b站大学"; public static final String USER_NAME = "admin"; public static final String PASS_WORD = "123456"; }
3、常量的执行原理
-
在编译阶段会进行 “宏替换”,把使用常量的地方全部替换成真实的字面量。
-
这样做的好处是让使用常量的程序的执行性能与直接使用字面量是一样的。
4、常量概述总结
1、常量是什么?什么作用?
- 常量是使用了public static final修饰的成员变量,必须有初始值,并且有仅能赋值一次,执行过程中不可改变
- 可以用于做系统的配置信息,一处更改,处处生效:方便程序的维护,同时也能提高可读性。
5、常量做信息标志和分类
案例说明
- 现在开发的超级玛丽游戏需要接收用户输入的四个方向的信号(上下左右),以便于控制玛丽的移动方向。
选择常量做标志和分类:
-
代码可读性好,实现了软编码形式。
package com.app.d4_constant; import javax.swing.*; import java.awt.event.ActionEvent; /** 模拟超级玛丽游戏: 是为了做个药引子,给后面的内容做铺垫,不用纠结代码含义; 只需要知道常量做标志和分类,可以让代码的可读性更好,实现软编码形式。 */ public class ConstantDemo2 { /** 1、定义4个常量,分别代表玛丽的移动:上下左右 */ public static final int UP = 1; // 上 public static final int DOWN = 2; // 下 public static final int LEFT = 3; // 左 public static final int RIGHT = 4; // 右 public static void main(String[] args) { // 2、创建一个窗口对象(桌子) JFrame win = new JFrame(); // 3、创建一个面板对象(桌布) JPanel panel = new JPanel(); // 4、把桌布垫在桌子上 win.add(panel); // 5、创建四个按钮对象:上下左右 JButton btn1 = new JButton("上"); JButton btn2 = new JButton("下"); JButton btn3 = new JButton("左"); JButton btn4 = new JButton("右"); // 6、把按钮对象添加到桌布上 panel.add(btn1); panel.add(btn2); panel.add(btn3); panel.add(btn4); // 7、显示窗口 win.setLocationRelativeTo(null); win.setSize(300, 400); win.setVisible(true); // 8、点击按钮,控制玛丽移动方向 btn1.addActionListener(new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { move(UP); // 让玛丽往上飞 } }); btn2.addActionListener(new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { move(DOWN); // 让玛丽往下蹲 } }); btn3.addActionListener(new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { move(LEFT); // 让玛丽往后跑 } }); btn4.addActionListener(new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { move(RIGHT); // 让玛丽往前跑 } }); } // 9、玛丽移动功能 public static void move(int flag) { switch (flag) { case UP: System.out.println("玛丽往上飞了一下~~~"); break; case DOWN: System.out.println("玛丽往下蹲了一下~~~"); break; case LEFT: System.out.println("玛丽往后跑了一下~~~"); break; case RIGHT: System.out.println("玛丽往前跑了一下~~~"); break; } } }
五、枚举
1、枚举是什么?
- 枚举是Java中的一种特殊类型。
2、枚举的作用
- 是为了做信息的标志和分类。
3、枚举的语法
定义格式:
修饰符 enum 枚举名称 {
第一行都是罗列枚举类实例的名称。
}
enum Season{
SPRING,SUMMER,AUTUMN,WINTER;
}
- 定义枚举类
-
通过反编译后观察枚举的特征
-
反编译:
-
先将枚举类代码复制到一个新的.java文件,放到桌面,文件名还是与类名一样
-
打开命令行窗口,去到此文件路径下用javac命令编译成字节码文件
-
然后再使用javap命令进行反编译,得到以下代码后,可观察到枚举的特征
-
-
4、枚举的特征
- 枚举类都是继承枚举类型:java.lang.Enum;
- 枚举类都是有final修饰为最终类,不能被继承;
- 枚举类的构造器是私有化的,因此枚举对外不能创建对象;
- 枚举的第一行默认都是罗列枚举对象的名称;
- 枚举相当于是多例模式。
5、枚举做信息标志和分类
案例说明:
- 现在开发的超级玛丽游戏需要接收用户输入的四个方向的信号(上下左右),以便于控制玛丽的移动方向。
选择常量做信息标志和分类:
- 虽然可以实现可读性,但是入参不受约束,代码相对不够严谨。
枚举做信息标志和分类:
-
代码可读性好,入参约束严谨,代码优雅,是最好的信息分类技术!建议使用!
-
定义一个枚举类
-
switch配合枚举完成信息的标志和分类
-
这样别人就不可以随便乱传入参数了,即严谨又优雅,可读性又好
-
常量和枚举各有各的用处,看具体场景业务