牛客网做题5.26

5.26

(1)a = Integer.parseInt("1024");

         b = Integer.valueOf("1024").intValue();

下述说法正确的是

a和b都是整数类型变量并且它们的值相等。

intValue()是把Integer对象类型变成int的基础数据类型; 
parseInt()是把String 变成int的基础数据类型; 
Valueof()是把String 转化成Integer对象类型;(现在JDK版本支持自动装箱拆箱了。)
本题:parseInt得到的是基础数据类型int,valueof得到的是装箱数据类型Integer,然后再通过valueInt转换成int,所以选择D

(2)单例模式中,两个基本要点是 

构造函数私有
唯一实例

通常单例模式在Java语言中,有两种构造方式:

1.懒汉方式。指全局的单例实例在第一次被使用时构建。


//懒汉式
public class Singleton2 {
private static Singleton2 INSTANCE=null;  //另外这种写法在多线程下可能会阻塞,所以还有一种优化写法,就是用volatile修饰INSTANCE,然后在getInstance()方法里的if(INSTANCE == null)判断中再做一次if判断.

private Singleton2(){}

public static Singleton2 getInstance(){
if(INSTANCE ==null){
INSTANCE = new Singleton2();
}
return INSTANCE;
}
}

2.饿汉方式。指全局的单例实例在类装载时构建。


//饿汉式
public class Singleton {
private final static Singleton INSTANCE = new Singleton();

private Singleton(){}

public static Singleton getInstance(){
return INSTANCE;
}
}

(3)下列正确的有

call by value不会改变实际参数的数值
call by reference不能改变实际参数的参考地址
call by reference能改变实际参数的内容

引用数据类型是引用传递(call by reference),基本数据类型是值传递(call by value)

值传递不可以改变原变量的内容和地址---》原因是java方法的形参传递都是传递原变量的副本,在方法中改变的是副本的值,而不适合原变量的

引用传递不可以改变原变量的地址,但可以改变原变量的内容---》原因是当副本的引用改变时,原变量 的引用并没有发生变化,当副本改变内容时,由于副本引用指向的是原变量的地址空间,所以,原变量的内容发生变化。

结论:1.值传递不可以改变原变量的内容和地址;

           2.引用传递不可以改变原变量的地址,但可以改变原变量的内容;

(4)Java中涉及到byte、short和char类型都可以强制转化为int

(5)public static void main(String[] args) OR public static void main(String args[])。这是Java规范,这是JVM决定的。java执行程序某个类时,首先执行的就是main方法,而执行方式就是类名+方法名,所以必须是public static,规范要求必须传入一个String[]作为参数,这个String数组的名字无关紧要,这个数组用来装命令行传入main方法的参数用,例如:  java    HelloWord 1 2 3,那么args.length==3了。具体的机制需要对JVM有一定了解,所有必须对JVM进行相当程度的学习才能更好的掌握Java运行机制

(6)

class Car extends Vehicle

{

    public static void main (String[] args)

    {

        new  Car(). run();

    }

    private final void run()

    {

        System. out. println ("Car");

    }

}

class Vehicle

{

    private final void run()

    {

        System. out. println("Vehicle");

    }

}

下列哪些针对代码运行结果的描述是正确的?

Car

解析:

此题的父类方法有private修饰,所以对子类不可见,子类不能覆盖。所以子类方法和父类是两个方法。

扩展:如果父类方法将private改为public 会怎样?

        会报错,因为父类方法有final修饰,不能被覆盖。

(7)下面的快排的输出结果是从大到小

//看我的注释这种快排的思路就很清晰了,这是只从一个方向遍历的快排

public class A2 {

    public static void main(String[] args) {

        int[] a = { 2, 4, 6, 8, 3, 6, 9, 12 };

        quickSort(a, 0, a.length - 1);

        for (int i = 0; i <= a.length - 1; i++)

            System.out.print(a[i] + " ");

    }

    private static void quickSort(int[] a, int start, int end) {

        if (start < end) {

            int p = core(a, start, end);

            quickSort(a, start, p - 1);

            quickSort(a, p + 1, end);

        }

    }

    private static int core(int[] a, int start, int end) {

        int x = a[end];

        int i = start;  //记录遍历完后最后一个数应该放在的位置,初始就是start,因为如果前面没有数比最后一个数大,那么下面遍历完后最后一个数就应该放在start的位置

        for (int j = start; j <= end - 1; j++) { //遍历的目的是把参与排序的这轮数中比最后一个数大的数都放到最后一个数前面

            if (a[j] >= x) {

                swap(a, i, j);  

                i++;  //每遇到一个比最后一个数大的数,最后一个数应该放的位置就+1

            }

}

        swap(a, i, end); //这里一交换后就把最后一个数放在了正确的位置,这样左边的数都比最后一个数大,右边的数都比最后一个数小

        return i;

    }

    private static void swap(int[] a, int i, int j) {

        int tmp = a[i];

        a[i] = a[j];

        a[j] = tmp;

    }

}

(8)

在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long、float、double类型不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。
注意:String类型是Java7开始支持的。

(9)

1.对于外部类而言,它也可以使用访问控制符修饰,但外部类只能有两种访问控制级别: public 和默认。因为外部类没有处于任何类的内部,也就没有其所在类的内部、所在类的子类两个范围,因此 private 和 protected 访问控制符对外部类没有意义。

2.内部类的上一级程序单元是外部类,它具有 4 个作用域:同一个类( private )、同一个包( protected )和任何位置( public )。

3. 因为局部成员的作用域是所在方法,其他程序单元永远不可能访问另一个方法中的局部变量,所以所有的局部成员都不能使用访问控制修饰符修饰。

(10)有以下一个对象:

public class DataObject implements Serializable{

    private static int i=0;

    private String word=" ";

    public void setWord(String word){

        this.word=word;

    }

    public void setI(int i){

        Data0bject. i=I;

     }

}

创建一个如下方式的DataObject: 

DataObject object=new Data0bject ( );

object. setWord("123");

object. setI(2);

将此对象序列化为文件,并在另外一个JVM中读取文件,进行反序列化,请问此时读出的Data0bject对象中的word和i的值分别为:

"123", 0

解析:

Java在序列化时不会实例化static变量和transient修饰的变量,因为static代表类的成员,transient代表对象的临时数据,被声明这两种类型的数据成员不能被序列化。

猜你喜欢

转载自blog.csdn.net/weixin_41673515/article/details/90572598
今日推荐