JAVA - 基础知识
1. Exception:
1) 分类:
a. 检查性异常:在编译时检查程序有没有一些程序员无法预见的异常,比如打开一个不存在的文件,程序员是不知道文件是否存在的。主要的检查性异常包括:
ClassNotFoundException: 程序在试图加载(import)类的时候,找不到相应的类;
CloneNotSupportedException: 调用Object类的clone方法时,无法实现Cloneable接口。
// TODO: add some more exception types here
b. 运行性异常:程序员代码中的异常,比如访问数组的索引不存在,排序索引超范围,在需要使用对象的地方使用了null等。可以在编译时被忽略。
// TODO: add runtime exception types here
2) 捕获异常
try {
// program code
} catch (ExceptionName e1) {
// Catch block
} catch (ExceptionName e2) {
// Catch block
} finally {
// program code
}
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等,都是程序员不可遇见,但需要修改的异常。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。