• java面试题002


    1、判断下列代码的运行情况

    public class TestExtends {
        public static void main(String[] args) {
            Father obj = new Son();
            System.out.println(obj.getEle());
        }
    }
    
    class Father{
        public int getEle(){
            return 1;
        }
    }
    class Son extends Father{
        public float getEle(){
            return 2f;
        }
    }

    答案:编译出错。原因是函数不能以返回值来区分,虽然父类与子类中的函数有着不同的返回值,但是它们有着相同的函数名,因此编译器无法区分。

    2、抽象方法权限标识只能由public or protected修饰【注:可以不进行权限修饰-为default】。

    3、接口中的方法只能由public,abstract修饰。

    4、内部类都有哪些,它们的特性分别是什么?

    内部类分为四种:静态内部类、成员内部类、局部内部类和匿名内部类。

    ①静态内部类被static修饰,可以不依赖外部实例而被实例化,不能和外部类有相同的名字,不能访问外部类的非静态成员。

    ②成员内部类可以自由的引用外部成员变量和方法(包括私有)

    ③局部内部类不能被public等权限修饰符及static修饰

    ④匿名内部类不能使用class、extends、implements,没有构造函数,必须继承类或者实现接口,由此只能创建一个匿名内部类实例。另外局部内部类约束同样适用匿名内部类。

    5、如何获取父类的类名?

    答:使用getClass().getSuperclass().getName()。

    :为什么不能使用super.getClass().getName(),解释如下:

    getClass()方法在Object类中被定义为final和native,子类不能覆盖该方法。所以this.getClass()和super.getClass()都是调用了Object的getClass(),而Object的getClass的释义是返回Object的正在运行的类。

    6、为什么要有super关键字?

    对于子类集成父类的例子中,如果子类覆盖了父类的方法,如果想要调用父类原来的方法就必须使用super进行调用。

    7、super错误使用样例:

    class Father{
        public Father(){
            System.out.println("老爸在这");
        }
    }
    class Son extends Father{
        public Son(){
            System.out.println("儿子在这~");
            super();
        }
    }

    解释:会出现编译错误,super()必须为子类构造函数中的第一条语句。

    8、值传递和引用传递的区别有哪些?

    值传递:在方法调用中,实参会把它的值传递给形参,形参只是用实参的值初始化一个临时存储单元,因此形参与实参虽然有着相同的值,却是不同的存储单元,因此对形参的改变不会影响实参的值。

    引用传递:在方法调用中,传递的是对象【的地址】,这时形参与实参指向的存储单元相同,因此会影响实参的值。 

    看下面一段代码,是否有疑惑呢?

        public static void main(String[] args) throws InstantiationException, IllegalAccessException {
            StringBuffer s1 = new StringBuffer("Hello ");
            StringBuffer s2 = new StringBuffer("Hi ");
            changeSB(s1,s2);
            System.out.println(s1);
            System.out.println(s2);
            
        }
    
        private static void changeSB(StringBuffer s1, StringBuffer s2) {
            s1.append("Kevin");
            s2 = s1;
            System.out.println("method inner"+s2);
        }

    代码输出结果为:

    method innerHello Kevin
    Hello Kevin
    Hi

    这里是按值传递的,append方法会修改ss1所指向字符串的值,而执行changeSB中的ss2=ss1只会修改ss2的值而不会修改s2的值。

    9、运算符优先级

    括号 > 正负符号、自运算、取反、非 > 算术运算 > 位运算 > 比较逻辑运算 > 判等逻辑运算 > 逻辑与、或、异或 > 逻辑双 与、或 > 三目运算 > 赋值运算 、运算赋值运算

     10、判断下面代码输出的结果

    1         String s1 = "abc";
    2         String s2 = "abc";
    3         String s3 = new String("abc");
    4         System.out.println("s1==s2? "+(s1==s2));
    5         System.out.println("s1==s2? "+s1==s2);
    6         System.out.println("s1==s3? "+(s1==s3)); 

    输出结果如下:

    s1==s2? true
    false
    s1==s3? false

    解释:①s1和s2指向常量池中的同一个字符串常量;②首先执行了字符串+运算[优先级问题]③new出来的对象都会在堆中开辟内存空间,所以s1和s3指向不同,这里使用equals方法判断值相等。

  • 相关阅读:
    IE9的css hack
    ie6 插入图片img png24 阴影
    clear:both; overflow:hidden
    ie6 背景图片 png24 阴影
    html 页面定位
    IE无法显示PNG
    行内元素 & 块元素
    div+css布局时的浏览器兼容问题
    删除源代码的管理信息(VSS)
    string path;
  • 原文地址:https://www.cnblogs.com/sunshinekevin/p/9081552.html
Copyright © 2020-2023  润新知