牛客网第三天

1.进行Java基本的GUI设计需要用到的包是()
A.java.io
B.java.sql
C.java.awt
D.java.rmi
正确答案: C 你的答案: C (正确)
解析:
图形用户界面(Graphical User Interface,简称 GUI)是指采用图形方式显示的计算机操作用户界面。
java.io提供了全面的IO接口。包括:文件读写、标准设备输出等。
java.sql 提供使用 Java 编程语言访问并处理存储在数据源中的数据的 API。此 API 包括一个框架,凭借此框架可以动态地安装不同驱动程序来访问不同数据源。
java.awt是一个软件包,包含用于创建用户界面和绘制图形图像的所有分类。功能:包含用于创建用户界面和绘制图形图像的所有类。
java.rmi 提供 RMI 包。RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。
2. 以下程序的运行结果是()
public class Increment
{
public static void main(String args[])
{
int a;
a = 6;
System.out.print(a);
System.out.print(a++);
System.out.print(a);
}
}
A.666
B.667
C.677
D.676
正确答案: B 你的答案: B (正确)
解析:第一个输出a为 6第二个输出a为6后对a+1第三个输出a为7。
3.transient变量和下面哪一项有关()?
A.Serializable
B.Cloneable
C.Runnable
D.Throwable
E.Comparable
正确答案: A 你的答案: C (错误)
解析:
一、序列化使用场景
对象的序列化:目的:将一个具体的对象进行持久化,写入到硬盘上。(注意:静态数据不能被序列化,因为静态数据不在堆内存中,而是在静态方法区中)
Serializable:用于启动对象的序列化功能,可以强制让指定类具备序列化功能,该接口中没有成员,这是一个标记接口。这个标记接口用于给序列化类提供UID。这个uid是依据类中的成员的数字签名进行运行获取的。如果不需要自动获取一个uid,可以在类中,手动指定一个名称为serialVersionUID id号。依据编译器的不同,或者对信息的高度敏感性。最好每一个序列化的类都进行手动显示的UID的指定。
二、非序列化使用场景
如何将非静态的数据不进行序列化?用transient 关键字修饰此变量即可。使用场景:为了安全起见,有时候我们不需要在网络间
传输一些数据(如身份证号码,密码,银行卡号等)
4.下列说法正确的是
A.java中包的主要作用是实现跨平台功能
B.package语句只能放在import语句后面
C.包(package)由一组类(class)和接口(interface)组成
D.可以用#include关键词来标明来自其它包中的类
正确答案: C 你的答案: C (正确)
1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
2 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
3 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
package必须放在import的前面
不是include,而是import
5.执行下列代码的输出结果是( )
public class Demo{
 public static void main(String args[]){
   int num = 10;
   System.out.println(test(num));
}
public static int test(int b){
   try
   {
    b += 10;
    return b;
   }
   catch(RuntimeException e)
   {
   }
   catch(Exception e2)
   {
   }
   finally
   {
    b += 10;
    return b;
   }
  }
}
A.10
B.20
C.30
D.40
正确答案: C 你的答案: C (正确)
解析:关于try catch 知识:程序运行到 try块,b=20;并没有发生异常,不运行catch块,运行到return b;因为finally块无论如何都要运行,因此并不发生返回动作,进行运行finally块,b=30;
进行程序返回输出;
6.如何放掉一个指定占据的内存空间?()
A.调用free()方法
B.代用system.gc()方法
C.赋值给该项对象的引用为null
D.程序员无法明确强制垃圾回收器运行
正确答案: D 你的答案: B (错误)
解析: DJava 把内存划分成两种:一种是栈内存,另一种是堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。
数组和对象在没有引用变量指向它的时候,才变为垃圾,不能再被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。这也是 Java 比较占内存的原因。
7.类A1和类A2在同一包中,类A2有个protected的方法testA2,类A1不是类A2的子类(或子类的子类),类A1可以访问类A2的方法testA2。( )
A.正确
B.错误
正确答案: A 你的答案: A (正确)
解析:
在这里插入图片描述
8.下面不是面向对象的基本原则的是?
A.单一职责原则(Single-Resposibility Principle)
B.开放封闭原则(Open-Closed principle)
C.抽象类原则(Abstract-Class principle)
D.依赖倒置原则(Dependecy-Inversion Principle)
E.接口隔离原则(Interface-Segregation Principle)
正确答案: C 你的答案: C (正确)
解析: 五个基本原则:
单一职责原则(Single-Resposibility Principle):一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。
开放封闭原则(Open-Closed principle):软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。
Liskov替换原则(Liskov-Substituion Principle):子类必须能够替换其基类。这一思想体现为对继承机制的约束规范,只有子类能够替换基类时,才能保证系统在运行期内识别子类,这是保证继承复用的基础。
依赖倒置原则(Dependecy-Inversion Principle):依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。
接口隔离原则(Interface-Segregation Principle):使用多个小的专门的接口,而不要使用一个大的总接口
9.public class Test
{
public int x;
public static void main(String []args)
{
System. out. println(“Value is” + x);
}
}
对于上面这段代码,以下说法正确的是:
A.程序会打出 “Value is 0”
B.程序会抛出 NullPointerException
C.非静态变量不能够被静态方法引用
D.编译器会抛出 "possible reference before assignment"的错误
正确答案: C 你的答案: B (错误)
解析:当类加载时,static静态方法随着类加载而初始化,此时实例对象还未被创建,但是非静态成员变量需要等到实例对象创建才会被初始化,故无法被引用。
10. Test.main() 函数执行后的输出是()

public class Test {  
    public static void main(String [] args){  
        System.out.println(new B().getValue());  
    }  
    static class A{  
        protected int value;  
        public A(int v) {  
            setValue(v);  
        }  
        public void setValue(int value){  
            this.value = value;  
        }  
        public int getValue(){  
            try{  
                value++;  
                return value;  
            } catch(Exception e){  
                System.out.println(e.toString());  
            } finally {  
                this.setValue(value);  
                System.out.println(value);  
            }  
            return value;  
        }  
    }  
    static class B extends A{  
        public B() {  
            super(5);  
            setValue(getValue() - 3);  
        }  
        public void setValue(int value){  
            super.setValue(2 * value);  
        }  
    }  
}   

A.11 17 34
B.22 74 74
C.6 7 7
D.22 34 17
正确答案: D 你的答案: B (错误)
解析: 首先,super()函数指的是调用父类的构造方法

new B()
执行B的构造函数,第一行是super(5);
此时执行的是A的构造函数,A的构造函数调用的是setValue()方法,由于B重写了A的这个方法,
所以!!!执行的是B的 setValue()方法。
即传入的参数是25=10
此时,因为super,所以调用的是父类的 setValue()方法,即value=10
第一行执行完毕。
第二行是 setValue(getValue()-3);
B没有getValue()方法,故执行父类的此方法,
try返回的是value=10+1=11,保存在临时栈中
finally中调用this的方法,这个this指的是B的对象,又重写,故就是B的 setValue()方法
value=2
11=22,第一个打印到屏幕上的数字
接下来参数 getValue()-3=11-3=8
传入B的 setValue()方法
此时value=28=16
至此,new B()执行结束

new B(). getValue()
B没有 getValue(),故执行A的 getValue()
try返回16+1=17,保存到临时栈中
finally调用B的 setValue()方法
value=17
2=34,第二个打印到屏幕上面的数字
最后主函数打印返回值,也就是try保存到临时栈的17

猜你喜欢

转载自blog.csdn.net/pingbu_qingyun/article/details/83119632
今日推荐