目录
package、import
访问控制权限
package、import
- java语言中的package和import机制:
1、为什么要使用package?
package是java中包机制。包机制的作用是为了方便程序的管理。不同功能的类分别放在不同的包下。
(按照功能划分的,不同的包具有不同的功能)
2、package怎么用?
package是一个关键字,后面加包名。例如:
package com.javase.day1206;
注意:package语句只允许出现在java源代码的第一行
3、包名有没有命名规范? 有
一般采用公司域名倒序的方式(因为公司域名具有全球唯一性。)
包名命名规范:
公司域名倒序 + 项目名 + 模块名 + 功能名
4、对于带有package的java程序怎么编译?怎么运行?
采用之前的编译和运行 不行了
类名不再是HelloWorld了
类名:com.javase.day1206.HelloWorld
用文本编辑器编写的带包文件的编译运行:
在编写当前文件的地址栏cmd直接进入dos界面,然后编译,然后输入以下命令运行
不能用之前那种切换目录的方式。使用这种方式直接生成包的目录,直接编译不生成目录且无法运行。
运行时也要在编写java文件的文件夹cmd然后运行,不能切换到class文件所在位置运行。
编译:
javac -d . HelloWorld.java
javac 负责编译的命令
-d 带包编译
. 代表编译之后生成的东西放到当前目录下(.代表当前目录)
HelloWorld.java 被编译的java文件
运行:
java 完整类名 —— java com.javase.day1206.HelloWorld
注意:
带包名描述的类名(完整类名) : java.util.Scanner
不带包名描述的(简类名) : Scanner
用idea时右键src新建包:com.javase.day1206
生成包之后右键new class,然后取名,然后运行即可。
5、关于import的使用: 两个类不在同一个包中的时候,其中一个类使用了另一个类,此时需要使用import(导包)
import什么时候使用?
A类中使用B类
A类和B类都在同一个包下,不需要使用import
A类和B类不在同一个包下,需要使用import
注意:
java.lang包下的类都不需要导包(但是这个包的子包需要导)。相当于:java.lang.*;在每个类中默认有。
import怎么用?
import语句只能出现在package语句之下,class声明语句之上
import语句还可以采用*的方式.
例:
import com.javase.day1206.HelloWorld;可以使用:
import com.javase.day1206.*;
疑问: import com.javase.day1206.*; 这样是不是效率比较低?
不是!编译器编译时会把*变为具体的类名。但是要注意:这里的*只代表某些类的名字。
不要想着用 import Java *; 或import *; 把所有的类导入进来。这样是不现实的。
package com.javase.day1206;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("HelloWorld");
}
}
- 同一个包中import可以省
package com.javase.day1206;
public class Text01 {
public static void main(String[] args) {
//创建HelloWorld对象
com.javase.day1206.HelloWorld hw = new com.javase.day1206.HelloWorld();
System.out.println(hw);//com.javase.day1206.HelloWorld@1b6d3586
//包名可以省略吗?
//思考:这里的包名之所以可以省略,是因为这两个类在同一个包中。
HelloWorld hw2 = new HelloWorld();
System.out.println(hw2);//com.javase.day1206.HelloWorld@4554617c
}
}
- 不同包的两个类,一个类中要使用另一个类中的东西,必须有import
package com;
//import com.javase.day1206.HelloWorld;
//import还可以采用*的方式
import com.javase.day1206.*;
public class Text02 {
public static void main(String[] args) {
/*
HelloWorld hw = new HelloWorld();
System.out.println(hw);
没有导包之前,编译报错:
Error:(6, 9) java: 找不到符号
符号: 类 HelloWorld
位置: 类 com.Text02
原因:Text02在com包下,HelloWorld在com.javase.day1206包下
不在同一个paceage下,包名不可以省略。
*/
/*想要编译通过,必须这样:
com.javase.day1206.HelloWorld hw = new com.javase.day1206.HelloWorld();
System.out.println(hw);
com.javase.day1206.HelloWorld hw2 = new com.javase.day1206.HelloWorld();
System.out.println(hw2);
com.javase.day1206.HelloWorld hw3 = new com.javase.day1206.HelloWorld();
System.out.println(hw3);
com.javase.day1206.HelloWorld@1b6d3586
com.javase.day1206.HelloWorld@4554617c
com.javase.day1206.HelloWorld@74a14482
*/
//虽然上面那样可以运行,但是每次这样写太麻烦了,所以这里就需要用到import 将需要用到的类导入进来。
//import com.javase.day1206.HelloWorld;
//包名.类名 就是带包的类的新名字。
HelloWorld hw1 = new HelloWorld();
System.out.println(hw1);
}
}
- 解释之前接收键盘输入时使用的java.util.Scanner ,以及使用java.lang.下所有的类都不需要导
package com.javase.day1206;
//第二种方法:使用import导包
//import java.util.Scanner;
//也可以使用*的方式导包
import java.util.*;
public class Text03 {
public static void main(String[] args) {
//为什么要这样写?
//因为Text03与Scanner这两个类不在同一个包中,在Text03中使用Scanner类中的东西
//第一种方法:需要在前面加Scanner类的包名:java.util
//java.util.Scanner s = new java.util.Scanner(System.in);
//导包之后使用时,类名前就不用加包名了。
Scanner s = new Scanner(System.in);
String str = s.next();
System.out.println("您输入的字符串为:"+str);
//String类为什么不需要导包就可以使用?
//因为String类在java.lang包下,这个包下的所有类都不需要导包就可以使用!
java.lang.String name = "张三";
System.out.println("名字是:"+name);
java.lang.String userName = "李四";
System.out.println("用户名是:"+userName);
}
}
访问控制权限
访问控制权限有几个,控制范围以及修饰什么?
1、访问控制权限有4个:
public 公开的
private 私有的
protected 受保护的
什么都不加 默认的
2、访问控制权限各自的控制范围:
public : 表示公开的,任何位置都可以访问
private: 表示私有的,只能在本类中访问
“默认” : 只能在本类、同包 访问
protected : 本类、同包、子类中访问
访问控制权限 本类 同包 子类 任意位置
--------------------------------------------------------------------------
public 可以 可以 可以 可以
protected 可以 可以 可以 X
默认 可以 可以 X X
private 可以 X X X
默认范围从大到小排序:public > protected > 默认 > private
3、访问控制权限符可以修饰什么?
属性、方法 。 (四个都可以修饰)
类、接口 。 (public 和 默认。其他的不能修饰)
本类的 访问控制权限符可以修饰什么东西
package com;
public class User{
//私有的
private int id;
//受保护的
protected int age;
//公开的
public int weight;
//什么都不加:默认的
String name;
//本类
public static void main(String[] args) {
User u = new User();
System.out.println(u.id);
System.out.println(u.age);
System.out.println(u.weight);
System.out.println(u.name);
}
//方法
public void m1(){}
private void m2(){}
protected void m3(){}
void m4(){}
//静态的也可以,访问控制权限与是否静态无关
public static void a(){}
private static void b(){}
protected static void c(){}
static void d(){}
}
//Error: 此处不允许使用修饰符private
//private class MyClass1{}
//Error: 此处不允许使用修饰符protected
//protected class MyClass2{}
同包的
//同包
package com;
public class Text1 {
public static void main(String[] args) {
User u = new User();
//Error: id 在 User 中是 private 访问控制
//System.out.println(u.id);
System.out.println(u.age);
System.out.println(u.weight);
System.out.println(u.name);
}
}
不同包中
//不同包中
package com.javase;
import com.User;
public class Text2 {
public static void main(String[] args) {
User u = new User();
//Error: age 在 com.User 中是 protected 访问控制
//System.out.println(u.age);
//公开的,在哪里都可以使用
System.out.println(u.weight);
//Error: name在com.User中不是公共的; 无法从外部程序包中对其进行访问
//System.out.println(u.name);
}
}
子类中
//不同包,子类
package com.javase.day1206;
import com.User;
//User在com包下,Vip在com.javase.day1206包下,两个类不在同一个包下。
//但是Vip是User的子类。
public class Vip extends User{
public static void main(String[] args) {
}
//实例方法
public void shopping(){
//this表示当前对象
//编译通过
System.out.println(this.age);
//Error: name在com.User中不是公共的; 无法从外部程序包中对其进行访问
//System.out.println(this.name);
}
}