好记性不如烂笔头。

Java语言中的数据类型:基本数据类型(8种)+ 引用类型(对象)

基本数据类型:byte、short、int、long、float、double、char、boolean

引用类型:基本类型的包装类、其他各种对象类型

java 小记

基本类型间支持的自动转换:

java 小记

 

 

 

 

 

 

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;
           }
      }
    • 作为对象参数传递
      java 小记
      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!");
          }
      }
      View Code

相关文章:

  • 2021-09-26
  • 2021-10-10
  • 2021-07-04
  • 2021-10-22
  • 2021-07-22
  • 2021-08-01
  • 2021-10-31
  • 2022-12-23
猜你喜欢
  • 2021-11-24
  • 2021-12-01
  • 2022-12-23
  • 2021-06-24
  • 2021-07-17
  • 2022-01-04
  • 2021-11-08
相关资源
相似解决方案