目录

package、import

访问控制权限


package、import

  1. 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");
    }
}
  1. 同一个包中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
    }
}
  1. 不同包的两个类,一个类中要使用另一个类中的东西,必须有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);
    }
}
  1. 解释之前接收键盘输入时使用的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);
    }
}