前言
本人目前大二,数学专业,此前仅接触过一点的C++与Matlab
此博客采取自行学习+总结的方式,记录Java自学过程。
(因此可能会出现一些理解不恰当的问题,望交流告知)
-
package(包)
-一般针对解决如下问题:
(1)目录中重名文件处理问题;
例如:张三把一个命名为A.class的文件放入服务器,李四也放了一个命名为A.class的文件放入服务器,新文件往往会覆盖旧文件,因此可见重名文件可能会造成冲突。
(2)一个项目中class文件繁多,统一维护困难;
若干程序类属于同一核心功能,若需更新则可能要同时进行多个文件的替换,过于繁琐。
-针对上述问题,引入package,实现程序结构化的整体拆分(例如按功能分区分块等);并将每个包视为一个文件目录,不同文件目录下即可保存相同的程序文件名称。
-定义包的方法与注意事项:
package 包名;
当包中有包时,包名间使用"."连接:
package 包名1.包名2.....;
例如:定义一个叫HelloWorld的类,将其放入com.pancake包中:
package com.pancake;
public class HelloWorld{
...
}
其中,com是最外层的包,pancake是最内层的包,之间具有附属关系。
-Attention:
(1)包名必须全小写;
(2)package语句为Java源文件的第一条语句;
(3)类前无package语句,说明该类为缺省无包名;
-
import
考虑到包实现了程序结构化的整体拆分,其后在使用过程中必然存在程序类之间互相访问(调用)的情况(简单来说就是有时候需要引用外部的类),因此引入import语句实现导包的处理需求。
-基本语法格式为:
import语句位于package语句后,所有类的定义前,可有可无。
import 包名1[.包名2...].(类名|*);
-两种导入声明:
(1)单类型导入
例如:引入java.util包中的ArrayList类
import java.util.ArrayList;
(2)按需求类型导入
例如:按需求引入java.util包中的全部类
import java.util.*;
两者的区别在于,按需求类型导入通过通配符"*"定义其导入方式。例如上述import java.util.ArrayList指引用java.util中的ArrayList类,而import java.util.*指可以导入包java.util下的所有类(即需要时导入,不需要就不导入)。
-Attention:
(1)import语句导入前提:必须是类型属于public的类;
(2)当使用多个import语句按需求类型导入多个包时,如果多个包内存在重复命名的类,编译器则无法确定用哪一包里面的类,会出现异常命名冲突。因此此时只能使用单类型导入。
(3)导入的包与自己新建的类名若相同也会引起错误,新建类名时应该避免此种情况。
(4)import不会将导入声明的类写入class文件中,依旧独立使用class文件。
(5)导入了不需要的类最终会被编译器优化,不会出现在class文件中。
(7)对不同路径下的类进行导包就要引用关键字import,否则可直接用package+包路径。
-
println
println具有换行输出功能,而print没有换行输出功能为一般输出,printf一般用于格式转化。
-基本语法格式为:
println:
System.out.println(msg);
其中,参数可以为空,起换行作用。
print:
System.out.print(msg);
其中,参数不可以为空,否则报错。需要实现换行时:+"\n"
printf:
System.out.printf(format,msg);
-问题:
println,print的运算规则?
-
HelloWorld初尝试
代码:
package com.pancake;
public class HelloWorld {
public static void main(String args[]){
System.out.println("Hello,world!");
}//of main
}//of class HelloWorld
结果:
问题:
虽然运行成功,但是IDEA提示Package name 'com.pancake' does not correspond to the file path '',在网上查阅资料发现应该是因为IDEA在类文件中直接修改过包名(未定义)导致/先创建了class文件后加入package语句导致,因此此时光标移到定位的包语句,根据IDEA提示(Move to package com.pancake)按下Alt+Shift+Enter,即解决。即要保持package与所建包名一致。