java面试题复习(一)

Posted on 2018-01-31 17:19  菜不是假的菜  阅读(266)  评论(0编辑  收藏  举报

//基础最重要,如果面试官问一个答不上一个,那有难度的都都不用问了,直接就pass了,就像我,嘿嘿。

//每天最好熟记10个问题,这些问题在编程是会很厚帮助,帮你避免很多不应该出现的错误。

一、面向对象的特征

  先说说啥叫面向对象。这个对象可不是你谈的那个对象啊。我还记的我刚学Java的时候,老师说:“万物皆对象,但如果你敢在面试官面前这样说,就别想被录取了”。万物皆对象有点假大空的意思。解释对象时最好具体为一类事物。面向对象就是考虑这类对象具有的属性和功能。比面向过程更容易扩展补充。

抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。比如说有一群小脑斧,我们把他们的共同特征总结出来,而不是只关注其中一只小脑斧喜欢吃啥,是啥颜色等。

继承继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。注意子类只能继承父类的公共域和公共方法。通俗点说就是儿子可以继承爸爸愿意给他的东西,爸爸藏起来的就不能得到了。想想看儿子除了继承爸爸的东西,是不是还可以有自己的东西,所以一般在java中子类比父类更详细,具有的内容更多。

封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。比如用手机打电话时只需按几个键,而不需要关心手机是如何将号拨出去的。手机具体的操作细节就可以当成被封装起来了。

多态多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。java的引用变量有两种类型:编译时的类型,运行时的类型如果编译时的类型和运行时的类型不一致,就叫多态。简单来说就是编译时调用父类的方法,实际执行的是子类的方法,或者是父类表现出来的行为特性不像父类,像子类,这种现象叫多态。注意:属性不具有多态性。最常用到多态的是:父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为。

  方法重写:方法重写(override)实现的是运行时的多态性(也称为后绑定),子类继承父类并重写父类中已有的或抽象的方法,。注:和父类有相同的返回值

  方法重载:方法重载(overload)实现的是编译时的多态性(也称为前绑定),一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。注:参数必须不同,对返回值类型没有要求

二、public,private,protected,default (不写时默认就是这个)范围

从小到大private(类)<default(同一包下)<protected(子类公开)<public(公共)

三、String 是最基本的数据类型吗,String,StringBuffer,StringBulider的区别?

Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;(很重要,面试也会问基础数据类型)

 string是只读字符串,确定后就不变了,不能操作;stringBulider,stringBuffer的字符串可以直接被修改(增加删除字符都可以),stringBulider线程不安全,但速度快。一般来说都用StringBuffer。

四、基本数据类型操作

float f=2.8;//坑爹啊,竟然不对。记住像2.8之类的是双精度(double),把它赋值给float向下转型了,会出现精度损失,必须强制类型转换。

shout s=2;s=s+1和shout s=2;s+=2;哪个对?

2是int类型,s+1也是int型,必须强转类型;s+= 2;相当于s1= (short)(s+ 2);其中有隐含的强制类型转换

五、Java有没有goto,const;

当然有了,但目前没有用到,所以java把他们称为保留字。

六、==和equals的区别

==比较的是他们的引用地址是不是一样,eqluals比较的是值是否相等。偷点懒,就不new对象举例了,等到看内存堆栈部分再说)

七、基础类型和包装类

 原始类型: boolean,char,byte,short,int,long,float,double
包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

包装类型就是把基础类型变成了对象。而且java提供自动装箱拆箱

我偷了个题可以看看

public class Test {

    public static void main(String[] args) {

        Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;

        System.out.println(f1 == f2);

        System.out.println(f3 == f4);   }

}

答案的 true、flase;

因为:当我们给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf;

public static Integer valueOf(int i) {

    if (i >= IntegerCache.low && i <= IntegerCache.high)

        return IntegerCache.cache[i + (-IntegerCache.low)];

    return new Integer(i);

}

IntegerCache是Integer的内部类,其代码如下所示

private static class IntegerCache {

        static final int low = -128;

        static final int high;

        static final Integer cache[];

        static {

            // high value may be configured by property

            int h = 127;

            String integerCacheHighPropValue =

                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");

            if (integerCacheHighPropValue != null) {

                try {

                    int i = parseInt(integerCacheHighPropValue);

                    i = Math.max(i, 127);

                    // Maximum array size is Integer.MAX_VALUE

                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);

                } catch( NumberFormatException nfe) {

                    // If the property cannot be parsed into an int, ignore it.

                }

            }

            high = h;

            cache = new Integer[(high - low) + 1];

            int j = low;

            for(int k = 0; k < cache.length; k++)

                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)

            assert IntegerCache.high >= 127;

        }      private IntegerCache() {}

    }

代码看不懂没关系,记住整型字面量的值在-128到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象就够了。

八、逻辑操作符和条件操作符的区别

逻辑操作(&,|,^)、条件操作(&&,||)

逻辑操作符不仅可以操作布尔型还可以操作数值型;逻辑操作符不会短路

短路:如果&&左边的表达式的值是false,右边的表达式会被直接pass掉,就不用管它了

九、内存中的栈(stack)、堆(heap)和静态区(static area)

堆内存:

1、存储的全部是对象,每个对象都包含一个与之对应的class信息(class的目的是得到操作指令)

2、jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身

注:理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用

栈内存:

1、每个线程都有一个栈区,栈中保存对象的引用,还有就是函数调用的现场

2、每个栈中的数据都是私有的,其他栈不能访问(我的钱,别人不能取)

3、栈分为3个部分:基本变量区、执行环境上下文,操作指令区

4、栈小但操作快

注:”逃逸分析”:从Java 6的某个更新开始可以将一些局部对象放在栈上以提升对象的操作性能

静态区

存放字面量和常量

来  看这个  String str = new String("hello");

str放在栈,new出来的字符串放在堆 ,"hello"放在静态区

并且它创建了两个对象,一个静态区的,一个new创建在堆上的对象(可能会被问到)

十、switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?

swith现在除了long型不行,剩下的都可以了。(String--java7;enum--java5)

今天先到这了。/-==/

 

Copyright © 2024 菜不是假的菜
Powered by .NET 9.0 on Kubernetes