java13面向对象深入
作者:互联网
java13面向对象深入2
大纲
package与import
package
概述
package存在的意义是防止命名冲突造成使用不便。
package类似一个文件夹,文件夹内有各种文件。package与package的附属关系用“.”连接,类似父文件夹中的子文件夹。比如说 java.lang.String就是java文件夹中的lang文件夹中的String文件。java.io.InputStream则是java文件夹中的io文件夹中的InputStream文件。
同一个文件夹内无法存在同名的文件,而不同名的文件夹里允许存在同名文件,因此不同文件夹(即不同package中允许出现相同class名)。
<font color='red'>为了便于管理大型软件系统中数目众多的类,解决类的命名冲突问题,Java 引入包(package)机制,提供类的多重类命名空间。 </font>
格式
一般的命名为:<font color="blue">公司域名倒写+功能名|模块名。</font>
package 语句作为 Java 源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。
package pkg1[.pkg2[.pkg3…]];
例:
package com.java01.test;
Java 编译器把包对应于文件系统的目录管理,package 语句中,用’.’来指明包(目录)的层次,例如使用语句: package com.java01 ,则该文件中所有的类位于.\com\java01 目录下
注意:
- 不要定义与 jdk 相同的包,相同的类,否则会引起很多你觉得莫名其妙的问题
- 写项目时都要加包,不要使用默认包。
- com.oop和com.oop.test,这两个包没有包含关系,是两个完全独立的包。只是逻辑上看起来后者是前者的一部分。
import
如果一个类存在包名,则在其他包下使用该类时,必须使用全额限定名(简称全名或完整类名,com.java01.MyClass),编译器才能找到该类;也可以使用 import 在文件的开头引入要使用到的类。
import java.util.Scanner;
import java.io.*; //模糊匹配当前io包下所有类
public class ImportDemo {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in); //因为使用import关键字导包,可以使用
java.util.ArrayList list=new java.util.ArrayList(); //权限定名
//导入集合 注意:导入是不要导错包
//使用*,模糊匹配
File file=new File("D://test.txt");
InputStream isInputStream=new FileInputStream(file);
}
}
不需要使用 import 的类有:
-
语言包 (java.lang)下的类 (String,System...)
- 同包下的类
静态导入:
import 语句不仅可以导入类,还增加了导入静态方法的功能
//导入静态属性
import static java.lang.Math.PI;
import static java.lang.System.out;
//导入静态方法
import static java.lang.Math.sin;
public class ImportDemo {
public static void main(String[] args) {
out.println(PI);
sin(1.1);
}
}
总结
-
如果想将一个类放入包中,在类的源文件首行使用package
- 必须保证该类的 class 文件位于正确的目录下
- 另外的类想访问的话:
- 写全名
- 引入
- 模糊匹配(会将该包下所有用到的类引入进来),会降低编译速度,但是不会影响运行速度
- 具体类名
- 静态导入
- 同包下的类不需要导入
JDK 中常用的包简单介绍:
-
java.lang –语言包:语言中常用的功能,如:String、Math、System、Integer、Thread…
-
java.util – 工具包:提供一些实用的工具类,如:容器(List、Set、Map…),日期类
-
java.io – 输入输出包:提供操作读取文件的相关类,如:File、InputStream、OutputStream…
-
java.net – 网络包: 操 作 远 程 资 源 的 类 , 如:InetSocketAddress、 DatagramPacket、 ServerSocket…
- java.sql – 数据库包:操作JDBC的类,Connection、Statement、ResultSet….
垃圾回收机制(gc)
概述
Garbage Collection 垃圾回收机制
每个程序员都遇到过内存溢出的情况,程序运行时,内存空间是有限的,那么如何及时的把不再使用的对象清除将内存释放出来,这就是GC要做的事。
说起垃圾回收机制(GC),大部分人都把这项技术当做Java语言的伴生产物。事实上,GC的历史比Java久远,早在1960年Lisp这门语言中就使用了内存动态分配和垃圾回收技术。
程序员们知道,jvm内存结构分为五大区域:程序计数器、虚拟机栈、本地方法栈、堆区、方法区。其中虚拟机栈、本地方法栈与程序计数器这3个区域随线程而生、随线程而灭,因此就不需要考虑过多内存垃圾回收问题,因为一个方法调用结束或者线程结束时,内存自然就跟随着回收了。
我们就把重点放在方法区与堆区,这部分内存的分配和回收是动态的,正是垃圾收集器所需关注的部分。
GC主要做了清理对象,整理内存的工作。
不同语言下对象空间的释放:
-
传统的C/C++语言,需要程序员负责回收已经分配内存。显式回收垃圾回收的缺点:
- 程序忘记及时回收,从而导致内存泄露,降低系统性能。
- 程序错误回收程序核心类库的内存,导致系统崩溃。
-
Java语言不需要程序员直接控制内存回收,是由JRE在后台自动回收不再使用的内存,称为垃圾
回收机制(Garbage Collection)。
- 可以提高编程效率。
- 保护程序的完整性。
- 其开销影响性能。Java虚拟机必须跟踪程序中有用的对象,确定哪些是无用的。
垃圾回收机制关键点:
- 垃圾回收机制只回收JVM堆内存里的对象空间。
- 对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力
- 现在的JVM有多种垃圾回收实现算法,表现各异。
- 垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行。
- 可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象。
- 程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有一些效果,但是系统是否进行垃圾回收依然不确定。
- 垃圾回收机制回收任何对象之前,总会先调用它的finalize方法(如果覆盖该方法,让一个新的引用变量重新引用该对象,则会重新激活对象)。
- 永远不要主动调用某个对象的finalize方法,应该交给垃圾回收机制调用。
标签:java,java13,package,回收,面向对象,深入,垃圾,import,内存 来源: https://blog.51cto.com/14966126/2542623