zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    配送单MYSQL ,一点都不机智
    强哥新周报SQL
    SQL 交叉连接与内连接
    pycharm git 提交使用情况
    MYSQL freedata 外联接
    SQL 添加字段
    邮件发送方法代码时
    调通有赞接口数据,翻页获取
    superset dashboard 设置自动刷新
    python 语法错误记录
  • 原文地址:https://www.cnblogs.com/gugumiao/p/7339601.html
Copyright © 2011-2022 走看看