java基础知识整理

1.JVM(虚拟机)的运行过程
代码的装入
代码的校验
代码的执行(解释执行)

2.反编译工具
JAD
FrontEnd

3.java中的常量
字符常量 a’ , ‘8’,'\u0027'
‘\r‘表示接受键盘输入,相当于按下了回车键;
‘\n‘是换行;
‘\t‘是制表符,相当于table键;
‘\b‘是退格键,相当于Back Space;
‘\‘‘是单引号,而‘\“‘是双引号;
‘\\‘是一个斜杠“\”。
字符串常量 “Hello World“,”123”, "Welcome \nXXX"
null常量 null常量只有一个值,用null表示,表示对象的引用为空

4.变量字节大小及有效取值范围
byte:  占用一个字节,数字大小为-27—27-1

short: 占用两个字节,数字大小为-215—215-1

int:   占用四个字节,数字大小为-231—231-1

long:  占用八个字节,数字大小为-263—263-1

float: 占用四个字节,数字大小为1.4E-45~3.4E+38 , -1.4E-45~-3.4E+38 。用二进制的指数形式表示一个浮点数的格式,如:101*22  , 101*2-3

double:占用八个字节,数字大小为4.9E-324~1.7E+308, -4.9E-324~-1.7E+308

char:占两个字节,数字大小为0—216-1,是unicode编码。字符的本来面目,我们为什么可以直接将一个数字赋给字符变量。

Boolean:占一个字节,其取值只有两个,truefalse

 

5.类型转化
自动类型转换(也叫隐式类型转换)
强制类型转换(也叫显式类型转换)
类型转换的原理及什么时候要用强制类型转换
表达式的数据类型自动提升
所有的byte型、short型和char的值将被提升到int型。
如果一个操作数是long型,计算结果就是long型;
如果一个操作数是float型,计算结果就是float型;
如果一个操作数是double型,计算结果就是double型。
分析 System.out.println(‘a’+1)与 System.out.println(“”+’a’+1) 的区别。结果分别是:98/a1

6.java中的运算符
运算符共分以下几种:
算术运算符
赋值运算符
比较运算符
逻辑运算符
移位运算符

7.位运算符
任何信息在计算机中都是以二进制的形式保存的,&,|,^除了可以作为逻辑运算符,也可以做为位算符,它们对两个操作数中的每一个二进制位都进行运算。
只有参加运算的两位都为1,&运算的结果才为1,否则就为0。
只有参加运算的两位都为0,|运算的结果才为0,否则就为1。
只有参加运算的两位不同,^运算的结果才为1,否则就为0。
我们可以对数据按二进制位进行移位操作,java的移位运算符有三种:
<< 左移
>> 右移
>>> 无符号右移

8.移位运算的注意事项及小技巧
移位运算符适用类型有byte、short、char、int、long
对低于int型的操作数将先自动转换为int型再移位。
对于int型整数移位a>>b,系统先将b对32取模,得到的结果才是真正移位的位数。例如:a>>33和a>>1结果是一样的,a>>32的结果还是a原来的数字。
对于long型整数移位时a>>b ,则是先将移位位数b对64取模。
移位不会改变变量本身的值。如a>>1;在一行语句中单独存在,毫无意义 。
x>>1的结果和x/2的结果是一样的,x<<2和x*4的结果也是一样的。总之,一个数左移n位,就是等于这个数乘以2的n次方,一个数右移n位,就是等于这个数除以2的n次方。请思考:如何用程序实现求2的x次方。答案:y = 1<< x;

9.程序的流程控制
顺序结构
选择结构
循环结构

10.switch语句的选择结构
Switch (表达式)
{
   case 常量表达式1:语句1;
   case 常量表达式2:语句2;
    …
   case 常量表达式n:语句n;
   default: 语句n;
}
default语句是可选的,它接受除上面接受值的其他值,通俗的讲,就是谁也不要的都归它。
case后面可以跟多个语句,这些语句可以不用大括号括起来 。
switch语句判断条件可接受int, byte, char, short型,不可以接受其他类型
一旦碰到第一次case匹配,就会开始顺序执行以后所有的程序代码,而不管后面的case条件是否匹配,后面case条件下的代码都会被执行,直到碰到break语句为止。我们可以利用这个特点来用同一段语句处理多个case条件

11.与数组操作相关的函数
使用System.arraycopy()函数拷贝数组
用Arrays.sort 来排序数组

12.对象的产生
当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外的都是变量类型都是引用类型。

13.匿名对象
我们也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象, 如:new Person().shout();
如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
我们经常将匿名对象作为实参传递给一个函数调用。

14.实现类的封装性
如果外面的程序可以随意修改一个类的成员变量,会造成不可预料的程序错误,就象一个人的身高,不能被外部随意修改,只能通过各种摄取营养的方法去修改这个属性。
在定义一个类的成员(包括变量和方法)时,使用private关键字说明这个成员的访问权限,这个成员成了类的私有成员,只能被这个类的其他成员方法调用,而不能被其他的类中的方法所调用。

为了实现良好的封装性,我们通常将类的成员变量声明为private,再通过public的方法来对这个变量进行访问。对一个变量的操作,一般都有读取和赋值操作,我们分别定义两个方法来实现这两种操作,一个是getXxx()(Xxx表示要访问的成员变量的名字),用来读取这个成员变量操作,另外一个是setXxx()用来对这个成员变量赋值。
一个类通常就是一个小的模块,我们应该让模块仅仅公开必须要让外界知道的内容,而隐藏其它一切内容。我们在进行程序的详细设计时,应尽量避免一个模块直接修改或操作另一个模块的数据,模块设计追求强内聚(许多功能尽量在类的内部独立完成,不让外面干预),弱耦合(提供给外部尽量少的方法调用)。

15.类的封装所带来的优点
隐藏类的实现细节;
让使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
便于修改,增强代码的可维护性;

16.构造函数的定义与作用
构造方法的特征
它具有与类相同的名称;
它不含返回值;
它不能在方法中用return语句返回一个值
注意:在构造方法里不含返回值的概念是不同于“void”的,在定义构造方法时加了“void”,结果这个方法就不再被自动调用了。
构造方法的作用:当一个类的实例对象刚产生时,这个类的构造方法就会被自动调用,我们可以在这个方法中加入要完成初始化工作的代码。这就好像我们规定每个“人”一出生就必须先洗澡,我们就可以在“人”的构造方法中加入完成“洗澡”的程序代码,于是每个“人”一出生就会自动完成“洗澡”,程序就不必再在每个人刚出生时一个一个地告诉他们要“洗澡”了。  

17.构造方法的一些细节
在java每个类里都至少有一个构造方法,如果程序员没有在一个类里定义构造方法,系统会自动为这个类产生一个默认的构造方法,这个默认构造方法没有参数,在其方法体中也没有任何代码,即什么也不做。
由于系统提供的默认构造方法往往不能满足编程者的需求,我们可以自己定义类的构造方法,来满足我们的需要,一旦编程者为该类定义了构造方法,系统就不再提供默认的构造方法了。
声明构造方法,如无特殊需要,应使用public关键字

18.this引用句柄的存放位置
每个成员方法内部,都有一个this引用变量,指向调用这个方法的对象.

19.函数的参数传递   
—基本数据类型的参数传递
—引用数据类型的参数传递

20.static静态变量
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。

21.static静态方法
在静态方法里只能直接调用同类中其它的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。
静态方法不能以任何方式引用this和super关键字(super关键字在下一章讲解)。与上面的道理一样,因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时,this所引用的对象根本就没有产生。
main() 方法是静态的,因此JVM在执行main方法时不创建main方法所在的类的实例对象,因而在main()方法中,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员,这种情况,我们在以后的例子中会多次碰到。

22.静态代码块
一个类中可以使用不包含在任何方法体中的静态代码块(static block ),当类被载入时,静态代码块被执行,且只被执行一次,静态块经常用来进行类属性的初始化。
类中的静态代码块被自动执行,尽管我们产生了类的多个实例对象,但其中的静态代码块只被执行了一次。当一个程序中用到了其他的类,类是在第一次被使用的时候才被装载,而不是在程序启动时就装载程序中所有可能要用到的类。

23.单态设计模式
所谓类的单态设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为private,这样,就不能用new 操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。

24.理解main方法的语法
由于java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public,又因为java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static的,该方法接收一个String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数。

25.内部类 —在类中直接定义的内部类
嵌套类可以直接访问嵌套它的类的成员,包括private成员,但是嵌套类的成员却不能被嵌套它的类直接访问。
在内部类对象保存了一个对外部类对象的引用,当内部类的成员方法中访问某一变量时,如果在该方法和内部类中都没有定义过这个变量,内部类中对this的引用会被传递给那个外部类对象的引用。

如果用static修饰一个内部类,这个类就相当于是一个外部定义的类,所以static的内部类中可声明static成员,但是,非static的内部类中的成员是不能声明为static的。static的内部类不能再使用外层封装类的非static的成员变量,这个道理不难想象!所以static嵌套类很少使用。

26.如果函数的局部变量(函数的形参也是局部变量),内部类的成员变量,外部类的成员变量重名,我们应该按下面的程序代码所使用的方式来明确指定我们真正要访问的变量。
public class Outer
{
private int size;
   public class Inner
{    
   private int size;    
   public void doStuff( int size)
   {    
    size++; // 引用的是doStuff函数的形参
    this.size++; //引用的是Inner类中的成员变量
    Outer.this.size++; // 引用的Outer类中的成员变量
}
}
}

27.内部类如何被外部引用
public class Outer {
private int size=1;
public class Inner {
    private int size=2;
    public void doStuff(int size) {
      size++; // 引用的是doStuff函数的形参
      this.size++; // 引用的是Inner类中的成员变量
      Outer.this.size++; // 引用的Outer类中的成员变量
      System.out.println(size+"-"+this.size+"-"+Outer.this.size);//2-3-2
    }
}

public static void main(String[] args) {
    Outer outer = new Outer();
    Outer.Inner inner = outer.new Inner();
    inner.doStuff(1);
}
}

28.内部类 —在方法中定义的内部类
嵌套类并非只能在类里定义,也可以在几个程序块的范围之内定义内部类。例如,在方法中,或甚至在for循环体内部,都可以定义嵌套类 。
在方法中定义的内部类只能访问方法中的final类型的局部变量,用final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期。

29.类的继承
通过继承可以简化类的定义 。
Java只支持单继承,不允许多重继承。
可以有多层继承,即一个类可以继承某一个类的子类,如类B继承了类A,类C又可以继承类B,那么类C也间接继承了类A。
子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法。在子类的构造方法中可使用语句super(参数列表) 调用父类的构造方法。
如果子类的构造方法中没有显式地调用父类构造方法,也没有使用this关键字调用重载的其它构造方法,则在产生子类的实例对象时,系统默认调用父类无参数的构造方法。

30.子类对象的实例化过程
分配成员变量的存储空间并进行默认的初始化,就是用new关键字产生对象后,对类中的成员变量按第三章的表3.1中的对应关系对对象中的成员变量进行初始化赋值。
绑定构造方法参数,就是new Person(实际参数列表)中所传递进的参数赋值给构造方法中的形式参数变量。
如有this()调用,则调用相应的重载构造方法(被调用的重载构造方法又从步骤2开始执行这些流程),被调用的重载构造方法的执行流程结束后,回到当前构造方法,当前构造方法直接跳转到步骤6执行
显式或隐式追溯调用父类的构造方法(一直到Object类为止,Object是所有Java类的最顶层父类,在本章后面部分有详细讲解),父类的构造方法又从步骤2开始对父类执行这些流程,父类的构造方法的执行流程结束后,回到当前构造方法,当前构造方法继续往下执行。
进行实例变量的显式初始化操作,也就是执行在定义成员变量时就对其进行赋值的语句,如:
执行当前构造方法的方法体中的程序代码

31.覆盖父类的方法
覆盖方法必须和被覆盖方法具有相同的方法名称、参数列表和返回值类型。
如果在子类中想调用父类中的那个被覆盖的方法,我们可以用super.方法的格式 。
覆盖方法时,不能使用比父类中被覆盖的方法更严格的访问权限 。

32.final关键字
在Java中声明类、属性和方法时,可使用关键字final来修饰。
final标记的类不能被继承。
final标记的方法不能被子类重写。
final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次。
方法中定义的内置类只能访问该方法内的final类型的局部变量,用final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期,将一个形参定义成final也是可以的,这就限定了我们在方法中修改形式参数的值。
public static final共同标记常量时,这个常量就成了全局的常量。

33.抽象类
java中可以定义一些不含方法体的方法,它的方法体的实现交给该类的子类根据自己的情况去实现,这样的方法就是抽象方法,包含抽象方法的类就叫抽象类。
抽象类必须用abstract关键字来修饰;抽象方法也必须用abstract来修饰。
抽象类不能被实例化,也就是不能用new关键字去产生对象。
抽象方法只需声明,而不需实现。
含有抽象方法的类必须被声明为抽象类,抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个子类还是个抽象类。

34.接口(interface)
如果一个抽象类中的所有方法都是抽象的,我们就可以将这个类用另外一种方式来定义,也就是接口定义。接口是抽象方法和常量值的定义的集合,从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
接口中的成员都是public访问类型的。接口里的变量默认是用public static final标识的 。
我们可以定义一个新的接口用extends关键字去继承一个已有的接口
我们也可以定义一个类用implements关键字去实现一个接口中的所有方法,我们还可以去定义一个抽象类用implements关键字去实现一个接口中定义的部分方法。
一个类可以继承一个父类的同时,实现一个或多个接口,extends关键字必须位于implemnets关键字之前 。

35.对象的类型转换
子类对象可以自动转换成父类
父类转换成子类必须使用强制转换。
instanceof 操作符可以用它来判断一个实例对象是否属于一个类。
Object类及equals方法

36.面向对象的多态性
1).应用程序不必为每一个派生类(子类)编写功能调用,只需要对抽象基类进行处理即可。这一招叫“以不变应万变”,可以大大提高程序的可复用性。
2). 派生类的功能可以被基类的引用变量引用,这叫向后兼容,可以提高程序的可扩充性和可维护性。以前写的程序可以被后来程序调用不足为奇,现在写的程序(如callA方法)能调用以后写的程序(以后编写的一个类A的子类, 如类D)就了不起了。

37.异常
异常定义了程序中遇到的非致命的错误, 而不是编译时的语法错误,如程序要打开一个不存的文件、网络连接中断、操作数越界、装载一个不存在的类等。
try,catch语句
throws关键字
自定义异常与Throw关键字
如何对多个异常作出处理
我们可以在一个方法中使用throw,try…catch语句来实现程序的跳转
一个方法被覆盖时,覆盖它的方法必须扔出相同的异常或异常的子类。
如果父类扔出多个异常,那么重写(覆盖)方法必须扔出那些异常的一个子集,也就是说不能扔出新的异常。

38.访问控制
类本身也有访问控制,即在定义类的class关键字前加上访问控制符,但类本身只有两种访问控制,即public 和默认,父类不能是private 和 protected,否则子类无法继承。public修饰的类能被所有的类访问,默认修饰(即class关键字前没有访问控制符)的类,只能被同一包中的所有类访问。

39.使用jar文件
jar –cvf
jar –tvf
jar –xvf
jar –tvf >a.txt
用rar查看jar文件中的内容
注意压缩后的jar文件中的目录结构
快速查看jar包中是否有我们想找的类

40.反编译工具:jad,frontend

你可能感兴趣的:(java,设计模式,数据结构,编程,虚拟机)