1. 面向对象的特征
面向对象的特征包括抽象、封装、继承和多态。
抽象就是忽略一个主题中与当前目标无关的某些方面,以便更加充分的注意到与当前目标有关的方面。抽象并不打算了解全部的问题,而只是其中的一部分,暂时不用考虑细节。抽象包括两个方面,第一是过程抽象,第二是数据抽象。
封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
封装了好处在于将变化进行了隔离,便于使用,提高了服用性,同时由于可以避免外部对于属性的直接访问,提高了安全性。
封装的原则:将不需要对外提供的内容都隐藏起来;把属性都隐藏,提供公共的方法对其访问。
private是一个权限修饰符,被private修饰的成员只在本类中有效。私有是封装的一种体现,但封装不仅仅是私有。
继承,继承是一种连接类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述性的方法,一个类可以从一个现有的类派生,新类继承了原始类的特性,新类称为子类或者派生类,原始类称为父类也叫基类。派生类可以从它的基类继承方法和实例变量,并且类可以增加或者修改新的方法,使其更适合特殊的需要。
多态,多态性是指允许不同类的对象对同一个消息做出响应,多态性包括参数化多态性和包含多态性,多态性语言具有灵活、抽象、行为共享和代码共享的优势,很好的解决了应用程序中函数同名的问题。
2. Overload和Override有什么区别
方法的重写overriding和重载Overloading是java多态性的不同表现。重写Overriding是父类和子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对他而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading).
3. abstract class 和 interface有什么区别?
抽象类用于创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。接口是抽象类的变体。在接口中,所有方法都是抽象的。抽象类的子类为他们的父类中的所有抽象方法提供实现,否则他们也是抽象类。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。
4. 当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用,对象的内容可以在被调用的方法中改变,但对象的引用是永远不会变的。
5. abstract的method是否可以同时是static,是否可以同时是native,是否可以是synchronized?
都不能。
abstract用来声明抽象的方法,抽象方法并没有方法类,不能被直接调用,必须在子类overriding后才能使用,所以访问被abstract修饰的方法依赖于具体的对象实例,而被static修饰的方法是被直接访问的,这就引发了逻辑中的冲突,同时还要注意,父类中是静态方法,子类中不能覆盖为非静态方法。
native修饰的方法是本地方法,该方法的实现由非java语言实现,比如c语言,一般用于java与外界语言交互或者与操作系统交互,native可以和除abstract之外的所有java标识符连用,因为native方法是有实现体的,只不过这些实现体是由非java语言实现的,但是abstract却是显明的指定这个方法是没有实现体的。
synchronized,用于防止多个线程同时调用一个对象的该方法,使用它的前提是该方法可以被对象直接调用的,显然和abstract不能同时连用。
6. 接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可继承实体类?
接口可以继承接口。抽象类可以实现接口,抽象类可以继承实体类,但前提是实体类必须有明确的构造函数。
7. Java关键字注意点
所有的java关键字都是小写的
goto和const是保留关键字,在java中没有使用
true,false,null不是严格意义上的关键字,而是文字常量
8. 数组
数组的两种初始化方式:静态初始化和动态初始化
动态初始化数组必须给出长度,否则将报"缺少数组维数"的错误
动态初始化二维数组时,可以只指定第一维德长度而不指定第二维的
当数组包含的元素是引用数据类型的时候,必须为每个元素实例化,否则在使用的时候会出现空指针异常。
9. float和double都不能进行精确运算。
例如2.0-1.1并不等于0.9,因为计算机使用的二进制并不能准备的表示浮点数
不能简单的使用四舍五入的方法解决上述问题
可以使用BigDecimal类来解决这个问题。
BigDecimal a1 = new BigDecimal(Double.toString(2.0));
BigDecimal a2 = new BigDecimal(Double.toString(1.1));
System.out.println(a1.subtract(a2).doubleValue());
10. 自增自减运算符陷阱
main(String[] args){
int j = 0;
for(int i = 0; i < 100; i++){
j = j ++;
}
System.out.println(j);//打印出来的结果是0,因为j = j++,jvm工作时,先运算j++然后将j自增之前的值赋给左侧的j
}
11. 字符与字符串陷阱
System.out.println("a" + "b");// ab, 字符串的拼接
System.out.println('a' + 'b');// 195, 字符a的ascii码加上b的ascii码
System.out.println("a" + 'b');// ab,字符b被转化成了字符串b
12. java中的异常处理机制的简单原理和应用
java程序违反了java的语义规则时,java虚拟机就会将发生的错误表示为一个异常。违反语义规则包括两种情况。一种是java类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException.另外一种情况就是java允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时使用throw关键字引发异常。所有的异常都是java.lang.Throwable的子类.
13. finalize方法是在垃圾回收器删除对象之前对这个对象调用的一个方法.
14. 什么时候使用assert?
通常在开发和测试时使用,在软件发布后关闭。
15. 构造函数
构造函数:构建创造对象时调用的函数,创建对象都必须要通过构造函数初始化。
作用:可以给对象进行初始化。
一个类中如果没有定义过构造函数,那么该类中会有一个默认的空参数构造函数,如果在类中定义了指定的构造函数,那么类中的默认构造函数就没有了。
一般函数和构造函数什么区别呢?
a. 构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化。
一般函数:对象创建后,需要函数功能时才调用。
b. 构造函数:对象创建时,会调用只调用一次。
一般函数:对象创建后,可以被调用多次。
什么时候定义构造函数呢?
在描述事物时,该事物一存在就具备的一些内容,这些内容都定义在构造函数中。
构造函数可以有多个,用于对不同的对象进行针对性的初始化.
多个构造函数在类中是以重载的形式来体现的。
细节:
1,构造函数如果完成了set功能。set方法是否需要。
2,一般函数不能直接调用构造函数。
3,构造函数如果前面加了void就变成了一般函数。
4,构造函数中是有return语句的,ps,可以利用这个特点来控制构造函数的初始化,比如if(age>10){return;}用来实现如果age>10那么就拒绝初始化.
16. this引用
当成员变量和局部变量重名,可以用关键字this来区分。如
Person(String name) { this.name = name; }
this : 代表对象。代表哪个对象呢?当前对象。
this就是所在函数所属对象的引用。
简单说:哪个对象调用了this所在的函数,this就代表哪个对象。
this也可以用于在构造函数中调用其他构造函数。
注意:只能定义在构造函数的第一行。因为初始化动作要先执行。
17. 字符串的拼接:
为连接n个字符串而重复的使用字符串连接操作符(+),需要n的平方级的时间。例如: s4 = s1 + s2 + s3;
不过如果被拼接的字符串都是字面量的话,java编译器在编译器就会将其优化。如: S4= "a" + "b" + "c";变异完成的时候S4的值就是"abc".