包、类、访问权限(笔记14)

包、类、访问权限

一、包

如果执行一个带包名的类,要 java 包名.类名(cmd)
1)包声明
  package 包名;  =>package lession1;
2)导包  //要引用不在同一个包下的类
  import 包名
3)同一个源文件中的类,都是在同一个包下的,互相引用,可以不用导包
4)aaa.bbb.ccc 和  aaa.bbb 之间,我们可以认为是两个完全不同的包,没有任何从属关系
  //请参照视频中的例子
  import aaa.A;
  import aaa.bbb.B;
  import aaa.bbb.ccc.C;

public class Teacher {
public static void main(String[] args) {
A a=new A();
B b=new B();
C c=new C();
}
}
5) 如果一个类,声明的时候,带了包名,则它必须放在和包名对应的文件夹层次中
         而且经过编译的字节码文件,也要放在这样的文件夹层次中     
6) 如果编译的时候,想生成对应的文件夹层次,可以使用 
         javac -d . Cat.java      
7) 如果以后在开发中,发现类找不到,可能有几方面原因:
         类名写错了
         包名写错了
         classpath设置错了   
8) java.lang 包下的类使用的时候不用导包

二、classpath

以前学过的 path 表示可执行的工具所在的路径
  classpath 表示要被执行的类所在的路径 (类路径)
  
  设置classpath 的命令 :
  set classpath= d:/;c:/xxx;d:/java/bin;
  
  以前我们学的path 它的查找规律是: 先在当前目录下找,找不到,再去path指定的路径中去找
  classpath 它是先在我们指定的路径去找,找不到,是不是在当前目录下寻找?不好说
  
  set classpath=E:/     //表示在E: 下找,找不到就算了
  set classpath=E:/;    //表示在E: 下找,找不到,再到当前目录找
  
  如果明确的想指定要在当前目录下找,可以用.表示
  set classpath=.;E:/
 
  注意: 等号前后,千万不要有空格,不要用中文
  
  在命令提示符下查看classpath  => set classpath 

三、访问权限

不同包中的类要想访问,则被访问的类,必须声明为public类型的,类不能被private ,protected 修饰
-- public 被它修饰的类,属性,方法,不仅可以跨类访问,而且可以跨包(package)访问
-- private 可以修饰数据成员,构造方法,方法,不能修饰类,被它修饰的成员只能被本类自已访问,不能被子类访问
-- protected 可以修饰数据成员,构造方法,方法,不能修饰类,能被本类,同包,或其子类成员访问(如果是子类,可以跨包)
-- default 不加任何修饰符,只允许同一个包中进行访问

//例一 同一个包的情况
class Dog {
public void publicMethod(){
System.out.println("publicMethod");
}
protected void protectedMethod(){
System.out.println("protectedMethod");
}
void defaultMethod(){
System.out.println("defaultMethod");
}
private void privateMethod(){
System.out.println("privateMethod");
}
}

//注意,是同一个包中
class T{
public static void main(String[] args) {
Dog dog=new Dog();
dog.publicMethod();
dog.protectedMethod();
dog.defaultMethod();
// dog.privateMethod();  //不可以
}
}

//例二 不是同一个包的情况
package cat;
import dog.Dog;
class Cat {
void test(){
  Dog dog=new Dog(); //Dog 和 cat在不同的包中 ,Dog必须声明为public
  dog.publicMethod();
// dog.protectedMethod(); //不可以了 protected不可以跨包访问
// dog.defaultMethod(); //不可以
// dog.private(); //更更不可以了
}
}

//继承自Dog ,而且不是同一个包
class NiceDog extends Dog{
void test(){
Dog dog=new Dog(); 
dog.publicMethod();
protectedMethod(); //可以
//defaultMethod(); 不可以
//dog.protectedMethod(); 不可以
//dog.defaultMethod(); 不可以
//dog.private(); 不可以
}
}

四、jar包

java中的jar文件 ,装的是 .class 文件
就是一种压缩,和zip兼容
称为jar包
很多类,把这些类和他们的目录一起压缩到一个文件中给别人,显得专业不零散了
别人拿到这个jar包之后,只要让他的classpath 的设置中包含 这个jar文件,java虚拟机,在装载类的时候,就会自动解压这个jar文件,
将其当成目录,然后在目录中查找我们所要的类及类的包名和所对应的目录的结构
jdk提供的许多类,也是以jar的形式提供的

打jar 包用的命令是
=> jar -cvf myutil.jar cn
-c 创建新的文档
-v 指输出一些详细信息
-f 指定文件名
cn 指的是.class文件所在的最顶层目录

五、finalize方法

它是Object 类中的方法
它在对象被垃圾回收器回收的时候,被调用 
  
public class Test extends Object {
public static void main(String[] args) {
Student stu=new Student();
stu=null;
System.gc();  //唤起垃圾回收器工作 ,这时会输出  "啊...我game over了" 这句话
System.out.println("over");
}
}

class Student{
int age;
protected void finalize() throws Throwable {
System.out.println("啊...我game over了");
}
}

六、其它记录

1、请说出作用域public,private,protected,以及不写时的区别
private:只能在本类中使用,出类体不可以
public:咋的都行
default:同包下可以,不同包不能访问,子类也不行
protected:同包下可以,不同包不能访问,子类及夸包的子类也可以但是不能直接对象调用,而是继承方法后直接调用-例:protectedMethod();

2、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承普通类(concrete class)? 
   抽象类中是否可以有静态的main方法?
答案:接口可以继承接口。抽象类可以实现(implements)接口,抽象类可以继承普通类。抽象类中可以有静态的main方法。
备注:只要明白了接口和抽象类的本质和作用,这些问题都很好回答,你想想,如果你是java语言的设计者,你是否会提供这样的支持,
如果不提供的话,有什么理由吗?如果你没有道理不提供,那答案就是肯定的了。
  //只要记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法。

3、GC是什么? 为什么要有GC?
   GC是垃圾收集的意思(Gabage Collection)
   忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃
   Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,
   Java语言没有提供释放已分配内存的显示操作方法。
   
4、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 
     对于GC来说,当对象创建时,GC就开始监控这个对象的地址、大小以及使用情况。
     通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",
     哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。
     可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。 
     
5、下面的程序执行是否有错 
class T {
    final int i;  //错在这,应该初始化(或在构造函数里初始化)
    public void test() {
        System.out.println("i = " + i);
    }
}


猜你喜欢

转载自blog.csdn.net/weixin_41205479/article/details/80088670