• 【java进阶03: package和import】及访问控制权限


    目录

    package、import

    访问控制权限


    package、import

    1. java语言中的package和import机制:

      1. 1、为什么要使用package
      2. package是java中包机制。包机制的作用是为了方便程序的管理。不同功能的类分别放在不同的包下。
      3. (按照功能划分的,不同的包具有不同的功能)
      4. 2package怎么用?
      5. package是一个关键字,后面加包名。例如:
      6. package com.javase.day1206;
      7. 注意:package语句只允许出现在java源代码的第一行
      8. 3、包名有没有命名规范? 有
      9. 一般采用公司域名倒序的方式(因为公司域名具有全球唯一性。)
      10. 包名命名规范:
      11. 公司域名倒序 + 项目名 + 模块名 + 功能名
      12. 4、对于带有package的java程序怎么编译?怎么运行?
      13. 采用之前的编译和运行 不行了
      14. 类名不再是HelloWorld了
      15. 类名:com.javase.day1206.HelloWorld
      16. 用文本编辑器编写的带包文件的编译运行:
      17. 在编写当前文件的地址栏cmd直接进入dos界面,然后编译,然后输入以下命令运行
      18. 不能用之前那种切换目录的方式。使用这种方式直接生成包的目录,直接编译不生成目录且无法运行。
      19. 运行时也要在编写java文件的文件夹cmd然后运行,不能切换到class文件所在位置运行。
      20. 编译:
      21. javac -d . HelloWorld.java
      22. javac 负责编译的命令
      23. -d 带包编译
      24. . 代表编译之后生成的东西放到当前目录下(.代表当前目录)
      25. HelloWorld.java 被编译的java文件
      26. 运行:
      27. java 完整类名 —— java com.javase.day1206.HelloWorld
      28. 注意:
      29. 带包名描述的类名(完整类名) : java.util.Scanner
      30. 不带包名描述的(简类名) : Scanner
      31. 用idea时右键src新建包:com.javase.day1206
      32. 生成包之后右键new class,然后取名,然后运行即可。
      33. 5、关于import的使用: 两个类不在同一个包中的时候,其中一个类使用了另一个类,此时需要使用import(导包)
      34. import什么时候使用?
      35. A类中使用B类
      36. A类和B类都在同一个包下,不需要使用import
      37. A类和B类不在同一个包下,需要使用import
      38. 注意:
      39. java.lang包下的类都不需要导包(但是这个包的子包需要导)。相当于:java.lang.*;在每个类中默认有。
      40. import怎么用?
      41. import语句只能出现在package语句之下,class声明语句之上
      42. import语句还可以采用*的方式.
      43. 例:
      44. import com.javase.day1206.HelloWorld;可以使用:
      45. import com.javase.day1206.*;
      46. 疑问: import com.javase.day1206.*; 这样是不是效率比较低?
      47. 不是!编译器编译时会把*变为具体的类名。但是要注意:这里的*只代表某些类的名字。
      48. 不要想着用 import Java *; 或import *; 把所有的类导入进来。这样是不现实的。
      1. package com.javase.day1206;
      2. public class HelloWorld {
      3. public static void main(String[] args) {
      4. System.out.println("HelloWorld");
      5. }
      6. }
    2. 同一个包中import可以省

      1. package com.javase.day1206;
      2. public class Text01 {
      3. public static void main(String[] args) {
      4. //创建HelloWorld对象
      5. com.javase.day1206.HelloWorld hw = new com.javase.day1206.HelloWorld();
      6. System.out.println(hw);//com.javase.day1206.HelloWorld@1b6d3586
      7. //包名可以省略吗?
      8. //思考:这里的包名之所以可以省略,是因为这两个类在同一个包中。
      9. HelloWorld hw2 = new HelloWorld();
      10. System.out.println(hw2);//com.javase.day1206.HelloWorld@4554617c
      11. }
      12. }
    3. 不同包的两个类,一个类中要使用另一个类中的东西,必须有import

      1. package com;
      2. //import com.javase.day1206.HelloWorld;
      3. //import还可以采用*的方式
      4. import com.javase.day1206.*;
      5. public class Text02 {
      6. public static void main(String[] args) {
      7. /*
      8. HelloWorld hw = new HelloWorld();
      9. System.out.println(hw);
      10. 没有导包之前,编译报错:
      11. Error:(6, 9) java: 找不到符号
      12. 符号: 类 HelloWorld
      13. 位置: 类 com.Text02
      14. 原因:Text02在com包下,HelloWorld在com.javase.day1206包下
      15. 不在同一个paceage下,包名不可以省略。
      16. */
      17. /*想要编译通过,必须这样:
      18. com.javase.day1206.HelloWorld hw = new com.javase.day1206.HelloWorld();
      19. System.out.println(hw);
      20. com.javase.day1206.HelloWorld hw2 = new com.javase.day1206.HelloWorld();
      21. System.out.println(hw2);
      22. com.javase.day1206.HelloWorld hw3 = new com.javase.day1206.HelloWorld();
      23. System.out.println(hw3);
      24. com.javase.day1206.HelloWorld@1b6d3586
      25. com.javase.day1206.HelloWorld@4554617c
      26. com.javase.day1206.HelloWorld@74a14482
      27. */
      28. //虽然上面那样可以运行,但是每次这样写太麻烦了,所以这里就需要用到import 将需要用到的类导入进来。
      29. //import com.javase.day1206.HelloWorld;
      30. //包名.类名 就是带包的类的新名字。
      31. HelloWorld hw1 = new HelloWorld();
      32. System.out.println(hw1);
      33. }
      34. }
    4. 解释之前接收键盘输入时使用的java.util.Scanner ,以及使用java.lang.下所有的类都不需要导

      1. package com.javase.day1206;
      2. //第二种方法:使用import导包
      3. //import java.util.Scanner;
      4. //也可以使用*的方式导包
      5. import java.util.*;
      6. public class Text03 {
      7. public static void main(String[] args) {
      8. //为什么要这样写?
      9. //因为Text03与Scanner这两个类不在同一个包中,在Text03中使用Scanner类中的东西
      10. //第一种方法:需要在前面加Scanner类的包名:java.util
      11. //java.util.Scanner s = new java.util.Scanner(System.in);
      12. //导包之后使用时,类名前就不用加包名了。
      13. Scanner s = new Scanner(System.in);
      14. String str = s.next();
      15. System.out.println("您输入的字符串为:"+str);
      16. //String类为什么不需要导包就可以使用?
      17. //因为String类在java.lang包下,这个包下的所有类都不需要导包就可以使用!
      18. java.lang.String name = "张三";
      19. System.out.println("名字是:"+name);
      20. java.lang.String userName = "李四";
      21. System.out.println("用户名是:"+userName);
      22. }
      23. }

    访问控制权限

    访问控制权限有几个,控制范围以及修饰什么?

    1. 1、访问控制权限有4个:
    2. public 公开的
    3. private 私有的
    4. protected 受保护的
    5. 什么都不加 默认的
    6. 2、访问控制权限各自的控制范围:
    7. public : 表示公开的,任何位置都可以访问
    8. private: 表示私有的,只能在本类中访问
    9. “默认” : 只能在本类、同包 访问
    10. protected : 本类、同包、子类中访问
    11. 访问控制权限 本类 同包 子类 任意位置
    12. --------------------------------------------------------------------------
    13. public 可以 可以 可以 可以
    14. protected 可以 可以 可以 X
    15. 默认 可以 可以 X X
    16. private 可以 X X X
    17. 默认范围从大到小排序:public > protected > 默认 > private
    18. 3、访问控制权限符可以修饰什么?
    19. 属性、方法 。 (四个都可以修饰)
    20. 类、接口 。 (public 和 默认。其他的不能修饰)

    本类的 访问控制权限符可以修饰什么东西

    1. package com;
    2. public class User{
    3. //私有的
    4. private int id;
    5. //受保护的
    6. protected int age;
    7. //公开的
    8. public int weight;
    9. //什么都不加:默认的
    10. String name;
    11. //本类
    12. public static void main(String[] args) {
    13. User u = new User();
    14. System.out.println(u.id);
    15. System.out.println(u.age);
    16. System.out.println(u.weight);
    17. System.out.println(u.name);
    18. }
    19. //方法
    20. public void m1(){}
    21. private void m2(){}
    22. protected void m3(){}
    23. void m4(){}
    24. //静态的也可以,访问控制权限与是否静态无关
    25. public static void a(){}
    26. private static void b(){}
    27. protected static void c(){}
    28. static void d(){}
    29. }
    30. //Error: 此处不允许使用修饰符private
    31. //private class MyClass1{}
    32. //Error: 此处不允许使用修饰符protected
    33. //protected class MyClass2{}

    同包的

    1. //同包
    2. package com;
    3. public class Text1 {
    4. public static void main(String[] args) {
    5. User u = new User();
    6. //Error: id 在 User 中是 private 访问控制
    7. //System.out.println(u.id);
    8. System.out.println(u.age);
    9. System.out.println(u.weight);
    10. System.out.println(u.name);
    11. }
    12. }

    不同包中

    1. //不同包中
    2. package com.javase;
    3. import com.User;
    4. public class Text2 {
    5. public static void main(String[] args) {
    6. User u = new User();
    7. //Error: age 在 com.User 中是 protected 访问控制
    8. //System.out.println(u.age);
    9. //公开的,在哪里都可以使用
    10. System.out.println(u.weight);
    11. //Error: name在com.User中不是公共的; 无法从外部程序包中对其进行访问
    12. //System.out.println(u.name);
    13. }
    14. }

    子类中

    1. //不同包,子类
    2. package com.javase.day1206;
    3. import com.User;
    4. //User在com包下,Vip在com.javase.day1206包下,两个类不在同一个包下。
    5. //但是Vip是User的子类。
    6. public class Vip extends User{
    7. public static void main(String[] args) {
    8. }
    9. //实例方法
    10. public void shopping(){
    11. //this表示当前对象
    12. //编译通过
    13. System.out.println(this.age);
    14. //Error: name在com.User中不是公共的; 无法从外部程序包中对其进行访问
    15. //System.out.println(this.name);
    16. }
    17. }
  • 相关阅读:
    Ubuntu上安装Chrome浏览器
    天天被开发怼?4个方法区分bug前后端归属,我再也不背锅了!
    区块链技术的应用场景和优势
    数据库总结
    基于Spring Boot的考研资讯平台设计与实现
    内核宕机自救
    IEEE1588v2解析(5)--PTP的传输方式
    使用 Spring Data MongoDB 连接到多个数据库
    中通IM测试实践
    产品经理如何有效跟进开发进度?
  • 原文地址:https://blog.csdn.net/m0_69066786/article/details/127963484