2021年09月15日 java1

考点1:依赖注入

下面关于依赖注入(DI)的说法不正确的是()

  • A 只有通过Spring才能实现依赖注入(DI)
  • B 依赖注入的主要目的是解耦合
  • C 常见的依赖注入方式有Setter和构造方法
显示答案/隐藏答案正确答案: A

Spring依赖注入(DI)的三种方式,分别为:
1.接口注入
2.Setter方法注入
3.构造方法注入

属性注入:
创建对象时候,向类里面属性里面设置值
注入的三种方式(java),在Spring框架中只支持前面两种方式

第一种:使用set方法注入

1
2
3
4
5
6
7
8
public class User{
private String name;
public void setName(String name){
this.name=name;
}
}
User user=new User();
user.setName("abcd");

第二种:有参数构造注入

1
2
3
4
5
6
7
public class User{
private String name;
public User(String name){
this.name=name;
}
}
User user=new User("lucy");

第三种:使用接口注入

1
2
3
4
5
6
7
8
9
public interface Dao{
public void delete(String name);
}
public class DaoImplements Dao{
private String name;
public void delete(String name){
this.name=name;
}
}

sping使用 有参数构造注入属性

1
2
3
<bean id="demo" class="cn.itcast.property.propertyDemo1">
<constructor-arg name="username" value="小王小马"></constructor>
</bean>
1
2
3
4
5
6
7
8
9
public class TestIOC{
public void testUser(){
// 1.加载Spring配置文件,根据创建对象
APPlicationContext context=new ClassPathXmlApplicationContext("bean1.xml")
// 2.得到配置创建的对象
PropertyDemo1 demo1=(PropertyDemo1)context.getBean("demo");
demo1.test1();
}
}

spring使用set方法注入属性(使用的更多)

1
2
3
4
5
<!-- 代表对象已经创建 -->
<bean id="book" class="cn.itcast.property.Book">
<!-- name属性值:类里面定义的属性名称 value属性:设置具体的值 -->
<property name="bookname" vlaue="易筋经"></property>
</bean>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Book{
private String bookname;
public void setName(String bookname){
this.bookname=bookname;
}
public void demobook(){
system.out.println("book........"+bookname);
}
}
public class TestIOC{
public void testUser(){
// 1.加载Spring配置文件,根据创建对象
APPlicationContext context=new ClassPathXmlApplicationContext("bean1.xml")
// 2.得到配置创建的对象
Book book=(Book)context.getBean("book");
book.demobook();
}
}

这篇博文讲到依赖注入。除了spring,还有.net平台一些框架也用到了依赖注入。
http://www.cnblogs.com/yangecnu/p/Introduce-Dependency-Injection.html

考点2:for循环执行流程

下列循环语句序列执行完成后,i的值是()

1
2
3
4
int i;
for(i=2;i<=10;i++){
System.out.println(i);
}
  • A 2
  • B 10
  • C 11
  • D 不确定
显示答案/隐藏答案正确答案: C

for循环的执行顺序

1
2
3
4
for(表达式1;表达式2;表达式3
{
//循环体
}
  1. 表达式1执行一次,判断表达式2是否成立,如果成立执行循环体;
  2. 循环体结束,表达式3执行一次,判断表达式2是否成立,如果成立执行循环体;
  3. 依次进行2的操作。直到表达式2不成立,退出循环。

这个循环最后一次进入循环体时;i=10了,然后执行表达式3,i=11,最后执行表达式2,判断11大于10,退出循环。

考点3:Servlet

从以下哪一个选项中可以获得Servlet的初始化参数?

  • A Servlet
  • B ServletContext
  • C ServletConfig
  • D GenericServlet
显示答案/隐藏答案正确答案: C

通过ServletConfig接口的getInitParameter(java.lang.String name)方法。

1)ServletConfig:Servlet的配置对象,容器在初始化Servlet时通过它传递信息给Servlet。
2)ServletContext:上下文对象,提供了一系列方法供Servlet与Web容器交互。

  • ServletConfig对象:servlet配置对象,主要把servlet的初始化参数封装到这个对象中。一个网站中可能会存在多个servletConfig对象,一个servletConfig对象就封装了一个servlet的配置信息。可以在web.xml中通过<init-param></init-param>标签配置初始化参数,通过getInitParameter(String name)或getInitParameterNames()方法来获取初始化参数。注:初始化参数必须在当前的servlet程序中使用。
  • ServletContext对象:servlet上下文对象。一个网站只会创建一个servletContext对象,代表的是整个网站的环境信息。可以在web.xml中通过<context-param></context-param>标签配置全局参数,是通过servletConfig对象来获取servletContext对象的,调用的是getServletContext()方法。注:如果某个参数整个网站的程序都要使用,那么可将该参数设置为全局参数,因为可通过servletContext域对象去获取。在servle中有三个域对象,分别为:ServletContext、HttpServletRequest和HttpSession。

考点4:基本数据类型

在 Java 中,属于整数类型变量的是()

  • A single
  • B double
  • C byte
  • D char
显示答案/隐藏答案正确答案: C

Java八种基本数据类型

Java中的四类八种基本数据类型
第一类:整数类型 byte short int long
第二类:浮点型 float double
第三类:逻辑型 boolean(它只有两个值可取true false)
第四类:字符型 char

考点5:Byte表示范文 Byte越界 自动拆箱装箱 引用传参

如下代码,执行test()函数后,屏幕打印结果为()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Test2
{
public void add(Byte b)
{
b = b++;
}
public void test()
{
Byte a = 127;
Byte b = 127;
add(++a);
System.out.print(a + " ");
add(b);
System.out.print(b + "");
}
}
  • A 127 127
  • B 128 127
  • C 129 128
  • D 以上都不对
显示答案/隐藏答案正确答案: D

Byte类型值大小为-128~127之间。并且Byte类型的值首尾相连,越界不会抛出异常
add(++a);这里++a会越界,a的值变为-128
add(b); 前面说了,add不起任何作用,b还是127

add()方法里面的修改值并不会起作用,而add(++a)会使a数值越界成-128,所以输出为-128 127

考点6:main方式是静态方法不能访问非静态成员变量

1
2
3
4
5
6
7
8
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

非静态成员只能被类的实例化对象引用,因此这里在静态方法中访问x会造成编译出错

当类加载时,static静态方法随着类加载而初始化,此时实例对象还未被创建,但是非静态成员变量需要等到实例对象创建才会被初始化,故无法被引用。

考点7:Java表示符规则

下列不正确的 Java 语言标识符是( )

  • A Sky
  • B $Computer
  • C for
  • D NULL
显示答案/隐藏答案正确答案: C

Java标识符命名规范是:
1)只能包含字母a-zA-Z,数字0-9,下划线_和美元符号$;
2)首字母不能为数字;
3)关键字和保留字不能作为标识符。

中文可以作为变量名

中文可以作为变量名,中文的货币符号也是中文字符,也是可以作为变量名的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package base;

public class BiaoShiFu {
public static void main(String[] args) {
String ¥str = "123";
String 你好 = "helloWorld";
System.out.println(¥str);
System.out.println(你好);
真的吗();
}

public static void 真的吗() {
System.out.println("真的吗?我不信!");
}
}

运行结果:

1
2
3
123
helloWorld
真的吗?我不信!

考点8:基础知识

以下说法中正确的有?

  • A StringBuilder是 线程不安全的
  • B Java类可以同时用 abstract和final声明
  • C HashMap中,使用 get(key)==null可以 判断这个Hasmap是否包含这个key
  • D volatile关键字不保证对变量操作的原子性
显示答案/隐藏答案正确答案: AD

考点9:并发

JDK提供的用于并发编程的同步器有哪些?

  • A Semaphore
  • B CyclicBarrier
  • C CountDownLatch
  • D Counter
显示答案/隐藏答案正确答案: ABC

答案:ABC
A,Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过
acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
B,CyclicBarrier 主要的方法就是一个:await()。await()
方法没被调用一次,计数便会减少1,并阻塞住当前线程。当计数减至0时,阻塞解除,所有在此 CyclicBarrier 上面阻塞的线程开始运行。
C,直译过来就是倒计数(CountDown)门闩(Latch)。倒计数不用说,门闩的意思顾名思义就是阻止前进。在这里就是指
CountDownLatch.await() 方法在倒计数为0之前会阻塞当前线程。
D,Counter不是并发编程的同步器