概述
Java基础练习解析
java基础
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
第一天错题记录
1.现有一变量声明为 boolean aa; 下面赋值语句中正确的是 ( )
A.aa=false;
B.aa=False;
C.aa=“true”;
D.aa=0;
2.定义类中成员变量时不可能用到的修饰是()
A.final
B.void
C.protected
D.static
3.下列程序执行后输出结果为( )
class BaseClass {
public BaseClass() {}
{
System.out.println("I’m BaseClass class");
}
static {
System.out.println("static BaseClass");
}
}
public class Base extends BaseClass {
public Base() {}
{
System.out.println("I’m Base class");
}
static {
System.out.println("static Base");
}
public static void main(String[] args) {
new Base();
}
}
4.以下代码执行后输出结果为( )
public class Test
{
public static Test t1 = new Test();
{
System.out.println("blockA");
}
static
{
System.out.println("blockB");
}
public static void main(String[] args)
{
Test t2 = new Test();
}
}
5.String str = new String(“abc”),“abc”在内存中是怎么分配的?
A.堆
B.栈
C.字符串常量区
D.寄存器
6.Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持,下面关于Java反射的描述,哪些是错误的:( )
A.Java反射主要涉及的类如Class, Method, Filed,等,他们都在java.lang.reflet包下
B.通过反射可以动态的实现一个接口,形成一个新的类,并可以用这个类创建对象,调用对象方法
C.通过反射,可以突破Java语言提供的对象成员、类成员的保护机制,访问一般方式不能访问的成员
D.Java反射机制提供了字节码修改的技术,可以动态的修剪一个类
E.Java的反射机制会给内存带来额外的开销。例如对永生堆的要求比不通过反射要求的更多
F.Java反射机制一般会带来效率问题,效率问题主要发生在查找类的方法和字段对象,因此通过缓存需要反射类的字段和方法就能达到与之间调用类的方法和访问类的字段一样的效率
7.以下各类中哪几个是线程安全的?( )
A.ArrayList
B.Vector
C.Hashtable
D.Stack
答案解析
-
A: boolean的值要不是true,要不就是false。
-
B: void是修饰方法的,没有返回值,final是修饰常量的,protected是保护的,static是静态的
-
D : 父类静态代码块 ->子类静态代码块 ->父类非静态代码块(普通代码块) -> 父类构造函数 -> 子类非静态代码块(普通代码块) -> 子类构造函数。
静态代码块永远最优先执行在类加载的时候就会启动,构造方法是在类创建的时候才调用。 -
A :此题重要,需加深理解
1.首先,需要明白类的加载顺序。
(1) 父类静态对象和静态代码块
(2) 子类静态对象和静态代码块
(3) 父类非静态对象和非静态代码块
(4) 父类构造函数
(5) 子类 非静态对象和非静态代码块
(6) 子类构造函数
静态块>main()>构造块>构造方法
其中:类中静态块按照声明顺序执行,并且(1)和(2)不需要调用new类实例的时候就执行了(意思就是在类加载到方法区的时候执行的)
2.因而,整体的执行顺序为
public static Test t1 = new Test(); //(1)
static
{
System.out.println(“blockB”); //(2)
}
Test t2 =new Test(); //(3)
在执行(1)时创建了一个Test对象,在这个过程中会执行非静态代码块和缺省的无参构造函数,在执行非静态代码块时就输出了blockA;然后执行(2)输出blockB;执行(3)的过程同样会执行非静态代码块和缺省的无参构造函数,在执行非静态代码块时输出blockA
这里有个关键点,即为什么会先执行构造块中的 blockA
因为:类的加载顺序按照以上规则来,但是当有两个同样的顺序时则会按照代码顺序来执行。
这里的 public static Test t1 = new Test()和静态代码块 static{} 都是静态代码块!static 修饰的变量,方法,代码块都是同一级别,故会先执行new Test()。
并且由于静态代码块在类被加载的时候只会执行一次!因此,此时new Test()创建的新类中 static修饰的属性和代码块就不会再次执行,但是非静态的构造代码块还是会继续执行,故会先打印 blockA。
-
AC: 值得争议,也有可能是只有A
-
ADF:
解析:反射技术是程序在运行的过程中动态的获取类的属性和方法的一种手段。反射无法对字节码进行修改而是生成了一个新类。反射带来的效率问题主要是动态解析类,JVM没法对反射代码优化。 -
BCD:
线程同步:喂,SHE
喂(Vector)
S(Stack):栈定义,栈是一种只能在一端进行插入或删除操作的线性表。(先进后出表) java中的Stack继承Vector
H(hashtable)
E(enumeration)
第二天错题记录
1.下面有关servlet中init,service,destroy方法描述错误的是?
init()方法是servlet生命的起点。一旦加载了某个servlet,服务器将立即调用它的init()方法
service()方法处理客户机发出的所有请求
destroy()方法标志servlet生命周期的结束
servlet在多线程下使用了同步机制,因此,在并发编程下servlet是线程安全的
2.以下代码的输出结果是
public class Test
{
public int x;
public static void main(String []args)
{
System. out. println("Value is" + x);
}
}
程序会打出 “Value is 0”
程序会抛出 NullPointerException
非静态变量不能够被静态方法引用
编译器会抛出 "possible reference before assignment"的错误
3.@SuppressWarnings(“deprecation”)的功能是什么?
屏蔽不赞同使用的类和方法的警告
屏蔽在强制类型转换的时候编译器给出的警告
关闭所有警告信息
当在可序列化的类上缺少serialVersionUID定义的警告
4.下列不是 Java 关键字的是 ( )
abstract
false
native
sizeof
5.下面哪几个语句正确的声明一个整型的二维数组()
int a[][]=new int[][]
int b[10][10]=new int[][]
int c[][]=new int[10][10]
int []d[]=new int[10][10]
6.在java中,下列标识符不合法的有( )
new
$Usdollars
1234
car.taxi
第二天答案解析
-
D: servlet在多线程下其本身并不是线程安全的。
如果在类中定义成员变量,而在service中根据不同的线程对该成员变量进行更改,那么在并发的时候就会引起错误。最好是在方法中,定义局部变量,而不是类变量或者对象的成员变量。由于方法中的局部变量是在栈中,彼此各自都拥有独立的运行空间而不会互相干扰,因此才做到线程安全。
因此,为了避免servlet多线程下的线程安全问题最好使用局部变量。
init方法: 是在servlet实例创建时调用的方法,用于创建或打开任何与servlet相的资源和初始 化servlet的状态,Servlet规范保证调用init方法前不会处理任何请求
service方法:是servlet真正处理客户端传过来的请求的方法,由web容器调用, 根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法
destory方法:是在servlet实例被销毁时由web容器调用。Servlet规范确保在destroy方法调用之 前所有请求的处理均完成,需要覆盖destroy方法的情况:释放任何在init方法中 打开的与servlet相关的资源存储servlet的状态 -
C: 当类加载时,static静态方法随着类加载而初始化,此时实例对象还未被创建,但是非静态成员变量需要等到实例对象创建才会被初始化,故无法被引用。会直接编译器出错无法运行,故不会报错。
-
A: 此题涉及到了java的三大注解override,deprecated和suppresswarinings
Override 注解
指明被注解的方法需要覆写超类中的方法.
如果某个方法使用了该注解,却没有覆写超类中的方法(比如大小写写错了,或者参数错了,或者是子类自己定义的方法),编译器就会生成一个错误.
Deprecated 注解
可以修饰类、方法、变量,在java源码中被@Deprecated修饰的类、方法、变量等表示不建议使用的,可能会出现错误的,可能以后会被删除的类、方法等,如果现在使用,则在以后使用了这些类、方法的程序在更新新的JDK、jar包等就会出错,不再提供支持。 个人程序中的类、方法、变量用@Deprecated修饰同样是不希望自己和别人在以后的时间再次使用此类、方法。 当编译器编译时遇到了使用@Deprecated修饰的类、方法、变量时会提示相应的警告信息。
Suppresswarnings 注解
可以达到抑制编译器编译时产生警告的目的,但是很不建议使用@SuppressWarnings注解,使用此注解,编码人员看不到编译时编译器提示的相应的警告,不能选择更好、更新的类、方法或者不能编写更规范的编码。同时后期更新JDK、jar包等源码时,使用@SuppressWarnings注解的代码可能受新的JDK、jar包代码的支持,出现错误,仍然需要修改。
抑制警告的关键字
-
这种题很尴尬,暂且不论
Java中的关键字有哪些?
答:1)48个关键字:abstract、assert、boolean、break、byte、case、catch、char、class、continue、default、do、double、else、enum、extends、final、finally、float、for、if、implements、import、int、interface、instanceof、long、native、new、package、private、protected、public、return、short、static、strictfp、super、switch、synchronized、this、throw、throws、transient、try、void、volatile、while。
2)2个保留字(现在没用以后可能用到作为关键字):goto、const。
3)3个特殊直接量:true、false、null。 -
CD: 以此类推随机排序
// 多维数组声明
// 一维数组
int e[] = new int[10];
int []f = new int[10];
// 二维数组
int a[][] = new int[10][10];
int []b[] = new int[10][10];
int [][]c = new int[10][10];
// 三维数组
int g[][][] = new int[2][3][4];
int []h[][] = new int[2][3][4]; -
ACD: Java标识符由数字,字母和下划线(_),美元符号($)组成。在Java中是区分大小写的,而且还要求首位不能是数字。最重要的是,Java关键字 不能当作Java标识符。
第三天错题记录
-
下面有关SPRING的事务传播特性,说法错误的是?
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行
PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就抛出异常
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起
PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚 -
如果希望监听TCP端口9000,服务器端应该怎样创建socket?
new Socket(“localhost”,9000);
new ServerSocket(9000);
new Socket(9000);
new ServerSocket(“localhost”,9000); -
以下哪一个不是赋值符号?
A.+=
B.<<=
C.<<<=
D.>>>= -
java运行时内存分为“线程共享”和“线程私有”两部分,以下哪些属于“线程共享”部分
程序计算器
方法区
java虚拟机栈
java堆
第三天错题解析
-
B: Spring的API设计很不错,基本上根据英文翻译就能知道作用:Required:必须的。说明必须要有事物,没有就新建事物。supports:支持。说明仅仅是支持事务,没有事务就非事务方式执行。mandatory:强制的。说明一定要有事务,没有事务就抛出异常。required_new:必须新建事物。如果当前存在事物就挂起。not_supported:不支持事物,如果存在事物就挂起。never:绝不有事务。如果存在事物就抛出异常
-
答案选B。
ServerSocket(int port) 是服务端绑定port端口,调accept()监听等待客户端连接,它返回一个连接队列中的一个socket。
Socket(InetAddress address , int port)是创建客户端连接主机的socket流,其中InetAddress是用来记录主机的类,port指定端口。 -
C:
1<<表示左移位
2>>表示带符号右移位
3>>>表示无符号右移
但是没有<<<运算符 -
BD:私有:java虚拟机栈,程序计数器,本地方法栈 共享:java堆,方法区
最后
以上就是清新楼房为你收集整理的java基础巩固java基础的全部内容,希望文章能够帮你解决java基础巩固java基础所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复