• Java 面试题代码类收集


            long temp=(int)3.9;
            System.out.println(temp);
            temp%=2;
            System.out.println(temp);
    3
    1
    View Code

    Java里面类的方法名可以与类名一样,与构造函数的区别是方法有返回值,构造函数没有。

    public class UserInfo {
    
        public UserInfo(){
    
        }
    
        public String UserInfo(){
            return "adf";
        }
    }

    这一点与net的不一样。

    携程2015年面试题目:

    /**
     * Created by qhong on 2017/2/5.
     */
    public class Base
    {
        private String baseName = "base";
        public Base()
        {
            callName();
        }
    
        public void callName()
        {
            System. out. println(baseName);
        }
    
        static class Sub extends Base
        {
            private String baseName = "sub";
            public void callName()
            {
                System. out. println (baseName) ;
            }
        }
        public static void main(String[] args)
        {
            Base b = new Sub();
        }
    }
    null
    View Code
    public class Main {
        public static void main(String[] args)   {
            Base b = new Base.Sub();
        }
    }
    
    class Base
    {
        private String baseName = "base";
        public Base()
        {
            System.out.println("fugou");
            callName();
        }
    
        public void callName()
        {
            System.out.println("fu");
            System. out. println(baseName);
        }
    
        static class Sub extends Base
        {
            private String baseName = "sub";
            public void callName()
            {
                System.out.println("zhi");
                System. out. println (baseName) ;
            }
        }
    
    }
    View Code
    fugou
    zhi
    null
    View Code

    可以发现,父类在初始化的时候调用的callName是子类的,这个时候子类中的变量baseName只是被声明,还未被赋值,所以输出null。

    构造器的初始化顺序大概是:父类静态块 ->子类静态块 ->父类初始化语句 ->父类构造函器 ->子类初始化语句-> 子类构造器

    4.

    public class NULL {
    
        public static void haha(){
            System.out.println("haha");
        }
        public static void main(String[] args) {
          ((NULL)null).haha();
    
        }
    }

    输出为haha,因为null值可以强制转换为任何java类类型,(String)null也是合法的。但null强制转换后是无效对象,其返回值还是为null,而static方法的调用是和类名绑定的,不借助对象进行访问所以能正确输出。

    反过来,没有static修饰就只能用对象进行访问,使用null调用对象肯定会报空指针错了。这里和C++很类似。

    5.

    public class Main {
        public static void main(String[] args)   {
            new HelloB();
        }
    }
    
    class HelloA {
    
        public HelloA() {
            System.out.println("HelloA");
        }
    
        { System.out.println("I'm A class"); }
    
        static { System.out.println("static A"); }
    }
    
    class HelloB extends HelloA {
        public HelloB() {
            System.out.println("HelloB");
        }
    
        { System.out.println("I'm B class"); }
    
        static { System.out.println("static B"); }
    }
    static A
    static B
    I'm A class
    HelloA
    I'm B class
    HelloB
    View Code

    这题很好,考查静态语句块、构造语句块(就是只有大括号的那块)以及构造函数的执行顺序。

    对象的初始化顺序:

    (1)类加载之后,按从上到下(从父类到子类)执行被static修饰的语句;

    (2)当static语句执行完之后,再执行main方法;

    (3)如果有语句new了自身的对象,将从上到下执行构造代码块、构造器(两者可以说绑定在一起)。

    6.

    public class Main {
        public static void main(String[] args)   {
            String s;
    
            System.out.println("s=" + s);
        }
    }

    开始以为会输出null什么的,运行后才发现Java中所有定义的基本类型或对象都必须初始化才能输出值。

    7.

    public class Main {
        public static void main(String[] args)   {
            Example ex = new Example();
    
            ex.change(ex.str, ex.ch);
    
            System.out.print(ex.str + " and ");
    
            System.out.print(ex.ch);
        }
    }
    
    class Example {
    
        String str = new String("good");
    
        char[] ch = { 'a', 'b', 'c' };
    
        public void change(String str, char ch[]) {
    
            str = "test ok";
    
            ch[0] = 'g';
        }
    }
    good and gbc
    View Code

    值参数指的是实参的地址的拷贝,得到这个拷贝地址后,你可以通过它修改这个地址的内容(引用不变),因为此时这个内容的地址和原地址是同一地址

    8.

    class People {
        String name;
    
        public People() {
            System.out.print(1);
        }
    
        public People(String name) {
            System.out.print(2);
            this.name = name;
        }
    }
    
    class Child extends People {
        People father;
    
        public Child(String name) {
            System.out.print(3);
            this.name = name;
            father = new People(name + ":F");
        }
    
        public Child() {
            System.out.print(4);
        }
        
    }

    132

    解析:考察的又是父类与子类的构造函数调用次序。在Java中,子类的构造过程中必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来。但如果父类有多个构造函数时,该如何选择调用呢?

    第一个规则:子类的构造过程中,必须调用其父类的构造方法。一个类,如果我们不写构造方法,那么编译器会帮我们加上一个默认的构造方法(就是没有参数的构造方法),但是如果你自己写了构造方法,那么编译器就不会给你添加了,所以有时候当你new一个子类对象的时候,肯定调用了子类的构造方法,但是如果在子类构造方法中我们并没有显示的调用基类的构造方法,如:super();  这样就会调用父类没有参数的构造方法。    

    第二个规则:如果子类的构造方法中既没有显示的调用基类构造方法,而基类中又没有无参的构造方法,则编译出错,所以,通常我们需要显示的:super(参数列表),来调用父类有参数的构造函数,此时无参的构造函数就不会被调用。

    总之,一句话:子类没有显示调用父类构造函数,不管子类构造函数是否带参数都默认调用父类无参的构造函数,若父类没有则编译出错。

    9.

    class Shape {
    
           public String name;
    
    }
    
    class Circle extends Shape implements Serializable{
    
           private float radius;
    
           transient int color;
    
           public static String type = "Circle";
    
    }

    在序列化一个Circle的对象circle到文件时,下面哪个字段会被保存到文件中?

    radius

    因为父类Shape没有继承Serializable,所以name不能被序列化。

    静态类不管是否有transient修饰,都不能序列化

    http://www.cnblogs.com/lanxuezaipiao/p/3369962.html

    ===============================================

    10.String,StringBuilder,StringBuffer

    package com.qhong.basic;
    
    public class StringTest {
        public static void main(String[] args) {
            String str1="hello";
            String str2="he"+new String("llo");
            System.err.println(str1==str2);
    
            //jvm对127及其以下的特殊处理
            Integer i1=1;
            Integer i2=1;
            System.err.println(i1==i2);
    
            Integer i3=128;
            Integer i4=128;
            System.err.println(i3==i4);
        }
    }

    Output:

    false
    true
    false

    http://www.cnblogs.com/dolphin0520/p/3778589.html

    11.

    http://blog.csdn.net/Two_Water/article/details/53891952

  • 相关阅读:
    Git: git tag 使用小结(给发布版本打标记,切换并修改某个历史版本)
    android: Android水波纹点击效果
    Flutter: 运行新项目报错
    FFmpeg编译:mac下编译iOS平台的FFmpeg库(支持armv7, arm64, i386, x86_64)
    Xcode: Xcode中Command Line Tools的安装方法
    win10: windows+E 改回打开我的电脑
    DialogFragment: DialogFragment的一些理解
    Android Studio: 查看SDK源代码
    HandlerThread: HandlerThread的理解
    Looper: Looper,Handler,MessageQueue三者之间的联系
  • 原文地址:https://www.cnblogs.com/hongdada/p/6368439.html
Copyright © 2020-2023  润新知