JAVA - 基础知识

1. Exception:

1) 分类:

a. 检查性异常(Runtime Exception):在编译时检查程序有没有一些程序员无法预见的异常,比如打开一个不存在的文件,程序员是不知道文件是否存在的。主要的检查性异常包括:

ClassNotFoundException: 程序在试图加载(import)类的时候,找不到相应的类;

CloneNotSupportedException: 调用Object类的clone方法时,无法实现Cloneable接口。

// TODO: add some more exception types here

异常描述
ArithmeticException 当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。
ArrayIndexOutOfBoundsException 用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。
ArrayStoreException 试图将错误类型的对象存储到一个对象数组时抛出的异常。
ClassCastException 当试图将对象强制转换为不是实例的子类时,抛出该异常。
IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。
IllegalMonitorStateException 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。
IllegalStateException 在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。
IllegalThreadStateException 线程没有处于请求操作所要求的适当状态时抛出的异常。
IndexOutOfBoundsException 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
NegativeArraySizeException 如果应用程序试图创建大小为负的数组,则抛出该异常。
NullPointerException 当应用程序试图在需要对象的地方使用 null 时,抛出该异常
NumberFormatException 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
SecurityException 由安全管理器抛出的异常,指示存在安全侵犯。
StringIndexOutOfBoundsException 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。
UnsupportedOperationException 当不支持请求的操作时,抛出该异常。

b. 运行性异常:程序员代码中的异常,比如访问数组的索引不存在,排序索引超范围,在需要使用对象的地方使用了null等。可以在编译时被忽略。

异常描述
ClassNotFoundException 应用程序试图加载类时,找不到相应的类,抛出该异常。
CloneNotSupportedException 当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。
IllegalAccessException 拒绝访问一个类的时候,抛出该异常。
InstantiationException 当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。
InterruptedException 一个线程被另一个线程中断,抛出该异常。
NoSuchFieldException 请求的变量不存在
NoSuchMethodException 请求的方法不存在

2) 捕获异常

1 try {
2     // program code
3 } catch (ExceptionName e1) {
4     // Catch block
5 } catch (ExceptionName e2) {
6     // Catch block
7 } finally {
8     // program code, exit
9 }

Tips:

a. catch可以捕获多种类型的Exception, 当第一个满足时执行catch block的code,当不满足时顺序向下判断是否符合后面的catch条件。

b. finally块不管try是否成功总会执行,可以在finally中运行些清理收尾善后等工作。

3) throws/throw

throws在方法签名的最后指定方法可以捕获的检查性异常;

throw抛出一个异常,可以是新实例化的或者刚捕获的。

2. 修饰符

1) 访问修饰符

a. 默认的(default):同一包(package)内可见。

b. 私有的(private):同一类(class)内可见。

c. 共有的(public):所有类可见。

d. 受保护的(protected):对同一包内的类和所有子类可见。

// TODO: add a chart to show the access right of each types

2) 非访问修饰符

a. static -- 静态变量:独立于对象,只有一份拷贝,也称为类变量;

              |- 静态方法:独立于对象,不能使用类的非静态变量,从参数列表得到数据。

b. Final  -- Final变量:显示初始化一次,不能指向不同的引用,但数据可以改变;

              |- Final方法:可以被子类继承,不能被子类修改;

              |- Final类: 不能被继承任何特性。

c. Abstract -- 抽象类:不能实例化对象,为了将来对该类进行扩充,可以包括抽象方法和费抽象方法。如果一个类包含抽象方法,必须声明为抽象类。

                  |- 抽象方法:没有任何实现的方法,继承抽象类的子类必须实现父类的所有抽象方法,否则也要声明为抽象类。抽象类可以不包含抽象方法。

d. Synchronized

e. Transient

f. Volatile

3. 运算符相关

类型的自动提升: short + int = int !-> short;

== 和 equals:

==:两个基本类型是否相等,如果是引用类型,则比较内存是否相同。

equals:比较两个独立的对象的值是否相等,也就是说即使它们的内存地址不同,值也可能是相同的。

What's more:

在赋值的时候,如果是基本类型,是在内存中为新变量开辟一块空间,并把原变量的值写入,这样对原变量的修改并不会影响新变量;如果是引用类型(类对象)的话,是将内存地址指向新的引用,对原变量的修改会导致新的也修改。

4. 原始数据类型和它的封装

拿int和Integer举例,int的默认值是0,Integer的默认值为null,这样Integer就可以区分变量赋值为0和未使用的情况。Integer提供了和整数相关的操作,Integer的MAX_VALUE和MIN_VALUE代表整型的最大值和最小值。

5. 取整相关:

ceil: up to integer

floor: down to integer

round = floor(x + 0.5)

6. 重写和重载

完全不同的概念,相同点仅仅是方法名称相同。不同点主要体现在参数列表,返回值,另外重写是继承下的概念。

重写:子类覆盖父类的方法,参数和返回值完全相同,只能比父类抛出更少的异常,访问权限更大。private不能重写。

重载:同一个类中有多个不同参数列表的同名方法,不能通过访问权限,返回类型,抛出异常进行重载。

构造器(Constructor)不能被继承,因此不能重写,可以重载。

7. 接口和抽象类的继承

接口可以继承接口(implements);

抽象类可以实现接口,也可以继承具体,可以有静态的main方法。

抽象类和具体类的唯一区别就是抽象类不能实例化,和允许抽象方法。

8. 面向对象的特征

封装、继承、抽象和多态

封装:高内聚,低耦合。对象是封装的最基本单位,对象的属性用变量定义,行为用方法定义,方法可以访问同一个对象中的变量。原则:把对同一事物进行操作的方法和数据放在同一个类中。e.g 人在黑板上画圈。这里画圈这个方法应该属于人,黑板和圈这三个对象的哪个呢?答案是圈。画圈这个动作是对圈的操作,人只是调用这个方法而已。

抽象:抽取出一些事物的相似和共性,然后把他们归为一个类。抽象包括行为抽象(方法)和状态抽象(变量)两个方面。抽象有利于剥离不关心或者不重要的特性,而只保留最关心的,当前需要什么就关注什么。

继承:在已实现的类基础上进行开发,可以加入新的内容,或者修改原来的内容,提高代码的可重用性和可扩展性。

多态:定义一个引用变量,并发出一个方法,这个变量不指定特定的类,这个方法执行的内容只有在运行的时候采确定。这样在不修改源代码的情况下,就可以让引用变量绑定到不同的类上,从而调用不同的方法,增强了灵活性和扩展性。

实现多态的机制是父类或者接口定义的引用变量可以指向子类或者具体实现的类的实例对象,这样在运行时,引用变量指向的实例对象确定后,调用的就是对象的方法,而不是引用变量类型中的方法。

9. Abstract Class和Interface:

抽象类不能创建实例对象。含有抽象方法的类一定是抽象类,抽象类中的方法不必都是抽象的。抽象类中的抽象方法要在子类中具体实现,如果子类中没有实现的抽象方法,子类也必须是抽象的。接口是抽象类的一种特例,接口中的所有方法必须都是抽象的,方法默认类型是public abstract,所有变量的默认类型是public static final。

两者的区别:

1> 抽象类中可以有构造方法, 接口不能有;

2> 抽象类中可以有普通的成员变量,接口的成员变量都是public static final类型的;

3> 抽象类中可以有非抽象的普通方法,public和protected类型的,接口中的方法都是抽象的;

4> 抽象类中可以有静态方法,接口不可以;

5> 抽象类中可以有静态成员变量,接口也可以但只能是public static final类型的;

6> 一个类可以继承多个接口,但只能继承一个抽象类。

在应用方面,接口在系统架构设计方面,用于定义模块之间的通信契约。抽象类在代码实现方面,可以实现代码的重用。

10. Inner Class和Static Nested Class

内部类就是在一个类的内部定义的类。内部类中不允许有静态成员变量,可以直接访问外部类中的方法。内部类可以定义在外部类的方法外面,或者定义在外部类的方法体中。定义在外部类的方法外的内部类,类似于外部类的一个成员变量,可以有四种访问类型,创建实例对象时,需要先创建外部类的对象,再创建内部类的对象。在外部类的方法体中的内部类,类似于该方法的局部变量,要先声明后才能用,不能被其他类访问,但可以传递给其他类。该内部类可以访问方法体中的局部变量,但必须加final修饰符。

在方法外部定义的内部类之前加Static,成为Static Nested Class,和static class没有什么区别,只在编程引用的时候有区别。static nested class不依赖外部类的实例变量,能访问外部类的static变量。外部类可以直接访问static nested class的名字,static nested class也可以直接访问外部类的static成员变量,不需要加前缀。

11. String,StringBuffer,StringBuilder

String不是最基本的数据类型,最基本的数据类型有boolean,byte,char,short,int,long,float,double。String对象时不可修改的,在执行s = s + "world"后,s指向的原始String对象并没有修改,只是s指向了新生成的String对象,原来的对象还在内存中。因此如果处理可变的String对象,可以用StringBuffer来实现。String有equals方法,StringBuffer没有。String是final类,不可继承。StringBuilder和StringBuffer都是可修改的字符串,区别是StringBuilder不是线程安全的,不能同步访问。String有length()方法,数组有length属性。javac在编译时将"a"+"b"+"c"+"d"直接相连生成一个字符串

12. try,finally,return

如果try中有return,finally里没有return,那么finally语句的执行时机在return的执行之后,返回之前。如果try和finally里都有return,执行finally的return,try的return不生效。

13. final,finally,finalize

final修饰符用于声明属性(属性不可变),方法(方法不可覆盖),类(类不可继承)。内部类要访问的局部变量必须声明为final。finally是异常处理语句结构中的一部分,表示总是执行。finalize是Object类的方法,在垃圾收集器执行时调用被回收类的该方法,可以覆盖此方法提供一些资源回收的方式,如关闭文件等。

14. 异常

1> 一般异常(普通异常):软件确定会发生的异常,可预见的,需要用try-catch处理,或者throws到上一级的方法中处理。

2> 程序异常(运行时异常):Runtime Exception,是编译通过但在运行时检查出的异常,比如NullPointerException,ArrayIndexOutOfBoundsException,ClassCastExceptoin等,都是程序员不可遇见,但需要修改的异常。

15. 集合框架

集合框架是为了统一JAVA中定义的数据结构,使之有更好的通用性。集合框架的结构分为接口,实现和算法。接口是一种基本的数据类型,不同的数据结构在此基础上进行不同的实现,所以实现指的就是不同的数据类型,比如ArrayList, LinkedList,HashMap等。算法就是数据结构中有用的计算,比如排序和算法。这里隐含着多态的概念,相同的方法在相同的接口上可以有不同的实现。

16. 常用的类,包和接口

1> 常用的类:Integer,String,StringBuffer,FileReader,FileWriter,BufferedReader,BufferedWriter;

2> 常用的包: java.lang,java.io,java.util,java.sql,javax.servlet。

java.lang:java的核心类库,包含了运行java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包。

java.io:java语言的标准输入/输出类库,如基本输入/输出流、文件输入/输出、过滤输入/输出流等等。

java.util:Java的实用工具类库Java.util包。在这个包中,Java提供了一些实用的方法和数据结构。例如,Java提供日期(Data)类、日历(Calendar)类来产生和获取日期及时间,提供随机数(Random)类产生各种类型的随机数,还提供了堆栈(Stack)、向量ector)、位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构。包含如处理时间的date类,处理变成数组的Vector类,以及stack和HashTable类。

java.sql:实现JDBC的类库。

javax.servlet:运行Servlet程序编译。

3> 常用的接口:Remote,List,Map,Document,NodeList,Servlet。

17. Stream

18. 堆(Heap)和栈(Stack)

栈内存是程序进入一个方法时,为该方法单独分配的一块存储空间,用于存放方法内部的局部变量。当方法结束后,分配给该方法的栈会释放。堆内存会放置不随方法的结束而消失的内容,比如new的对象,方法中final修饰的局部变量。

 

posted @ 2014-11-09 15:00  周葳  阅读(205)  评论(0编辑  收藏  举报