包机制、访问修饰符、Jar包、模板设计、常用的API
-----Java培训、Android培训、期待与您交流! -------
1包机制
包概念的引入:
问题:如果在一个文件夹里面有相同类名的java文件,那么后编译的class文件
会覆盖前面编译的class文件。
java中的包机制:
包的作用:
1.解决了类名重复产生覆盖的问题。
2.便于软件版本发布。
定义包的格式:
package包名;
java中的包就类似于windows文件夹。
包名的命名规范:全部字母小写。
包要注意细节:
1. package语句必须是在一个java文件中第一个语句。 2. 一个java文件只能有一个package语句。 3. 如果一个类加上了包语句之后,那么该类的完整类名是 包名+ 类名。 |
问题:有包语句之后,每次编译完成之后都要自己新建一个文件夹把class文件放进去,烦!!!
javac-d 指定存放class文件的路径 java的源文件。
有了包之后类与类之间访问:
问题: 有了包之后,类与类之间的访问就变成 包名.类名才能创建一个对象,如何解决?
为了解决有了包名之后,类与类之间访问需要写上包名这个问题,sun引入了一个导包机制。
import 导包语句解决上述的问题。
import作用:简化书写。
import语句的使用格式:
import包名.类名;
例子:import aa.Demo1; 引入了一个类文件,把Demo1.class文件加载到内存中。
导包语句要注意的细节:
1. import 语句可以出现多句。 2. import 包名.* 引入指定的包下面的所有类。 * 只能用于类名不能用于匹配包名。 3. import aa.* 不会作用于aa包下面的子包类。 |
推荐使用: import 包名.类名 不推荐使用使用通配符。原因是使用通配符结构不清晰。
何时需要使用导包语句:
1.如果类与类之间的访问不是在同一个包,那么就需要使用导包语句。
2.如果是使用了java.lang包下面的所有类都不需要导入,java编译器机默认导入。
2 访问修饰符
访问修饰符是用来控制类、属性、方法的可见性的关键字称之为访问修饰符。
1. public 一个类中,同一包中,子类中,不同包中
2. protected 一个类中,同一包中,子类中
3. default 一个类中,同一包中
4. private 一个类中
1. (修饰类成员)类成员
1. 成员使用private修饰只在本类中使用。
2. 如果一个成员没有使用任何修饰符,就是default,该成员可以被包中的其
3. 他类访问。
4. protected成员被protected修饰可以被包中其他类访问,并且位于不同
5. 包中的子类也可以访问。
6. public修饰的成员可以被所有类访问。
2. (修饰类)类
1. 类只有两种public和默认(成员内部类可以使用private))
2. 父类不可以是private和protected,子类无法继承
3. public类可以被所有类访问
4. 默认类只能被同一个包中的类访问
3 Jar包
1:jar就是打包文件
jar文件时一种打包文件java active File,与zip兼容,称之为jar包
开发了很多类,需要将类提供给别人使用,通常以jar包形式提供.当项目写完之后,需要及将class字节码文件打包部署给客户。如何打包?可以使用jar命令.
2:jar命令
1:jar工具存放于jdk的bin目录中(jar.exe)
2:jar工具:主要用于对class文件进行打包(压缩)
3:dos中输入jar查看帮助
3:案例使用jar命令
将day10中的cn文件打包为名字为test.jar文件(cn 文件是使用javac -d 编译带包的class文件夹)
jar cvf test.jar cn
详细命令:
1:jar cf test.jar cn 在当前目录生成test.jar 文件,没有显示执行过程
2:jar cvf test.jar cn 显示打包中的详细信息
3:jar tf test.jar 显示jar文件中包含的所有目录和文件名
4:jar tvf test.jar 显示jar文件中包含的所有目录和文件名大小,创建时间详
细信息
5:jar xf test.jar 解压test.jar到当前目录,不显示信息
6:jar xvf test.jar 解压test.jar到当前目录,显示详细信息
7:可以使用WinRaR进行jar解压
8;将两个类文件归档到一个名为 test2.jar 的归档文件中:
jar cvf test2.jar Demo3.class Demo4.class
9:重定向
1:tvf可以查看jar文件内容,jar文件大,包含内容多,dos看不全。
2:查看jdk中的rt.jar 文件 jar tvf rt.jar
3:jar tvf rt.jar>d:\rt.txt
打jar要注意的事项
1. MANIFEST.MF 需要写上这个软件的入口类文件。 2. jar文件双击运行仅对图形化界面的程序有效,对于控制台的程序无效。 |
jar文件的作用:
1.可以把一个图形化界面的程序打包,然后双击可以运行。
2.可以把一些工具类打包成jar包,提供给其他程序员使用。这样子更加的清爽..
注意: 如果工具类是以jar形式提供给别人使用的时候,那么一定要设置classpath的路径信息。
classpath的作用:设置了class文件所在的路径。
jre java运行环境 = jvm + 核心类库。
4 模板设计
模板模式的步骤:
1. 先写出解决该类问题其中一件的解决方案。 2. 分析当前的程序,把会发生变化的代码独立抽取成一个方法。再把这个方法描述成抽象的方法。 3. 如果谁需要使用到写好的模板,那么就需要继承你的模板类。 |
//计算程序运行时间的模板类 abstract class MyRuntime{
public final void getTime(){ //在程序运行之前先记录一个开始时间 long startTime = System.currentTimeMillis(); code(); //记录一个结束的时间。 long endTime = System.currentTimeMillis(); System.out.println("运行时间为:"+ (endTime-startTime)); }
//code方法的代码是会发生变化的,并不是固定的。 public abstract void code(); }
class Demo10 extends MyRuntime{ public static void main(String[] args) { Demo10 d = new Demo10(); d.getTime(); }
//需要计算运行时间的代码就写到code方法上面去。 public void code(){ int i = 0 ; while(i<100){ System.out.println("i="+i); i++; } } } |
5常用的API
5.1 Object类
Object类是所有类的超类(父类)。
Object常用的方法:
toString() 返回该对象的字符串表示 完整类名+ @+ 哈希码(可以把哈希码理解成就是该对象的内存地址)
疑问: toString到底有什么作用?
让我们直接打印一个对象的时候,输出的信息是符合我们所需要的信息。
equals(Object obj) 用于判断两个对象是否是同一个对象,底层比较的是两个对象 的内存地址,如果是同一个对象返回true,否则返回false。
hashCode() 返回该对象的哈希码值。哈希码可以理解成就是一个对象的内存地址。
java规范:一般重写了对象的equals方法,都会重写hashCode方法.
public class Demo1 { public static void main(String[] args) { /* Object o = new Object(); //String str = o.toString(); System.out.println(o.toString()); // java.lang.Object@5e1077 System.out.println(o); // java.lang.Object@5e1077
疑问:为什么直接输出一个对象的时候,打印出来的信息与调用对象的toString输出的的是一样? 因为println的这个方法内部调用对象的toString方法。
Person p1 = new Person(110,"狗娃"); Person p2 = new Person(119,"狗剩"); System.out.println(p1); // cn.itcast.object.Person@1db05b2 需求:编号:110 名字:狗娃 System.out.println(p2); */ Person p1 = new Person(110,"狗娃"); Person p2 = new Person(110,"小狗"); // 凡是以new关键字创建对象的时候。,jvm都会在堆内存中开辟新的内存空间,创建新的对象。
//在现实生活中两个人只需要身份证编号一致,那么我们就可以断定是同一个人了。 System.out.println("是同一个对象吗?"+ p1.equals(p2)); // equals 比较的是内存地址, false System.out.println("p1的哈希码: "+p1.hashCode()); System.out.println("p2的哈希码: "+p2.hashCode()); } } |
equals与==的区别:
1. euqlas方法只能比较引用类型对象数据,==可以比较基本数据类型,也可以比较引用数据类型。 2. equals默认比较的是两个对象的内存地址,但是equals可以重写比较其他的数据, ==不能重写的,用于基本数据类型的时候比较的是两个数据的值是否相等,用于比较两个 对象数据的时候,比较的是两个对象的内存地址是否一致。 |
5.2 String类
5.2.1字符串对象的比较
String Str = “jack”这个语句会先检查字符串常量池是否存放这个”jack1”这个字符串对象,如果没有存在,那么就会在字符串常量池中创建这个字符串对象,如果存在直接返回该字符串的内存地址值。
String str3 = new String(“jack”) 该语句会创建两个对象,首先会先检查字符串常量池中存不存在jack这个字符串对象,如果不存在就会创建,如果存在就返回内存地址值。创建了出来之后,new String这个语句就会在堆内存中开辟一个字符串对象。总共两个对象。
5.2.2获取方法
int length() 获取字符串的长度 char charAt(int index) 获取特定位置的字符 (角标越界) int indexOf(String str) 获取特定字符的位置(overload) int lastIndexOf(int ch) 获取最后一个字符的位置 |
5.2.3判断方法
boolean endsWith(String str) 是否以指定字符结束 boolean isEmpty()是否长度为0 如:“” null V1.6 boolean contains(CharSequences) 是否包含指定序列 应用:搜索 boolean equals(Object anObject) 是否相等 boolean equalsIgnoreCase(String anotherString) 忽略大小写是否相等 |
5.2.4转换方法
String(char[] value) 将字符数组转换为字符串 String(char[] value, int offset, int count) Static String valueOf(char[] data) static String valueOf(char[] data, int offset, int count) char[] toCharArray() 将字符串转换为字符数组 |
5.2.5其他方法
String replace(char oldChar, char newChar) 替换 String[] split(String regex) 切割 String substring(int beginIndex) String substring(int beginIndex, int endIndex)截取字串 String toUpperCase() 转大写 String toLowerCase() 转小写 String trim() 去除空格 |
5.3 StringBuffer 字符缓冲类
StringBuffer 其实就是一个存储字符的容器。 允许对字符数据进行修改的。
容器的方法:
添加 append() 在缓冲区的尾部添加新的文本对象(StringBuffer 可以添加任意类型的数据进去) insert(int offset, char c) offset 指定插入的位置。 插入的内容。 在指定的下标位置添加新的文本对象
查看 toString() 返回这个容器的字符串 indexOf(String str) 返回第一次出现的指定子字符串在该字符串中的索引。 substring(int start) 从开始的位置开始截取字符串
删除 delete(int start, int end) 根据开始与结束的索引值删除字符串缓冲区的内容。 deleteCharAt(int index) 删除指定的索引值对应的字符。
修改 replace(int start int end , String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。该子字符串从指定的 start 处开始,一直到索引 end - 1 处的字符。 setCharAt(int index char ch) 指定索引位置替换一个字符 |
疑问:使用StringBuffer无参的构造方法创建对象时,默认的初始容量是多少,当容量不够使用时又会自动增长多少?
StringBuffer底层是维护了一个字符数组存储字符数据的, 默认的初始化容量是16,自动增长1倍。
public class Demo1 {
public static void main(String[] args) { //创建了一个字符串缓冲类对象。 StringBuffer sb = new StringBuffer("hello java");// hello 小明java //添加 sb.append(" java"); sb.append(true); sb.append(3.14f); sb.insert(6, "小明"); //指定一个索引值插入元素。
//查看 String str = sb.toString(); System.out.println(str); int index = sb.indexOf("java");//返回指定字符串第一次出的索引值。 System.out.println("index :"+index); System.out.println("子串的内容:"+sb.substring(6));
//删除 sb.delete(6, 8); // 根据开始与结束的索引值删除数据。包头不包尾 sb.deleteCharAt(1); System.out.println("删除后的数据:"+sb);
//修改 // hello java sb.replace(6, 10, "php"); //指定开始与结束的索引值替换内容。 sb.setCharAt(7, 'w'); //设置指定索引值对应的字符改成指定的字符。 System.out.println("修改后的数据:"+sb); } } |
StringBuilder是JDK1.5之后提出的,线程不安全,但是效率要高。用法与StringBuffer类似。
5.4 System 系统类
System类常用的方法:
arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 拷贝一个数组 src - 源数组。 srcPos - 源数组中的起始位置。 dest - 目标数组。 destPos - 目标数据中的起始位置。 length - 要复制的数组元素的数量。 currentTimeMillis() 获取当前的系统时间,返回的是一个毫秒数 |
public class Demo { public static void main(String[] args) { int[] strArr = {12,4,5,10,17}; int[] desArr = new int[5]; System.arraycopy(strArr, 1,desArr, 1, 3); System.out.println("目标数组的元素:"+Arrays.toString(desArr)); //[0, 4, 5, 10, 0]
//获取系统属性 Properties ps = System.getProperties(); //输出属性 ps.list(System.out);
//获取操作系统名称 String os_name =System.getProperty("os.name"); System.out.println(os_name);
//获取path环境变量值 System.out.println(System.getenv("path")); System.out.println("当前时间:"+System.currentTimeMillis()); } } |
5.5 Runtime
Runtime常用 的方法:
exec(String command)指定一个可执行文件的路径的字符串形式,然后执行一个程序。 freeMemory() 返回 Java 虚拟机中的空闲内存量。 totalMemory() 返回 Java 虚拟机中的内存总量 |
public class Demo2 { public static void main(String[] args) throws IOException, Exception{ // 获取应用运行环境的对象 Runtime run =Runtime.getRuntime(); //获取可用内存 System.out.println(run.freeMemory()); System.out.println(run.maxMemory()); System.out.println(run.totalMemory());
// 获取应用运行环境的对象 Runtime run =Runtime.getRuntime(); Process process = run.exec("C:\\Windows\\notepad.exe"); Thread.sleep(3000); //让程序暂停3秒 process.destroy(); //销毁进程 } } |
5.6 Date
Date 类封装的是系统的当前时间.。但是Date已经过时了,sun推荐使用Calendar类。
Calendar: 该类是一个日历的类,封装了年月日时分秒时区。
日期格式化类:SimpleDateFormat
public class Demo1 { private static final int YEAR = 0; public static void main(String[] args) throws Exception { Date date = new Date();//获取当前的系统时间 System.out.println("年月:"+date.
Calendar calendar = Calendar.getInstance();//新的取代方法 System.out.println("年份:"+calendar.get(calendar.YEAR));//获取年份 System.out.println("月份:"+(calendar.get(calendar.MONTH)+1));//月 System.out.println("日:"+calendar.get(calendar.DATE)); System.out.println("星期:"+calendar.get(calendar.DAY_OF_WEEK));
System.out.println("时:"+calendar.get(calendar.HOUR_OF_DAY)); System.out.println("分:"+calendar.get(calendar.MINUTE)); System.out.println("秒:"+calendar.get(calendar.SECOND));
// xxxx年xx月xx日 xx:xx:xx // Date date = new Date(); // SimpleDateFormat的第一个作用:把Date转换成指定格式的字符串。
//创建了一个默认模式的日期格式化类对象 SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss"); String dateFomat = simpleDateFormat.format(date); System.out.println("日期:"+dateFomat);
//把字符串----->日期 String str = "2014年10月18日 15:54:30"; date = simpleDateFormat.parse(str); System.out.println(date); } } |
5.7 Math
Math:类封装了很多数学的功能。
Math常用的方法:
abs(double a) 获取一个绝对值。 ceil(double a) 向上取整。() floor(double a) 向下取整 round(double a) 四舍五入 random() 产生一个随机数,随机数的方位是0.0-1.0之间 |
public class Demo2 { public static void main(String[] args) { System.out.println("绝对值:"+Math.abs(-1)); System.out.println("向上取整"+Math.ceil(-3.14)); System.out.println("向下取整:"+Math.floor(-3.14)); System.out.println("四舍五入:"+ Math.round(3.55)); System.out.println("随机数:"+ Math.random());
//练习:产生一个随机码 Random random =new Random(); char chs[] = new char[]{'a','b','c','A','B','C','北','上','广','深'}; StringBuilder sb =new StringBuilder(); for(inti=0;i<4;i++){ // sb.append(chs[random.nextInt(chs.length)]); intindex = random.nextInt(chs.length); sb.append(chs[index]); } System.out.println("验证码是:"+sb.toString()); } } |