好记性不如烂笔头。
Java语言中的数据类型:基本数据类型(8种)+ 引用类型(对象)
基本数据类型:byte、short、int、long、float、double、char、boolean
引用类型:基本类型的包装类、其他各种对象类型
基本类型间支持的自动转换:
1、获取web项目根目录的绝对路径
request.getContextPath() 获取项目名称,如 /BiYeSheJi
getServletContext().getRealPath("/") 获取项目根目录,如 C:\install files\programing software\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\BiYeSheJi\
或
request.getRealPath(""); //D:\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\zhx-web\
strDirectory="files" , request.getRealPath("//WEB-INF//" + strDirectory + "//"); //D:\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\zhx-web\WEB-INF\files\
获取放.class文件的目录的绝对路径:
(即Maven工程的classes绝对路径 或 非Maven工程的bin绝对路径,当打包成Jar运行时获取到的是Jar的绝对路径 /.../xxx.jar)
1 // 获取类所在绝对路径 2 java.net.URL url = Main_Other.class.getProtectionDomain().getCodeSource().getLocation(); 3 String filePath = null; 4 try { 5 filePath = url.getPath();//被用UTF-8编码了 6 filePath = java.net.URLDecoder.decode(filePath, "utf-8"); 7 System.out.println(filePath); 8 } catch (Exception e) { 9 e.printStackTrace(); 10 }
由上,可以获取程序的父目录名字:
(在Eclipse中运行时得到放置.class文件的目录的绝对路径[bin或Maven的classes],打包成jar时获得jar程序(无论是Maven还是普通程序)的所在目录的绝对路径):
1 String rootPath = Test.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 2 rootPath = rootPath.substring(0, rootPath.lastIndexOf("/") + 1); 3 System.out.println(rootPath);
其应用是可以以 rootPath+"/"+config.properties 指定路径来读取配置文件,这样开发时配置文件放在工程里,打包时放在程序所在目录,而不用更改配置文件路径。
注:在Spring [Boot]中则可以通过 ResourceUtils.getURL("classpath:").getPath() 获取到该路径。
2、前台URL中含有中文参数时,传给Java后台获取到的会是乱码,因为ISO-8859-1是Java中网络传输使用的标准字符集,String city=request.getParameter("city");得到的还是ISO-8859-1字符集,所以要转换一下,方法不止一种,如:city = new String(city.getBytes("ISO-8859-1"), "UTF-8");
获取到的中文参数存到后台数据库后,在数据库里都变成?的解决方法:在数据库连接的URL上加 ?useUnicode=true&characterEncoding=UTF-8 ,如 jdbc:mysql://172.20.4.183:3306/jpatest?useUnicode=true&characterEncoding=UTF-8
3、20150315
Spring框架中提供一种模式,定义类的成员变量后不用写get或set方法就可以直接使用get或set,只要在变量前声明@Getter @Setter;
此外,对于进行@Autowired声明的类变量,不需要去new它,在Spring框架中会自动维护一个类对象。如果去new它也不会保存,但会产生一些影响,如如果该类在一个web接口中会被用到,则当接口请求频繁时会造成产生大量对象的恶果
获取类所在目录的绝对路径:
1 java.net.URL url = TestMain.class.getProtectionDomain().getCodeSource().getLocation(); 2 String filePath = null; 3 try { 4 filePath = java.net.URLDecoder.decode(url.getPath(), "utf-8"); 5 System.out.println(filePath); 6 } catch (Exception e) { 7 e.printStackTrace(); 8 }
4、20150329
Java多线程实现方法:
(1)写一个实现Runnable接口(及里面的run方法)的类,然后启动一个线程,此类作为线程的参数,再start
class MyRunnable implements Runnable{ @Override public void run() { // TODO Auto-generated method stub } } new Thread(new MyRunnable()).start();
(2)写一个类,继承Thread类(实现run方法),然后new此类,再start
class MyThread extends Thread { public void run() { System.out.println("fuck"); } } (new MyThread()).start();
5、20150702 参考:http://www.cnblogs.com/qinqinmeiren/archive/2011/07/19/2151683.html
Java 编译器默认为所有的 Java 程序导入了 JDK 的 java.lang 包中所有的类(import java.lang.*;),其中定义了一些常用类,如 System、String、Object、Math 等,因此我们可以直接使用这些类而不必显式导入。但是使用其他类必须先导入。
不像 C/C++,Java 不支持无符号类型(unsigned)。
float 类型有效数字最长为 8 位,有效数字长度包括了整数部分和小数部分;double 类型有效数字最长为 15 位。如2.123456789f+1f 结果为3.1234567f。
Java也有格式化输出函数,例:System.out.printf("%d*%d=%2d ", i, j, i * j)。
String变量被初始化后,长度和内容都不可变,每次对String的操作都会生成新的String对象,不仅效率低,而且耗费大量内存空间;对于String str = new String(“abc”),实际上创建了两个String对象,一个是”abc”对象,存储在常量空间中(常量池),一个是使用new关键字为对象str申请的空间。
Integer i1 = new Integer(1); Integer i2 = new Integer(1); // i1,i2分别位于堆中不同的内存空间 System.out.println(i1 == i2);// 输出false Integer i3 = 1; Integer i4 = 1; // i3,i4指向常量池中同一个内存空间 System.out.println(i3 == i4);// 输出true // 很显然,i1,i3位于不同的内存空间 System.out.println(i1 == i3);// 输出false // 值大于127时,不会从常量池中取对象 Integer i5 = 128; Integer i6 = 128; System.out.println(i5 == i6);// 输出false
6、String、StringBuffer、StringBuilder:前者效率最低,初始化后长度、内容不可变;后两者效率更高,StringBuilder类和StringBuffer类功能基本相似,方法也差不多,主要区别在于StringBuffer类的方法是多线程安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。
线程安全:
-
- StringBuffer:线程安全
- StringBuilder:线程不安全
速度:
一般情况下,速度从快到慢为 StringBuilder > StringBuffer > String,当然这是相对的,不是绝对的。
使用环境:
- 操作少量的数据使用 String;
- 单线程操作大量数据使用 StringBuilder;
- 多线程操作大量数据使用 StringBuffer。
7、Java修饰符
Java 通过修饰符来控制类、属性和方法的访问权限和其他功能,通常放在语句的最前端,分为访问修饰符和非访问修饰符。访问修饰符也叫访问控制符,是指能够控制类、成员变量、方法的使用权限的关键字。
总的来说,访问控制控制的是一个类是否可被 同一包内的其他类、是否可被其子类 访问。从集合论的角度来看,假设访问权限的空间为U、同包的类为A、子类为B,则A∩B表示同包下的子类、A-B表示同包下的非子类、U-A表示非同包下的类、等等。有四种情况:
| 关键字名称 | 类内部 | 本包 | 子类 | 外部包 | 说明 |
|---|---|---|---|---|---|
| public | Y | Y | Y | Y | 对所有类可见,不管是不是同包、不管是不是子类。即U |
| protected | Y | Y | Y | N | 对所有子类(同包或不同包均可)和同一包内的类可见。即A∪B |
| 无关键字 | Y | Y | N | N | 对本包内的类可见。即A |
| private | Y | N | N | N | 对所有其他类不可见,只对自己可见。即∅ |
public 最大访问权限,所有都可以访问。
protected 是针对于子类设计的,对于子类和本包来说,被protected修饰的父类的方法和属性就是public的,可以自由访问,没有限制,而对于外部的class,其权限就相当于private,限制访问。
default 方法只是对于本类和本包,如果子类和父类不再一个包中,则也是不可以访问的。
private 只允许本类访问。
java在编译的时候会进行访问控制的检查。需要注意的是,通过反射的手段,是可以访问任何包下任何类中的成员,例如,访问类的私有成员也是可能的。
8、Java变量类型及作用域
变量类型:前两者会自动初始化,第三个不会,须显式初始化。
类变量(或称静态变量、全局变量),属于类,通过类或实例访问;声明周期:随类的加载和卸载而产生和销毁
实例变量(或称成员变量),属于实例,通过实例访问;声明周期:随对象的创建和回收而产生和销毁
局部变量,在方法(类方法、实例方法、构造方法等)、代码块(静态块、实例块)内定义的变量;声明周期:随方法、构造器、代码块的执行而产生和销毁
变量作用域:在Java中,变量的作用域分为四个级别:
类级(全局级变量或静态变量,需要使用static关键字修饰)
对象实例级(成员变量,实例化后才会分配内存空间,才能访问)
方法级(包括类方法、实例方法、构造方法,在方法内部定义的变量,就是局部变量)
块级(定义在一个块内部的变量,也是局部变量,变量的生存周期就是这个块)。
块可以是静态块或非静态块,还可以是在方法内的块。
块内部能够访问类级、实例级变量,如果块被包含在方法内部,它还可以访问方法级的变量。
方法内部除了能访问方法级的变量,还可以访问类级和实例级的变量。
方法级和块级的变量必须被显示地初始化,否则不能访问。
9、this关键字
this 关键字用来表示当前对象本身,或当前类的一个实例,通过 this 可以调用本对象的所有方法和属性。
-
- 构造方法中区分形参和类的成员变量:
public String name; public int age; public Demo(String name, int age){ this.name = name; this.age = age; }
- 构造方法重载时作为方法名初始化对象:
public class Demo{ public Demo(){ this("博客园", 10); } public Demo(String name, int age){ this.name = name; this.age = age; } }
- 作为对象参数传递
View Code
public class Demo{ public static void main(String[] args){ B b = new B(new A()); } } class A{ public A(){ new B(this).print(); // 匿名对象 } public void print(){ System.out.println("Hello from A!"); } } class B{ A a; public B(A a){ this.a = a; } public void print() { a.print(); System.out.println("Hello from B!"); } }
- 构造方法中区分形参和类的成员变量: