当前位置: 首页 > article >正文

java笔试练习题笔记(15)

为Test类的一个无形式参数无返回值的方法method书写方法头,使得使用类名Test作为前缀就可以调用它,该方法头的形式为( )

A.static void method()
B.public void method
C.protected void method()
D.abstract void method()

答案解析:类名调用的方法,需要这个方法是static修饰。


类A1和类A2在同一包中,类A2有个protected的方法testA2,类A1不是类A2的子类(或子类的子类),类A1可以访问类A2的方法testA2。(  )

A.正确
B.错误

答案解析:protected修饰符的可以被同一个包或者不同包下的子类进行访问


有如下代码:请写出程序的输出结果。

public class Test
{
    public static void main(String[] args)
    {
        int x = 0;
        int y = 0;
        int k = 0;
        for (int z = 0; z < 5; z++) {
            if ((++x > 2) && (++y > 2) && (k++ > 2))
            {
                x++;
                ++y;
                k++;
            }
        }
        System.out.println(x + ”” +y + ”” +k);
    }
}

A.432
B.531
C.421
D.523

答案解析:

z=0时候,执行++x > 2,不成立,&&后面就不执行了,此时 x=1,y=0,k=0;

z=1时候,执行++x > 2,还不成立 ,&&后面就不执行了,此时 x=2,y=0,k=0;

z=2时候, 执行++x > 2,成立,继续执行 ++y > 2, 不成立  , &&后面就不执行了, 此时 x=3,y=1,k=0;

z=3时候,执行++x > 2,成立,继续执行++y > 2,不成立  , &&后面就不执行了, 此时 x=4,y=2,k=0;

z=4 时候,执行++x > 2,成立,继续执行 ++y > 2, 成立  , 继续执行k++>2 ,不成立,此时仍没有进入for循环的语句中, 但此时 x=5,y=3,k=1;

z=5时候,不满足条件了,整个循环结束,所以最好打印时候: x=5,y=3,k=1


下面选项中,哪些是interface中合法方法定义?()
A.public void main(String [] args);
B.private int getSum();
C.boolean setFlag(Boolean [] test);
D.public float get(int x);

答案解析:java程序的入口必须是static类型的,接口中不允许有static类型的方法,

interface中的方法默认为public abstract 的 ,变量默认为public static final

往OuterClass类的代码段中插入内部类声明, 哪一个是错误的:

public class OuterClass{
    private float f=1.0f;
    //插入代码到这里
}
A.class InnerClass{ public static float func(){return f;} }
B.abstract class InnerClass{ public abstract float func(){} }
C.static class InnerClass{ protected static float func(){return f;} }
D.public class InnerClass{ static float func(){return f;} }

答案解析:

1.静态内部类才可以声明静态方法

2.静态方法不可以使用非静态变量

3.抽象方法不可以有函数体

1.为什么使用内部类?
使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,
对于内部类都没有影响
1.1.使用内部类最大的优点就在于它能够非常好的解决多重继承的问题,使用内部类还能够为我们带来如下特性:
(1)、内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独。
(2)、在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。
(3)、创建内部类对象的时刻并不依赖于外围类对象的创建。
(4)、内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。
(5)、内部类提供了更好的封装,除了该外围类,其他类都不能访问。
2.内部类分类:
(一).成员内部类:

public class Outer{
		private int age = 99;
		String name = "Coco";
		public class Inner{
			String name = "Jayden";
			public void show(){
				System.out.println(Outer.this.name);
				System.out.println(name);
				System.out.println(age);
			}
		}
		public Inner getInnerClass(){
			return new Inner();
		}
		public static void main(String[] args){
			Outer o = new Outer();
			Inner in = o.new Inner();
			in.show();
		}
	}

1.Inner 类定义在 Outer 类的内部,相当于 Outer 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,
如 public 、 protected 、 private 等
2.Inner 类中定义的 show() 方法可以直接访问 Outer 类中的数据,而不受访问控制符的影响,
如直接访问 Outer 类中的私有属性age
3.定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,
即:内部类 对象名 = 外部类对象.new 内部类( );
4.编译上面的程序后,会发现产生了两个 .class 文件: Outer.class,Outer$Inner.class{}
5.成员内部类中不能存在任何 static 的变量和方法,可以定义常量:
(1).因为非静态内部类是要依赖于外部类的实例,而静态变量和方法是不依赖于对象的,仅与类相关,
简而言之:在加载静态域时,根本没有外部类,所在在非静态内部类中不能定义静态域或方法,编译不通过;
非静态内部类的作用域是实例级别
(2).常量是在编译器就确定的,放到所谓的常量池了
★★友情提示:
1.外部类是不能直接使用内部类的成员和方法的,可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法;
2.如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,
可以使用 this 关键字,如:Outer.this.name
(二).静态内部类: 是 static 修饰的内部类,
1.静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问
2.如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;
如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员
3.创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名 = new 内部类();

public class Outer{
			private int age = 99;
			static String name = "Coco";
			public static class Inner{
				String name = "Jayden";
				public void show(){
					System.out.println(Outer.name);
					System.out.println(name);					
				}
			}
			public static void main(String[] args){
				Inner i = new Inner();
				i.show();
			}
		}

(三).方法内部类:其作用域仅限于方法内,方法外部无法访问该内部类
(1).局部内部类就像是方法里面的一个局部变量一样,是不能有 public、protected、private 以及 static 修饰符的
(2).只能访问方法中定义的 final 类型的局部变量,因为:
当方法被调用运行完毕之后,局部变量就已消亡了。但内部类对象可能还存在,
直到没有被引用时才会消亡。此时就会出现一种情况,就是内部类要访问一个不存在的局部变量;
==>使用final修饰符不仅会保持对象的引用不会改变,而且编译器还会持续维护这个对象在回调方法中的生命周期.
局部内部类并不是直接调用方法传进来的参数,而是内部类将传进来的参数通过自己的构造器备份到了自己的内部,
自己内部的方法调用的实际是自己的属性而不是外部类方法的参数;
防止被篡改数据,而导致内部类得到的值不一致

   /*
		使用的形参为何要为 final???
		 在内部类中的属性和外部方法的参数两者从外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化的,
		 也就是说在内部类中我对属性的改变并不会影响到外部的形参,而然这从程序员的角度来看这是不可行的,
		 毕竟站在程序的角度来看这两个根本就是同一个,如果内部类该变了,而外部方法的形参却没有改变这是难以理解
		 和不可接受的,所以为了保持参数的一致性,就规定使用 final 来避免形参的不改变
		 */
		public class Outer{
			public void Show(){
				final int a = 25;
				int b = 13;
				class Inner{
					int c = 2;
					public void print(){
						System.out.println("访问外部类:" + a);
						System.out.println("访问内部类:" + c);
					}
				}
				Inner i = new Inner();
				i.print();
			}
			public static void main(String[] args){
				Outer o = new Outer();
				o.show();
			}
		}    

(3).注意:在JDK8版本之中,方法内部类中调用方法中的局部变量,可以不需要修饰为 final,匿名内部类也是一样的,主要是JDK8之后增加了 Effectively final 功能

http://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html

反编译jdk8编译之后的class文件,发现内部类引用外部的局部变量都是 final 修饰的

(四).匿名内部类:

(1).匿名内部类是直接使用 new 来生成一个对象的引用;

(2).对于匿名内部类的使用它是存在一个缺陷的,就是它仅能被使用一次,创建匿名内部类时它会立即创建一个该类的实例,
该类的定义会立即消失,所以匿名内部类是不能够被重复使用;
(3).使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口;
(4).匿名内部类中是不能定义构造函数的,匿名内部类中不能存在任何的静态成员变量和静态方法;
(5).匿名内部类中不能存在任何的静态成员变量和静态方法,匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法
(6).匿名内部类初始化:使用构造代码块!利用构造代码块能够达到为匿名内部类创建一个构造器的效果

  public class OuterClass {
            public InnerClass getInnerClass(final int   num,String str2){
                return new InnerClass(){
                    int number = num + 3;
                    public int getNumber(){
                        return number;
                    }
                };        /* 注意:分号不能省 */
            }
            public static void main(String[] args) {
                OuterClass out = new OuterClass();
                InnerClass inner = out.getInnerClass(2, "chenssy");
                System.out.println(inner.getNumber());
            }
        }
        interface InnerClass {
            int getNumber();
        }

下面有关重载函数的说法中正确的是()
A
重载函数必须具有不同的返回值类型
B
重载函数形参个数必须不同
C
重载函数必须有不同的形参列表
D
重载函数名可以不同

答案解析:重载:必须同名函数;必须参数表不同(包含参数个数不同;参数类型不同;或参数个数与类型都不同)


下面关于垃圾收集的说法正确的是
A.一旦一个对象成为垃圾,就立刻被收集掉。
B.对象空间被收集掉之后,会执行该对象的finalize方法
C.finalize方法和C++的析构函数是完全一回事情
D.一个对象成为垃圾是因为不再有引用指着它,但是线程并非如此

答案解析:

1.在java中,对象的内存在什么时候回收,取决于垃圾回收器什么时候运行。

2.一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法, 并且在下一次垃圾回收动作发生时,才会真正的回收对象占用的内存

3.一个对象成为垃圾是因为不再有引用指着它,就可能被垃圾回收器回收,主线程开启一个线程,当主线程运行完成,没有引用指向运行的线程,但是开启的线程还在运行,直到run方法运行结束退出,这一点和对象的垃圾回收是不一样的。


String s = new String("xyz");创建了几个StringObject?
A.两个或一个都有可能
B.两个
C.一个
D.三个

答案解析: 用new关键字创建字符串对象时,JVM会先检查字符串常量池中时候有存在的对应字符串,如果已经存在,则不会在字符串常量池中创建,如果没有存在,那么就会在字符串常量池中创建一个字符串对象,然后还会去堆内存中创建一份字符串对象,把常量池中的对象内容拷贝到内存中的字符串对象,然后返回堆内存中的字符串对象内存地址。


Java7特性中,abstract class和interface有什么区别。
A.抽象类可以有构造方法,接口中不能有构造方法
B.抽象类中可以有普通成员变量,接口中没有普通成员变量
C.抽象类中不可以包含静态方法,接口中可以包含静态方法
D.一个类可以实现多个接口,但只能继承一个抽象类。

答案解析:

含有abstract修饰符的class即为抽象类,abstract类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。  接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。  下面比较一下两者的语法区别:  1.抽象类可以有构造方法,接口中不能有构造方法。 

2.抽象类中可以有普通成员变量,接口中没有普通成员变量 

3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

  4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然  eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。

  5. 抽象类中可以包含静态方法,接口中不能包含静态方法

  6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。 

7. 一个类可以实现多个接口,但只能继承一个抽象类。  下面接着再说说两者在应用上的区别:  接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,  例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码,伪代码如下: 

package com.lei; import java.io.IOException; import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public abstract class BaseServlet extends HttpServlet { /** * serialVersionUID属性概述 *  */ private static final long serialVersionUID = 1L;

public final void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // 记录访问日志 // 进行权限判断 if (true)// if条件里写的是“具有权限” { try { doService(request, response); } catch (IOException e) { // 记录异常信息 } } } protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException; }

实现类如下: 

package com.lei; import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse; public class MyServlet extends BaseServlet{ /** * serialVersionUID属性概述 *  */ private static final long serialVersionUID = 1L;

@Override protected void doService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // TODO Auto-generated method stub } }

父类方法中间的某段代码不确定,留给子类干,就用模板方法设计模式。  备注:这道题的思路是先从总体解释抽象类和接口的基本概念,然后再比较两者的语法细节,最后再说两者的应用区别。  比较两者语法细节区别的条理是:先从一个类中的构造方法、普通成员变量和方法(包括抽象方法),静态变量和方法,继承性等6个方面逐一去比较回答,接着从第三者继承的角度的回答,特别是最后用了一个典型的例子来展现自己深厚的技术功底。 


正则表达式语法中 \d 匹配的是?()

A
数字
B
非数字
C
字母
D
空白字符

答案解析:一看就懂:正则表达式_正则表达式?!-CSDN博客

\d:匹配一个数字。等价于[0-9]。


下面有关java final的基本规则,描述错误的是?
A.final修饰的类不能被继承
B.final修饰的成员变量只允许赋值一次,且只能在类方法赋值
C.final修饰的局部变量即为常量,只能赋值一次。
D.final修饰的方法不允许被子类覆盖

答案解析:

  1. 在声明时直接赋值

    java

    public class Example {
        final int number = 10; // 在声明时直接赋值
    }
  2. 这是最直接的方式,声明final变量时直接赋予一个初始值。一旦赋值后,这个值就不能再被改变。
  3. 在构造器中赋值

    java

    public class Example {
        final int number;
        
        public Example(int number) {
            this.number = number; // 在构造器中赋值
        }
    }
  4. 对于final成员变量,如果它们没有在声明时被初始化,那么必须在构造器中进行赋值。这是因为final变量必须在对象构造完成前被初始化。
  5. 在初始代码块中进行赋值

    java

    public class Example {
        final int number;
        
        {
            if (condition) {
                number = 10; // 在初始代码块中赋值
            } else {
                number = 20;
            }
        }
    }
  6. final变量也可以在类的初始化代码块中被赋值。这通常用于需要根据某些条件来初始化final变量的情况。

关于final修饰的成员变量的两个要点:

  • 基本数据类型:对于final修饰的基本数据类型成员变量,一旦赋值后就不能再被修改。

    java

    public class Example {
        final int number = 5;
        // number = 10; // 这将导致编译错误,因为number是final的
    }
  • 引用数据类型:对于final修饰的引用数据类型成员变量,一旦赋值后,其引用的地址不能改变,但是指向的对象的内容是可以改变的。

    java

    public class Example {
        final Object object = new Object();
        // object = new Object(); // 这将导致编译错误,因为object是final的
        
        public void modifyObject() {
            object.toString(); // 可以改变对象的内容
        }
    }

10. class Line {
11. public class Point { public int x,y;}
12. public Point getPoint() { return new Point(); }
13. }
14. class Triangle {
15. public Triangle() {
16. // insert code here
17. }
18. }
在第16行插入哪段代码可以获得一个Point对象的坐标?(  )
A.Point p = Line.getPoint();
B.Line.Point p = Line.getPoint();
C.Point p = (new Line()).getPoint();
D.Line.Point p = (new Line()).getPoint();

 答案解析:

(1)把类定义在另一个类的内部,该类就被称为内部类。 举例:把类B定义在类A中,类B就被称为内部类。 (2)内部类的访问规则 A:可以直接访问外部类的成员,包括私有 B:外部类要想访问内部类成员,必须创建对象 (3)内部类的分类 A:成员内部类

B:局部内部类

C:匿名内部类

(4)成员内部类访问规则 成员内部类不是静态的: 外部类名.内部类名 对象名 = new 外部类名().new 内部类名(); 成员内部类是静态的:

外部类名.内部类名 对象名 = new 外部类名.内部类名();

(5)局部内部类 A:局部内部类访问局部变量必须加final修饰。 B:为什么呢? 因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。 所以,堆内存还是用该变量,而改变量已经没有了。 为了让该值还存在,就加final修饰。 通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。

(6)匿名内部类(掌握) A:是局部内部类的简化形式 B:前提 存在一个类或者接口 C:格式: new 类名或者接口名() { 重写方法; } D:本质: 其实是继承该类或者实现接口的子类匿名对象



有以下程序段, 则下面正确的选项是()

public class MyThead extends Thread{
    public static void main(String[] args) {
        MyThead t=new MyThead();
        MyThead s=new MyThead();
        t.start();
        System.out.println("one.");
        s.start();
        System.out.println("two.");
    }
    public void run() {
        System.out.println("Thread");
    }
}

A.编译失败
B.程序运行可能结果为: one. Thread two. Thread
C.程序运行可能结果是: one. two. Thread Thread
D.程序运行结果不稳定

答案解析:两个start方法之后一共三个线程就绪:主线程,线程s,线程t,处于就绪状态中的线程并没有开始运行,至于什么时候开始运行,取决于取决于JVM里线程调度器的调度。


若有下列定义,下列哪个表达式返回false?

String s = "hello";
String t = "hello";
char c[] = {'h', 'e', 'l', 'l', 'o'} ;


A.s.equals(t);
B.t.equals(c);
C.s==t;
D.t.equals(new String("hello"));

答案解析:har数组是一种对象类型不是String类型的实例,直接跳过比较返回false


已知 boolean result = false,则下面哪个选项是合法的:

A.result=1
B.result=true;
C.if(result!=0) {//so something…}
D.if(result) {//do something…}

答案解析:1、boolean类型只有两个直接量值:true和false. 2、除成员变量会有默认初始值外,其他变量必须在第一次使用之前初始化.


下面的类哪些可以处理Unicode字符?

A.InputStreamReader
B.BufferedReader
C.Writer
D.PipedInputStream

答案解析:stream结尾的都是字节流,reader和writer结尾的都是字符流


通过以下哪些方法可反射获取到User对象中static属性的值?
A.User. class. getDeclaredField ("name"). get (null);
B.User. class. getField ("name"). get (null);
C.User user=new User(); return user. getClass(). getField ("name").get (user);
D.User user=new User(): return user. getClass(). getDeclaredField ("name"). get (user);

答案解析:Java 中的反射机制(两万字超全详解)_java反射-CSDN博客

getDeclaredField:查找该Class所有声明属性(静态/非静态),但是他不会去找实现的接口/父类的属性

getField:只查找该类public类型的属性,如果找不到则往上找他的接口、父类,依次往上,直到找到或者已经没有接口/父类


Servlet的生命周期可以分为初始化阶段,运行阶段和销毁阶段三个阶段,以下过程属于初始化阶段是()。
A.加载Servlet类及.class对应的数据
B.创建servletRequest和servletResponse对象
C.创建ServletConfig对象
D.创建Servlet对象

答案解析:JavaWeb——Servlet(全网最详细教程包括Servlet源码分析)-CSDN博客

Servlet的生命周期一般可以用三个方法来表示:

init():仅执行一次,负责在装载Servlet时初始化Servlet对象

service() :核心方法,一般HttpServlet中会有get,post两种处理方式。在调用doGet和doPost方法时会构造servletRequest和servletResponse请求和响应对象作为参数。

destory():在停止并且卸载Servlet时执行,负责释放资源 初始化阶段:Servlet启动,会读取配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,将ServletConfig作为参数来调用init()方法。


http://www.kler.cn/a/410318.html

相关文章:

  • 网络安全与加密
  • Matlab 深度学习工具箱 案例学习与测试————求二阶微分方程
  • .net 支持跨平台(桌面)系列技术汇总
  • 11超全局变量php
  • ollama教程——在Linux上运行大型语言模型的完整指南
  • 【Excel】拆分多个sheet,为单一表格
  • 正则表达式灾难:重新认识“KISS原则”的意义
  • Docker 的优势和劣势分别是什么
  • 构建 Java Web 应用程序:从 Servlet 到数据库交互(Eclipse使用JDBC连接Mysql数据库)
  • mysql之常用的命令行操作
  • MySQL45讲 第29讲 如何判断一个数据库是不是出问题了?——阅读总结
  • 簡單易懂:如何在Windows系統中修改IP地址?
  • windows实战-wordpress——玄机靶场
  • 在C++上实现反射用法
  • ISUP协议视频平台EasyCVR萤石设备视频接入平台银行营业网点安全防范系统解决方案
  • 详解 【AVL树】
  • DICOM图像深入解析:为何部分DR/CR图像默认显示为反色?
  • 【案例学习】如何使用Minitab实现包装过程的自动化和改进
  • Failed to find SV in PRN block of SINEX file (Name svnav.dat)
  • Linux系统使用valgrind分析C++程序内存资源使用情况
  • 从0开始分享一个React项目:React-ant-admin
  • 【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
  • 搜维尔科技:多画面显示3D系统解决方案,数据孪生可视化大屏3D展示技术
  • oracle RMAN同机迁移数据库从ASM至文件系统(同机)
  • Stable Diffusion初步见解(三):扩散模型
  • 网络安全简单入门与扫描