黑马程序员全套Java教程_Java基础教程_修饰符(十八)
1、包
- 包其实就是文件夹,其作用是对类进行分类管理
- 包的定义格式:
(1)格式:package 包名;(多级包用“.”分开)
(2)范例:package.com.itheima; - 指定了包的java文件如何运行?(手动建包)
如下,我们在文件夹中新建一个HelloWorld.java,通过控制台javac编译后,java命令执行可以正常运行输出语句。然后,我们在类的上面给它指定一个包package com.itheima;
package com.itheima;
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello World!");
}
}
编译后执行,我们发现编译通过了,但是执行的时候报错“找不到或无法加载主类”,这是因为我们指定的包根本就不存在。怎么办呢?这时候我们就要创建包,如图,我们在HelloWorld.java目录下创建com文件夹,再在com文件夹里创建itheima文件夹。然后将HelloWorld.java目录下生成的HelloWorld.class文件剪切到itheima文件夹内,运行命令java com.itheima.HelloWorld,这才执行成功。
- 指定了包的java文件如何运行?(自动建包)
使用命令javac -d . HelloWorld.java编译,使用java com.itheima.HelloWorld运行。
2、导包的概述和使用
- 使用不同包下的类时,要写类的全路径(如调用另一个cn.itcast包的Teacher类时,在对应的方法前要加前缀cn.itcast),这样太麻烦了为了简化带包的操作,Java就提供了导包的功能。
- 导包的格式
(1)格式:import 包名;
(2)范例:import cn.itcast.Teacher
3、修饰符
3.1 修饰符的分类
- 分为权限修饰符和状态修饰符。
3.2 权限修饰符
修饰符 | 当前类 | 同一个包中子类和无关类 | 不同包的子类 | 不同包的无关类 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | |
默认(default) | √ | √ | ||
private | √ |
注意:在protected修饰符中,若子类与基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法(即不可以通过new父类的方式访问,而是通过new子类或者this、super关键字访问)。
- cn.itcast.Fu
public class Fu {
private void show1(){
System.out.println("private");
}
void show2(){
System.out.println("默认");
}
protected void show3(){
System.out.println("protected");
}
public void show4(){
System.out.println("public");
}
public static void main(String[] args){
//创建Fu的对象,测试看有哪些方法可以使用
Fu fu = new Fu();
fu.show1();
fu.show2();
fu.show3();
fu.show4();
}
}
cn.itcast.Zi
public class Zi extends Fu{
public static void main(String[] args){
//创建Fu的对象,测试看有哪些方法可以使用
Zi zi = new Zi();
zi.show2();
zi.show3();
zi.show4();
}
}
cn.itcast.Demo
public class Demo {
public static void main(String[] args) {
Fu fu = new Fu();
fu.show2();
fu.show3();
fu.show4();
}
}
com.itheima.Zi
public class Zi extends Fu {
public static void main(String[] args) {
Zi zi = new Zi();
zi.show3();
zi.show4();
}
}
com.itheima.Demo
public class Demo {
public static void main(String[] args) {
Fu fu = new Fu();
fu.show4();
}
}
面试题:权限修饰符的考察
- 在com.sunyard包下有A、B两个类,在com.sunyard.test包下有C类,三个类中都添加一个private修饰的testPrint()方法(注:假设三个类import都正确),以下描述正确的是()
public class A extends C {
protected String a = "a";
}
public class B {
String b = "b";
}
public class C {
protected String c = "c";
}
private void testPrint(){
System.out.println(new A().a);
System.out.println(new B().b);
System.out.println(new C().c);
}
- 编译错误。在A类中,可以通过new A().c访问到c的值,new C().c是访问不到的。
3.3 状态修饰符
- 状态修饰符分别有两个,分别为final(最终态)和static(静态)
- final关键字是最终的意思,可以修饰成员方法,成员变量和类,其特点:
(1)修饰方法:表示该方法是最终方法,不能被重写。
(2)修饰变量:表示该变量是常量,不能再次被赋值。
(3)修饰类:表示该类是最终类,不能被继承。 - final 修饰局部变量
(1)变量是基本类型:final修饰指的是基本类型的数据值不能发生改变
(2)变量是引用类型:final修饰指的是引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的。 - static关键字是静态的意思,可以修饰成员方法和成员变量,其特点:
(1)被类的所有对象共享,这也是我们判断是否使用静态关键字的条件。
(2)可以通过类名调用,也可以通过对象名调用,但推荐使用类名调用、
(3)未经初始化的全局静态变量会被程序自动初始化为0。 - static访问特点
(1)非静态成员方法:能访问静态的成员变量和成员方法、能访问非静态的成员变量和成员方法。
(2)静态的成员方法:能访问静态的成员变量和静态的成员方法。
面试题:输出的结果是什么?
public class Test {
public int myMethod(){
static int i = 0;
return i++;
}
public static void main(String[] args) {
System.out.println(new Test().myMethod());
}
}
- 编译失败。static关键字只能修饰成员方法和成员变量。