情儿沫沫 情儿沫沫
关注数: 62 粉丝数: 495 发帖数: 7,088 关注贴吧数: 11
【基础知识贴03】路径的使用 有人问我这个知识贴教程的解说顺序是什么,我的回答是:我想到什么发什么。 刚才看到有人发帖纠结路径的问题,于是我就写了这篇帖子…… 以下只针对eclipse,因为不知道不同的IDE路径会不会不同…… 一、相对路径 1.只能在未打包时使用的方法:String path 直接路径,这是从project目录开始的: new ImageIcon("test.png");(在src外),File的话:new File("test.png"); new ImageIcon("src/test.png");(在src内) new ImageIcon("bin/test.png");(因为eclipse会在编译运行时,会在bin文件夹中生成对应的class文件,资源文件也会复制一份) new ImageIcon("bin/com/yuki/ui/test.png"); (在包com.yuki.ui内) 但是,这样的话,打包出来后路径就变了,变得从jar所在目录开始了。如"test.png"指的是与jar文件同目录的test.png。 2.打包后仍然有效的方法:URL path a.如果是和java文件放一起的(也就是和class文件放一起,同样是在bin文件夹中复制一份),可以用这个方法: new ImageIcon(getClass().getResource("test.png")); new File(getClass().getResource("test.png").getFile()); b.和java文件放在一起毕竟不好,所以可以用另一个方法 new ImageIcon(URLClassLoader.getSystemClassLoader().getResource("com/yuki/ui/test.png")); new File(URLClassLoader.getSystemClassLoader().getResource("com/yuki/ui/test.png").getFile); 这是从src(bin)目录开始的,"com/yuki/ui/test.png"表示在包com.yuki.ui内的test.png。 二、绝对路径 绝对路径在打包前后没有任何影响,都是可以用的。 1.String path 这个没什么好说的,就是绝对路径呗! "c:/windows/system32"就表示c盘下的Windows文件夹中的system32文件(或文件夹)。然后用的时候就是new File("c:/windows/system32/mspaint.exe"); 对了,我要说两点是: a.Windows系统的路径不分大小写,所以如果在Windows系统下运行,大小写可以忽略。 b.Windows系统的路径分隔符是“\”也就是反斜杠,在代码中应该用“\\”表示,而java本身的路径分隔符是“/”,所以如果在Windows系统下运行,“/”和“\\”都可以用,没有区别。 2.URL path 其实这个也很简单! new URL("file://c:/windows/system32")就表示c盘下的Windows文件夹中的system32文件(或文件夹)。所以就是new File(new URL("file://c:/windows/system32").getFile()); 这里file代表的应该是本地文件的意思,也可以是其他的,如new URL("http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fimgsrc.baidu.com%2Fforum%2Fpic%2Fitem%2F%2A.txt&urlrefer=56ba0af64b5a67eb59883f28a381a427")。 三、获取project文件夹(未打包)或程序文件(已打包)的绝对路径 其实就一句话: System.getProperty("user.dir"); 返回的是一个String。 这里顺便说一下,System.getProperty("")这个方法很有用呢: System.getProperty("user.name")获取计算机用户名 System.getProperty("os.name")获取操作系统名称 System.getProperty("os.arch")获取操作系统属性(位数) System.getProperty("os.version")获取操作系统的版本号 System.getProperty("user.home")获取个人文件夹的目录 比如用我的笔记本打印出这5行的话,应该是: 情却然 Windows 7 amd64 6.1 F:\情却然
【基础知识贴02】关于java的位运算 大家都知道,计算机里的任何数据,都是以二进制的方式来储存的,所以无论我们看到的是什么,它的实质都是0和1两个符号的组合。 二进制是一个神奇的数制,它将世界上所有的事物都划分两级,将一切事物都变得简单明了,乾坤、阴阳、生死…… 好了,扯远了,位运算其实就是将数据直接以二进制的形式按位来处理运算。只有整数类型才能进行位运算,这些整数类型包括long、int、short、char和byte,而浮点型则不支持。 首先,位运算符有7个,分别是<<、>>、>>>、&、|、^、~,其中前6个可以和赋值运算符结合成<<=、>>=、>>>=、&=、|=、^=。 位运算符表:整数类型表:一、数值的整体操作 1.<< 左移位,它的样子就代表了它的作用——将数值左移。 如“23 << 4”即是将23以二进制的形式,向左移动4位,左端超出部分舍去,右端补0,因为是移动的位数,所以符号左右边肯定都是整数啦: 23 << 4 == 268: 00000000 00000000 00000000 00010111 (23) 00000000 00000000 00000001 01110000 (368) 23 << 30 == -1073741824: 00000000 00000000 00000000 00010111 (23) 11000000 00000000 00000000 00000000 (-1073741824) 不过有一点值得注意,由于java中int型占4个字节,也就是32位,所以当位移超过31位时,就相当于对位移位数取模,即32位相当于0位,33位相当于1位,当然,如果你操作的是byte型、char型或者long型,那就是8位、16位或者64位了: 23 << 32 == 23 23 << 33 == 46 2.>> 右移位,它的样子同样代表了它的作用——将数值右移。 如“23 >> 4”即是将23以二进制的形式,向右移动4位,右端舍去,左端补0。咦?咦?咦?不对,那如果将负数右移呢?原来这里有些不同,如果是正数,则前端补0,如果是负数,则前端补1: 23 >> 4 == 1: 00000000 00000000 00000000 00010111 (23) 00000000 00000000 00000000 00000001 (1) -23 >> 4 == -2: 11111111 11111111 11111111 11101001 (-23) 11111111 11111111 11111111 11111110 (-2) 同样,超过31位时,就取模: 23 >> 32 == 23 23 >> 33 == 11 -23 >> 32 == -23 -23 >> 33 == -12 3.>>> 现在有一个问题:“1 << 31 >> 31”的结果是多少? 有人会说,向左移动31位,再向右移动31位,而且也没有舍去什么数字,应该还是1。 可是,结果却是-1。为什么呢?因为1向左移31位后,int类型的第一位变成了1,也就是这个数值变成了负值-2147483648,那么再往右移,左边补的就不是0了,而是1,所以最后结果变成了-1了: 1 << 31 == -2147483648 -2147483648 >> 31 == -1 00000000 00000000 00000000 00000001 (1) 10000000 00000000 00000000 00000000 (-2147483648) 11111111 11111111 11111111 11111111 (-1) 于是就用到了这个符号“>>>”,它是无符号的右移位,即无论正负,左端都补0。那么现在“1 << 31 >>> 31”就是1啦。 1 << 31 == -2147483648 -2147483648 >>> 31 == 1 00000000 00000000 00000000 00000001 (1) 10000000 00000000 00000000 00000000 (-2147483648)
【基础知识贴01】各个修饰关键字的意义 1.public、protected、不写、private,修饰类、方法、变量不写的时候,不同包的子孙类是不能访问的。 2.static、abstract static是静态的意思,修饰方法和变量,也就是说,在一个程序中,它是唯一的,同一类型不同对象中被static修饰的变量都是同一个变量。 abstract是抽象的意思,修饰类,这个很好理解,就是说这个类只是定义了某些方法,但是没有写具体的内容。 3.extends、implements extends继承,类与类之间的关系,“A extends B”的意思就是B是A的父类,A是B的子类,java中的继承只能是单向的,也就是说,只能继承一个类。 implements实现,这大概是为了弥补继承的单向**,实现是多向的,“A implements B”的意思就是A类(class)实现了B接口(interface)。 4.transient transient是修饰变量的,当一个对象被序列化(serialization)的时候,transient型变量的值不包括在序列化的表示中。如果一个类的对象要被某个流传递,就必须实现可序列化接口(Serializable),而被transient修饰的变量则不会被传递。 5.volatile volatile修饰变量的,修饰了之后可以确保本条指令不会因编译器的优化而省略,这个不常用,不必了解那么清楚。 6.enum enum为枚举类型,enum Type {value1, value2, value3} Type name;这里是新定义了一个Type类,其所有可能值只有value1、value2、value3三个值,之后再声明一个Type类型的变量。 7.synchronized synchronized是线程的同步锁,可以使方法或块成为临界区,这个具体解释说来话长,大家自己去找资料吧。 8.native native,本地方法,当在方法中调用一些不是由java语言写的代码或者在方法中用java语言,直接操纵计算机硬件时要声明为native方法。 9.try、catch、finally、throws、throw 这四个关键字用于异常处理。 try { } catch(Exception1 e1) { } catch(Exception2 e2) { } finally { } try块中调用抛出异常的方法,当某行代码出现异常,则会跳出try块而进入catch块来捕获异常,catch块的小括号中填写的是捕获的异常类型,块中中调用的是出现异常后执行的代码。若try中可能出现多种异常,则跳入不同的catch块中,而自JDK7之后,也可以这么写了:catch(Exception1 | Exception2 e) finally不一定出现,finally的作用是,无论出现什么异常,都会执行finally块中的代码,平时没什么用,但是在catch块中出现return或者System.out.exit()时,就用到了。 当然,异常处理不只有这一种方法,也可以在方法头上throw异常,让其他调用该方法的语句去处理该异常。如“public void test() throws Exception {”。那么调用test()方法就需要try-catch了,当然你也可以再throws,让下一层try-catch。 但是异常是哪来的?其实,异常也是代码写出来的,只要在代码里加一行“throw new IOException()”,这样就抛出了一个IO异常。 10.instanceof instanceof,判断是否是该类的实例,“jf instanceof JFrame”意思是判断jf这个对象是否是JFrame类的实例,结果是true或者false。 11.for、do、while、goto 这是循环语句,没什么好说的。 12.switch 讲这个的原因是因为,自JDK7开始,能switch字符串了。
首页 1 2 下一页