JAVA相关问题整理(一)

为面试准备一下常见的面试题,好慌阿阿>///<

也算是边记录边学习了 fighting!!

1.面向对象和面向过程

面向过程
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展


面向对象
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
缺点:性能低。由于面向更高的逻辑抽象层,使得面向对象在实现的时候,不得不做出性能上面的牺牲,计算时间和空间存储大小的都开销很大

面向对象,用线性的思维。与面向过程相辅相成。在软件开发过程中,宏观上,用面向对象来把握事物间复杂的关系,分析系统。微观上,仍然使用面向过程。
比较喜欢的一个比喻就是 面向过程做出来的程序是一碗蛋炒饭,面向对象则是一碗盖浇饭啦~ 

2.Java的四个基本特性(抽象、封装、继承,多态)

抽象:就是把现实生活中的某一类东西提取出来,用程序代码表示,我们通常叫做类或者接口。抽象包括两个方面:一个是数据抽象,一个是过程抽象。数据抽象也就是对象的属性。过程抽象是对象的行为特征。
   abstract 用来修饰抽象类或者方法
   含有抽象方法的类必须被申明为抽象类 抽象类必须被继承,抽象类无法实例化!!!抽象的方法只要申明 无需实现!!实现的步骤留给子类!!因此必须被重写!!!

封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行封装隐藏。封装分为属性的封装和方法的封装。
就好像人类,可以具有name,sex,age等属性,同时也具有eat(),sleep()等行为,我们在行为中实现一定的功能,也可操作属性,这是面向对象的封装特性
继承:是对有着共同特性的多类事物,进行再抽象成一个类。这个类就是多类事物的父类。父类的意义在于抽取多类事物的共性。
继承就像是我们现实生活中的父子关系,儿子可以遗传父亲的一些特性,在面向对象语言中,就是一个类可以继承另一个类的一些特性,从而可以代码重用,其实继承体现的是is-a关系。
多态:允许不同类的对象对同一消息做出响应。方法的重载、类的覆盖正体现了多态。 注意:多态的存在!!要有继承!!有重写!!有父类引用指向子类的对象!!!

3.重载和重写的区别

重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private则子类中就不是重写

4.构造器

与类同名,构造器不能被重写,不能用static修饰构造器,只能用public private protected这三个权限修饰符,且不能有返回语句。

5.访问控制符

private只有在本类中才能访问;
public在任何地方都能访问;
protected在同包内的类及包外的子类能访问;
默认不写在同包内能访问。

6. String 、StringBuffer 、StringBuilder

可变性:

String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变的。

StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[] value,这两种对象都是可变的

线程安全性:

String中的对象是不可变的,也就可以理解为常量,线程安全。

AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。

StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

性能:

每次对String 类型进行改变的时候,都会生成一个新的String 对象,然后将指针指向新的String 对象。

StringBuffer每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。

相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

7.是否可以继承String类捏。

由上面可以知道 private final char value[] ,String类是final类故不可以继承,一切由final修饰过的都不能继承。

8.hashCode和equals方法的关系

equals相等,hashcode必相等;hashcode相等,equals可能不相等。

9.抽象类和接口

抽象类:主要用来类型隐藏,用动物类型来隐藏人/狗/老虎类型

              为什么用抽象类???

    定义成抽象类是为了以后要其子类来继承的,因为父类里有很多方法是无法定义具体的实现的,只能定义一个原型,让子类来分别实现!所以要定义成抽象的!

简单来说就是抽象类是在接口和实体类之间的一个桥梁 
例如 
做一个接口叫做飞行FlyAnimalAction,里面定义一个方法叫做flying,再定义一个方法叫做eat 
做一个类叫做蚊子实现接口,蚊子要实现flying方法,实现自己的eat方法 
做一个类叫做苍蝇实现接口,苍蝇也要实现flying方法,实现自己的eat方法 
你发现所有会飞的动物都要实现这个接口,很麻烦,不如 
做一个抽象类FlyAnimal,然后实现上面的接口 
在里面实现flying这个方法,因为大部分的飞行动作是一样的,而eat方法则继续写成抽象方法,因为大部分的动物吃东西是不一样的 
下面你再写蚊子类就简单了,可以直接继承这个抽象类,然后实现自己的吃方法就行了 
而且苍蝇类的制作也是一样,这个时候抽象类的功能就显示出来了,当然抽象类的功能远远不是这些,只是初期理解到这里就够了。

接口:Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。接口是一种特殊形式的抽象类。

       接口是抽象类的延伸,java了保证数据安全是不能多重继承的,也就是说继承只能存在一个父类,但是接口不同,一个类可以同时实现多个接口,不管这些接口之间有没有关系,所以接口弥补了抽象类不能多重继承的缺陷,但是推荐继承和接口共同使用,因为这样既可以保证数据安全性又可以实现多重继承。

      在使用接口过程中需要注意如下几个问题:

         1、一个Interface的方法访问权限自动被声明为public。确切的说只能为public,当然你可以显示的声明为protected、private,但是编译会出错!

         2、接口中可以定义“成员变量”,或者说是不可变的常量,因为接口中的“成员变量”会自动变为为public static final。可以通过类命名直接访问:ImplementClass.name。

         3、接口中不存在实现的方法。

         4、实现接口的非抽象类必须要实现该接口的所有方法。抽象类可以不用实现。

         5、不能使用new操作符实例化一个接口,但可以声明一个接口变量,该变量必须引用(refer to)一个实现该接口的类的对象。可以使用 instanceof 检查一个对象是否实现了某个特定的接口。例如:if(anObject instanceof Comparable){}。

         6、在实现多接口的时候一定要避免方法名的重复。

 抽象类和接口的区别!!

1.语法上的区别

2.抽象层次不同

     (1)抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。

     (2)抽象类所跨域的是具有相似特点的类,而接口却可以跨域不同的类。我们知道抽象类是从子类中发现公共部分,然后泛化成抽象类,子类继承该父类即可,但是接口不同。实现它的子类可以不存在任何关系,共同之处。例如猫、狗可以抽象成一个动物类抽象类,具备叫的方法。鸟、飞机可以实现飞Fly接口,具备飞的行为,这里我们总不能将鸟、飞机共用一个父类吧!

     (3)对于抽象类而言,它是自下而上来设计的,我们要先知道子类才能抽象出父类,而接口则不同,它根本就不需要知道子类的存在,只需要定义一个规则即可,至于什么子类、什么时候怎么实现它一概不知。

总结:

     1、 抽象类在java语言中所表示的是一种继承关系,一个子类只能存在一个父类,但是可以存在多个接口。

      2、 在抽象类中可以拥有自己的成员变量和非抽象类方法,但是接口中只能存在静态的不可变的成员数据(不过一般都不在接口中定义成员数据),而且它的所有方法都是抽象的。

      3、抽象类和接口所反映的设计理念是不同的,抽象类所代表的是“is-a”的关系,而接口所代表的是“like-a”的关系。

10.自动装箱与拆箱

装箱:将基本类型用它们对应的引用类型包装起来;
拆箱:将包装类型转换为基本数据类型;
Java使用自动装箱和拆箱机制,节省了常用数值的内存开销和创建对象的开销,提高了效率,由编译器来完成,编译器会在编译期根据语法决定是否进行装箱和拆箱动作

   基本类型:(8)

4种整型 
    byte      1字节           -128——127 
    short     2 字节         -32,768 —— 32,767 
    int       4 字节          -2,147,483,648 ——2,147,483,647(超过20亿) 
    long      8 字节   -9,223,372,036,854,775,808——9,223,372,036854,775,807 
2种浮点类型 
    float    4 字节         32位IEEE 754单精度(有效位数 6 – 7位) 
    double   8 字节         64位IEEE 754双精度(有效位数15位) 
1种Unicode编码的字符单元 
    char    2 字节          整个Unicode字符集 
1种真值类型 
    boolean    1 位             True或者false 

引用类型:

类class    自己创建的 String Integer```

接口interface 

数组array 

原文地址:https://www.cnblogs.com/gugumiao/p/7339601.html