10道刚面试过的面试题给大家看看吧

1.面向对象的特征有哪些方面

答:面向对象的特征主要有以下几个方面

抽象抽象是将一类对象的共同特征总结出来创造类的过程,包括数据抽象和行为抽象两方面抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么

继承继承是从已有类得到继承信息创建新类的过程,提供继承信息的类被称为父类(超类基类)得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。

多态性多态性是指运行不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用同样的方法但是做了不同的事情多态性分为编译时的多态性和运行时的多态性。如果将对象的犯法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的就像电动剃须刀时A系统,它的供电系统时B系统,B系统可以使用电池通电或者用交流点,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但是并不知道供电系统底层实现时什么究竟通过何种方式获得了动力 方法重载Overload 实现的是编译时的多态性 也称为前绑定 而方法重写 override 实现的是运行时的多态性 也成为 后绑定 运行时的多态是面向对象最精髓的东西 要实现多态需要做两件事情 方法重写 子类继承父类并重写父类中已有的或抽象的方法 对象造型 用父类型引用子类型对象 这样同样的调用同样的犯法就会根据子类对象的不同而表现出不同的行为

2.访问修饰符 public private protected 以及不写(默认)时的区别?

public 公开的 当前类 同包下 子类 其他包  都可以访问

protected 受保护的 对不是同一包中的没有父子关系的类相当于私有的 不可访问

default 类的称为不写访问修饰符默认为 default 默认对于同一个包中的其他类相当于公开的public 对于不是同一个包中的其他类相当于私有的

private 私有的 只有本类可以访问 其他类不可以访问。

3.String是最基本的数据类型吗?

不是,Java中的基本数据类型只有8个 byte, short, int ,long ,float, double ,char,boolean 除了基本类型和枚举类型 剩下的都是引用类型

4.float f=3.4 是否正确?

不正确,3.4是双精度数 将双精度型 double 赋值给浮点型 float 属于下转型 down-casting 也成为窄化 会造成精度损失 因此需要强制类型转换float f=(float)3.4 ;或者写成 float f=3.4F

5.short s1=1;s1=s1+1;有错吗? short s1=1;s1+=1; 有错吗?

对于short s1=1 ,s1=s1+1 由于1是int类型 因此s1+1运算结果也是int 型,需要强制转换类型才能赋值给short型 而short s1=1;s1+=1;可以正确编译,因为s1+=1;相当于s1=(short)(s1+1);其中有隐含的强制类型转换

6.Java有没有goto?

goto是Java中的保留字,目前版本的Java中没有使用

7.int和Integer有什么区别?

Java是一个近乎纯洁的面向对象编程语言 但是为了编程的方便还是引入了基本数据类型 但是为了能够将这些基本数据类当做对象操作 Java为每一个基本数据类型都引入了对应的包装类型 int的包装类就是Integer 从Java5 开始引入了自动装箱和拆箱机制 使得二者可以互相转换

Java为每个原始类型提供了包装类型

原始类型:boolean char byte short int long float double

包装类型 Boolean Character Byte Short Integer Long Float Double

public static void main(String []args){

 Integer a=new Integer(3);

Integer b=3; //将3自动装箱成Integer类型

int c=3;

System.out.println(a==b);//false 两个引用没有引用同一对象

System.out.println(a==c);//true a自动拆箱成int类型在和c比较

}

还有一道题 也是和自动装箱和拆箱有点关系的

public class Test03{

     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);

     }

}

首先需要注意的是f1,f2,f3,f4四个变量都是Integer对象引用 所以下面的==运算比较的不是值而是引用 装箱的本质是什么 当我们给一个Integer对象赋一个int值的时候 会调用 Integer类的静态方法 valueof 如果看看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对象,所以上面的面试题中f1==f2的结果是true 而f3==f4的结果是false

提醒:越是貌似简单的面试题其中的玄机就越多 需要面试者有相当深厚的功力

8.&和&&的区别?

&运算符有两种用户 1按位与 2逻辑与 &&运算符是短路与运算 逻辑与跟短路与的差别非常巨大 虽然二者都是要求运算符左右两端的布尔值都是true 整个表达式才是true &&之所以成为短路运算符是因为如果左边的表达式值是false 右边的表达式会被直接短路掉 不会进行运算 很多时候我们可能都需要用&&而不是& 逻辑或运算符和短路或运算符的差别也是如此

9.解释内存中的栈(stack) 堆(heap)和静态区 (static area)的用法

通常我们定义一个基本数据类型的变量一个对象的引用 还有就是函数调用的现场保存都使用内存中的栈空间,而通过new关键字和构造器创建的对象放在堆空间 程序中的字面量 如直接书写的100 hello 和常量都放在静态区 栈空间操作起来最快但是栈很小 通常大量的对象都是放在堆空间 理论上真个内存没有内其他进程使用的空间甚至硬盘上的虚拟空间内存都可以被当成堆空间来使用

String str=new String("hello");

上面的语句中变量str放在栈上 用new创建出来的字符串对象放在堆上 而hello这个字面量放在静态区

10.Math.round(11.5)等于多少?Math.round(-11.5)等于多少?

Math.round(11.5)的返回值是12 Math.round(-11.5)的返回值是-11 四舍五入的原理是在参数上加0.5然后进行下取整。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值