1.编译及运行

$ javac HelloWorld.java
$ java HelloWorld
Hello World



2.Java语言是多线程的:

在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为Thread(Runnable)的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。

3. 关键字

  

synchronized

表示同一时间只能由一个线程访问的代码块


4.

Java 源程序与编译型运行区别

如下图所示:


java中哪些类是非线程安全的 java语言里的线程不是对象_成员变量

5.

常用的转义字符:

"\b" (退格)
"\f" (换页)
"\n" (换行)
"\r" (回车)
"\t" (水平制表符(到下一个tab位置))
"\' " (单引号)
"\" " (双引号) 
"\\" (反斜杠)
6.Java的八种基本类型:(按字节来分)boolean   布尔型   1个字节 8bit(8位)byte     字节类型   1个字节char     字符类型   2个字节short     短整型     2个字节int          整型        4个字节float      浮点型(单精度)4个字节long      长整型      8个字节double   双精度类型  8个字节Java中默认的整数类型是int,如果要定义为long ,则要在数值后加上L或者l默认的浮点型是双精度浮点,如果要定义float,则要在数值后面加上f或者F一个字节等于8位,1个字节等于256个数。2^8一个英文字母或者阿拉伯数字占一个字节一个汉字占2个字节
7.类变量类型:1.局部变量:在方法、构造方法、语句块中定义的变量。其声明和初始化在方法中实现,在方法结束后自动销毁public class  ClassName{
    public void printNumber(){
        int a;
    }
    // 其他代码
}2.成员变量:定义在类中,方法体之外。变量在创建对象时实例化。成员变量可被类中的方法、构造方法以及特定类的语句块访问。public class  ClassName{
    int a;
    public void printNumber(){
        // 其他代码
    }
}3.类变量:定义在类中,方法体之外,但必须要有 static 来声明变量类型。静态成员属于整个类,可通过对象名或类名来调用。public class  ClassName{
    static int a;
    public void printNumber(){
        // 其他代码
    }
}
 
 
  
  8.
  
  什么时候定义静态成员呢?或者说:定义成员时,到底需不需要被静态修饰呢?
  
  成员分两种:
  
     1、成员变量。(数据共享时静态化)
  
        该成员变量的数据是否是所有对象都一样:
  
        如果是,那么该变量需要被静态修饰,因为是共享的数据。 
  
        如果不是,那么就说这是对象的特有数据,要存储到对象中。 
  
     2、成员函数。(方法中没有调用特有数据时就定义成静态)
  
        如果判断成员函数是否需要被静态修饰呢?
  
        只要参考,该函数内是否访问了对象中的特有数据:
  
        如果有访问特有数据,那方法不能被静态修饰。
  
        如果没有访问过特有数据,那么这个方法需要被静态修饰。
  
  
  
  成员变量和静态变量的区别:
  
     1、成员变量所属于对象。所以也称为实例变量。
  
        静态变量所属于类。所以也称为类变量。
  
     2、成员变量存在于堆内存中。
  
        静态变量存在于方法区中。
  
     3、成员变量随着对象创建而存在。随着对象被回收而消失。
  
        静态变量随着类的加载而存在。随着类的消失而消失。
  
     4、成员变量只能被对象所调用 。
  
        静态变量可以被对象调用,也可以被类名调用。
  
     所以,成员变量可以称为对象的特有数据,静态变量称为对象的共享数据。
  
  

  
  9.java因强制要求类名(唯一的public类)和文件名统一,因此在引用其它类时无需显式声明。在编译时,编译器会根据类名去寻找同名文件。
  
  

  
  10自动类型转换
  
  整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。
  
  转换从低级到高级。
  
  低  ------------------------------------>  高

byte,short,char—> int —> long—> float —> double 
  
  数据类型转换必须满足如下规则:
  
  
1. 不能对boolean类型进行类型转换。
 
2. 不能把对象类型转换成不相关类的对象。
 
3. 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
 
4. 转换过程中可能导致溢出或损失精度,例如:
 


   
   11.Java 里使用 long 类型的数据一定要在数值后面加上 L,否则将作为整型解析:

  
  
  
  
   
   

  
  
  
  
   
   12。
   
   数据类型转换的补充


   
   1、包装类过渡类型转换
   
   一般情况下,我们首先声明一个变量,然后生成一个对应的包装类,就可以利用包装类的各种方法进行类型转换了。例如:
   
   当希望把float型转换为double型时:
   
   float f1=100.00f;
Float F1=new Float(f1);
double d1=F1.doubleValue();//F1.doubleValue()为Float类的返回double值型的方法
   
   简单类型的变量转换为相应的包装类,可以利用包装类的构造函数。即:Boolean(boolean value)、Character(char value)、Integer(int value)、Long(long value)、Float(float value)、Double(double value)
   
   而在各个包装类中,总有形为××Value()的方法,来得到其对应的简单类型数据。利用这种方法,也可以实现不同数值型变量间的转换,例如,对于一个双精度实型类,intValue()可以得到其对应的整型变量,而doubleValue()可以得到其对应的双精度实型变量。
   
   2、字符串与其它类型间的转换
   
   其它类型向字符串的转换
   
   

 调用类的串转换方法:X.toString();
 

 自动转换:X+"";
 

 使用String的方法:String.volueOf(X);
 

3、字符串作为值,向其它类型的转换
   
   1、先转换成相应的封装器实例,再调用对应的方法转换成其它类型
   
   例如,字符中"32.1"转换double型的值的格式为:new Float("32.1").doubleValue()。也可以用:Double.valueOf("32.1").doubleValue()
   
   2、静态parseXXX方法
   
   String s = "1";
byte b = Byte.parseByte( s );
short t = Short.parseShort( s );
int i = Integer.parseInt( s );
long l = Long.parseLong( s );
Float f = Float.parseFloat( s );
Double d = Double.parseDouble( s );
   
   3、Character的getNumericValue(char ch)方法
   
   

   
   13.
   
   Java 常量
   
   
   
   常量在程序运行时是不能被修改的。
   
   在 Java 中使用 final 关键字来修饰常量,声明方式和变量类似:
   
   final double PI = 3.1415927;
  
  
  
  

14.
volatile 修饰符

volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
一个 volatile 对象引用可能是 null。
    
    
     
     实例
     
     
      
       
       public 
         
       class 
         
       MyRunnable 
         
       implements 
         
       Runnable 
        
       { 
         
       private 
         
       volatile 
         
       boolean 
         
       active 
       ;  
       public 
         
       void 
         
       run 
       ( 
       ) 
         
       { 
         
       active 
        =  
       true 
       ;  
       while 
         
       ( 
       active 
       ) 
         
       // 
        第一行 
        
         
       { 
         
       // 
        代码 
        
         
       } 
         
       } 
         
       public 
         
       void 
         
       stop 
       ( 
       ) 
         
       { 
         
       active 
        =  
       false 
       ;  
       // 
        第二行 
        
         
       } 
        
       } 
      
     
     
    
    
通常情况下,在一个线程调用 run() 方法(在 Runnable 开启的线程),在另一个线程调用 stop() 方法。 如果 第一行 中缓冲区的 active 值被使用,那么在 第二行 的 active 值为 false 时循环不会停止。
但是以上代码中我们使用了 volatile 修饰 active,所以该循环会停止。

 

15.


    
    
     
     
      
         Real
      
        zen***0522@163.com
      
         参考地址
     
     
    
    
    
    
     
     静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。
    
    


 

16
    
    
     
     
      
         Real
      
        zen***0522@163.com
      
         参考地址
     
     
    
    
    
    
     
     静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。
    
    


volatile
volatile可以用在任何变量前面,但不能用于final变量前面,因为final型的变量是禁止修改的。
使用的场景之一,单例模式中采用DCL双锁检测(double checked locking)机制,在多线程访问的情况下,可使用volatitle修改,保证多线程下的可见性。缺点是性能有损失,因此单线程情况下不必用此修饰符。
class Singleton{
    private volatile static Singleton instance = null;
    private Singleton() {
    }

    public static Singleton getInstance() {
        if(instance==null) {
            synchronized (Singleton.class) {
                if(instance==null)
                    instance = new Singleton();
            }
        }
        return instance;
    }
}

 

     
     
      
      
       
          Real
       
         zen***0522@163.com
       
          参考地址17静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。
      
      
     
     
18.transient当对象被序列化时(写入字节序列到目标文件)时,transient阻止实例中那些用此关键字声明的变量持久化;当对象被反序列化时(从源文件读取字节序列进行重构),这样的实例变量值不会被持久化和恢复。import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

//定义一个需要序列化的类

class People implements Serializable{
    String name; //姓名
    transient Integer age; //年龄
    public People(String name,int age){
        this.name = name;
        this.age = age;
    }

    public String toString(){
        return "姓名 = "+name+" ,年龄 = "+age;
    }

}

public class TransientPeople {
    public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
        People a = new People("李雷",30);
        System.out.println(a); //打印对象的值
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("d://people.txt"));
        os.writeObject(a);//写入文件(序列化)
        os.close();
        ObjectInputStream is = new ObjectInputStream(new FileInputStream("d://people.txt"));
        a = (People)is.readObject();//将文件数据转换为对象(反序列化)
        System.out.println(a); // 年龄 数据未定义
        is.close();
    }
}运行结果如下:姓名 = 李雷 ,年龄 = 30
姓名 = 李雷 ,年龄 = null


   Real


   参考地址



静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。