Java总结<一>

1、环境变量:(在windows中是不分大小写的,可以是Path或PATH,但是在Linux系统中是区分大小写的,只能是PATH)

JAVA_HOME:指向jdk目录,启动类加载器会加载$JAVA_HOME/jre/lib/rt.jar,扩展类加载器会加载$JAVA_HOME/jre/lib/ext/*.jar

CLASSPATH:应用程序类加载器会加载$CLASSPATH,在使用1.4以前版本的JDK,则需要在CLASSPATH环境变量中添加一点(.),用以告诉JRE需要在当前路径下搜索Java类,除此之外,编译和运行Java程序还需要JDK来编译和运行Java程序,常常需要设置CLASSPATH环境变量的值为:.;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar

但是后来使用JDK1.5以上的版本的时候,JRE会自动搜索当前路径下的类文件,而且使用Java的编译和运行工具时,系统可以自动加载dt.jar和tools.jar文件中的Java类,因此不再需要设置CLASSPATH环境变量

PATH:在cmd命令行中执行可执行文件时,如果该文件不能在当前路径下找到,则依次寻找PATH中的每一个路径

2、对象和实例:

对象是类的实例。对象在构造时以类为蓝本,创建对象的过程叫做实例化

3、所有变量:

成员变量(实例变量、类变量)和局部变量(形参、方法局部变量、代码块局部变量)

4、静态变量

在静态方法中是不能直接访问类的非静态成员的,如下

public class Person{
  int arr[] = new int[10];
  public static void main(String args[]){
    System.out.println(arr[1]);
  }
}

静态变量的使用

public class Person{
  private static int x;
  public static void main(String args[]){
    name(x);
    System.out.println(x);
  }
  public static void name(int x){
    x++;
  }
}
//上面的输出应该是0,其中x++改变的是参数的x的值,而不是静态变量x的值

public class Person{
  private static int x;
  public static void main(String args[]){
    name(x);
    System.out.println(x);
  }
  public static void name(int y){
    x++;
  }
}
//上面的输出应该是1,其中x++改变的是静态变量x的值

5、Java中变量

变量的命名是以字母、下画线(_)、美元符($)开始的,后面可以跟字母、下画线、美元符、数字。Java语言使用Unicode字符集,对字母不仅仅只限于是英文的,还可以是日文的、韩文的、阿拉伯文的甚至汉字。如声明public String 我的名字=“张三”;这样的声明是没问题的,当然,这只会出现在比较变态的笔试题中,平时是不会出现的。

6、Java中的关键字(除了Void、String、Class常见的是大写开头的其他大部分都是小写的。如null、true、false

7、Java的注释:单行(//)、多行(/*... */)、文档注释(/**... */)。多行的里面不可以嵌套,但是可以/*//*/

8、取模:不管是整型还是实型的取模运算,余数的符号与被除数a的符号相同,如(-5)%2=-1, 5%(-2)=1

9、equals()函数和==

10、String

String str = "abc";和String str = new String("abc");有什么区别,各产生了多少个对象

String不是基本类型

String和StringBuffer的区别

11、位运算

& 与

| 或

^ 异或

~ 非

<< 带符号左移

>> 带符号右移

>>> 无符号右移:移后补0

12、一些赋值语句:

x++=y+1这也是不合法的,因为左操作数必须为其右操作数指明一个确定的可存储位置

赋值运算具有右结合性a+b+c可以理解为a+(b+c)

13、float和double

浮点数的赋值是带有小数点的数字默认是double型的,如果在浮点数后面加f或F,则是float型;后面加d或D是double型,科学计数法形式的浮点数也是double型,double的精度比float高,故一个float可以直接赋值给double型的,反之则需要强制转换

float f=11.1;(错误,必须是float f = (float)11.1;)
double d = 5.3E12;
double d = 3.14159;
double d = 3.14D;
double d = 2.3F;

14、||和&&操作符

操作符在第一个语句为真则不会去执行第二个语句,和&&操作符则第一个语句为真才会去判断第二个语句

15、基本数据类型和封装类

16、八进制:八进制用0~7这8个数字和正负号组成的,八进制是以0开头的

十六进制:用0~9这10个数字以及字母A~F(对大小写不敏感,代表了10-15)和正负号组成。以0X或0x开头的都是十六进制数

17、int的取值范围:-2³¹~(2³¹-1)

18、数组

数组的声明:可以是int a[][]或int [][]a或int [] a[]

数组的初始化:数组在声明时并不为数组分配存储空间,因此在声明的[]中不能指出数组中元素的个数,所以声明后不能立即使用,必须经过初始化并分配存储空间

数组的引用:[]中的下标是介于[0,数组长度-1]之间的整型数,也可以是byte、short、char等类型或合法的表达式,但是不允许为long型

获得数组的大小a.length;,而不是a.length();而字符串的是用str.length();

19、 transient关键字:当串行化某个对象时,如果该对象的某个变量是transient,那么这个变量不会被串行化进去。也就是说,假设某个类的成员变量是transient,那么当通过ObjectOutputStream把这个类的某个实例保存到磁盘上时,实际上transient变量的值是不会保存的。因为当从磁盘中读出这个对象的时候,对象的该变量会没有被赋值。

20、浮点型变量分为单精度和双精度两类,分别用float(32位)和double(64位)来声明

科学记数法:2.8E3表示2.8*10³

21、字符型数据:

Java中的char类型是16位,其取值范围是0-65535,没有负数的char。char型变量能够存储一个中文,因为java采用的是unicode编码,一个char占16个字节,而一个中文汉字只有两个字节

22、对于布尔型数据:java中的布尔型是一个独立的类型,它不像C语言中的布尔型可以代表0和1,所以布尔类型是不能转成int型的

public class A {
	public static void main(String args[]){
		int s = 0;
		boolean b;
		if(++s){//这里编译错误
			System.out.println("hello");
		}
		if(b){
			System.out.println("world");
		}
	}
}

23、数据类型转换:除了布尔型外,其余类型的数据是可以进行混合运算的,在运算中,如果数据类型不一致,就必须先转成同一类型,然后才能运算,这是就要用到类型转换。如果低级数据想高级数据看齐,那么Java就能实现自动数据类型转换。转换的基本原则是:低级的转换变成高级的,精度小的转换成精度大的

数据类型的转换方式主要可以分3种:自动类型转换、强制类型转换、包装类过渡类型转换

char和int的转换:在Java中每个字符都会有一个ASCⅡ码,在与数字进行计算时,是由字符的ASCⅡ码进行计算,例如,A的ASCⅡ码是65,a的是97

包装类型的强制转换(其中String和Date本身就是类了)

String n= Integer.toString(12);

int m = Integer.parseInt("123");

基本数据类型与String之间的转换:表达式10.4+“4.2”的结果是“10.44.2”(当一个操作数为原始数据类型,另一个为字符串时,则基本数据类型的操作数要转换为等价的字符串)

24、final的参数传递

public class A {
	public static void main(String args[]){
		int x = 0;
		final int y = 1;
		int [] z = {2};
		final int [] n = {3};
		use(x,y,z,n);
	}
	static void use(final int x,int y,final int[] z,int[] n){
		//下面哪些插入会引起编译错误
	}
}

x++;//引起编译错误
y++;
y = x;
z[0]++;
n[0]++;
z = n;//引起编译错误

数组和字符串

25、Java在数组声明时并不为数组分配存储空间,因此在声明的[ ]中不能指出数组元素的个数(即数组的长度),所以声明后并不能立即使用,必须经过初始化并分配存储空间后,才能访问数组的元素。为数组分配存储空间有两种方式:初始化和使用关键字new

一旦数组初始化或用new为数组分配了存储空间后,该数组的长度即被固定下来,不能再进行修改,除非再新建一个数组,重新分配存储空间

26、数组中[ ]的下标是介于[0,数组长度-1]之间的整型数,也可以是byte、short、char等类型,但是不允许为long型,当然下标也可以是合法的表达式

27、数组声明的形式

一维:int a[ ];int [ ] a

二维:int [ ] a [ ];int [ ][ ] a;int a [ ][ ]

(二维数组与一维数组不同,二维数组在分配内存时,必须告诉编译器二维数组行与列的个数)

28、默认的初始化值:

元素类型                       初始化值

Byte                                      0

Short                                    0

Int                                         0

Long                                    0

Char                                '\U0000'

Float                                 0.0f

Double                            0.0d

Boolean                           false

Object Reference           null

29、字符和数值的转换

要获得一个字符的ascii码或者通过ascii码获取字符

(int)'a'

(char)97

包装类型的使用:一般用于类型的转换

Integer.parse("123");

初始化:(下面初始化都没问题)

int a = new Integer(123);

int b[] = new int[3];

Integer[] b = new Integer[]{new Integer(1),new Integer(2),new Integer(3)};

Integer类中下面几个方法的区别:

static int parseInt(String s) 
          将字符串参数作为有符号的十进制整数进行分析。 
static Integer valueOf(int i) 
          返回一个表示指定的 int 值的 Integer 实例。 
static Integer valueOf(String s) 
          返回保持指定的 String 的值的 Integer 对象。

很明显,parseInt和valueOf的区别是返回类型不同,parseInt返回int,而valueOf则返回Integer对象

Character类的digit方法

static int digit(char ch, int radix) :根据基数返回当前字符的值的十进制。如果不满足Character.MIN_RADIX <= radix <= Character.MAX_RADIX,或者,ch不是radix基数中的有效值,返回"-1";如果ch是“大写”的A到Z之间,则返回ch - 'A' + 10 的值;如果是“小写”a到z之间,返回ch - 'a' + 10 的值。

泛型

List<int> s = new ArrayList<int>();//编译错误,泛型应该是类
List<Integer> s = new ArrayList();//ok
List s = new ArrayList<Integer>();//ok
List s = new ArrayList();//ok

获取数组和字符串的长度(经常容易混淆)

int a[ ] = new int[5];

String b = "cef";

则分别的:a.length;和b.length(); 

String不是基本类型,java.lang.String类是final类型的,因此不可以继承且修改该类,为提高效率节省空间,我们应该使用StringBuffer或StringBuilder

判断下面程序执行过程创建了几个对象,分别在哪一行创建,且输出结果是什么

	public static void main(String args[]){
		String str = new String("good");//创建了两个对象
		String str1 = "good";//没有创建对象
		String str2 = new String("good");//创建了一个对象
		System.out.println(str == str1);//false
		System.out.println(str.equals(str2));//true
		System.out.println(str2 == str1);//false
	}

String、StringBuilder和StringBuffer的区别

String的长度是不可变的,StringBuilder和StringBuffer的长度是可变的。对于那些经常要进行操作的字符串,特别是内容要修改时,那么使用StringBuilder(线程不安全)或StringBuffer(线程安全),如果最后需要String,那么使用StringBuilder或StringBuffer的toString()方法

说明:深入理解JVM里面提到String的+操作是在编译阶段的字节码生成阶段替换成StringBuilder或StringBuffer的append()操作




你可能感兴趣的:(Java总结<一>)