Java专项训练(1)

Java专项训练

本文仅供个人学习使用,无任何商业行为,题目内容摘自其他网站,请勿进行商业活动



题目预览

1.下列程序执行后结果为( )

class A 
{
    public int func1(int a, int b) 
    {
        return a - b;
    }
}
class B extends A 
{
    public int func1(int a, int b) 
    {
        return a + b;
    }
}
public class ChildClass 
{
    public static void main(String[] args) 
    {
	    A a = new B();
	    B b = new B();
	    System.out.println("Result=" + a.func1(100, 50));
	    System.out.println("Result=" + b.func1(100, 50));
    }
}

2.请问输出的结果是:

class A
{
    public A(String str)
    {
         
    }
}
public class Test
{
    public static void main(String[] args) 
    {
        A classa=new A("he");
        A classb=new A("he");
        System.out.println(classa==classb);
    }
}

3.下面的代码运行的结果是:

class B extends Object
{
    static
    {
        System.out.println("Load B");
    }
    public B()
    {
        System.out.println("Create B");
    }
}
class A extends B
{
    static
    {
        System.out.println("Load A");
    }
    public A()
    {
        System.out.println("Create A");
    }
}
 
public class Testclass
{
    public static void main(String[] args)
    {
        new A();
    }
}

4.Thread. sleep()是否会抛出checked exception?

5.下列说法正确的是:
A. 在类方法中可用this来调用本类的类方法
B. 在类方法中调用本类的类方法可直接调用
C. 在类方法中只能调用本类的类方法
D. 在类方法中绝对不能调用实例方法

6.以下代码结果是:

public class foo 
{
    public static void main(String sgf[]) 
    {
 
        StringBuffer a=new StringBuffer("A");
 
        StringBuffer b=new StringBuffer("B");
 
        operate(a,b);
 
        System.out.println(a+"."+b);
    }
    static void operate(StringBuffer x,StringBuffer y) 
    {
        x.append(y);
        y=x;
    }
}

7.以下代码的输出结果是:

public class B
{
    public static B t1 = new B();
    public static B t2 = new B();
    {
        System.out.println("构造块");
    }
    static
    {
        System.out.println("静态块");
    }
    public static void main(String[] args)
    {
        B t = new B();
    }
}

8.执行如下程序代码后,

char chr = 127;
int sum = 200;
chr += 1;
sum += chr;

sum的值是()
备注:同时考虑c/c++和Java的情况的话


答案解析

1.下列程序执行后结果为( )

class A 
{
    public int func1(int a, int b) 
    {
        return a - b;
    }
}
class B extends A 
{
    public int func1(int a, int b) 
    {
        return a + b;
    }
}
public class ChildClass 
{
    public static void main(String[] args) 
    {
	    A a = new B();
	    B b = new B();
	    System.out.println("Result=" + a.func1(100, 50));
	    System.out.println("Result=" + b.func1(100, 50));
    }
}

答案:

Result=150
Result=150

解析:

涉及转型的题目,分为向上或者向下转型。不论向上或者向下转型,都是一句话,“编译看左边,运行看右边”。也就是编译时候,会看左边引用类型是否能正确编译通过,运行的时候是调用右边的对象的方法。
就本题来说,编译时候会发现左边满足条件所以编译通过,运行时候又会调用右边也就是 class B 的方法,所以答案都是150。

2.请问输出的结果是:

class A
{
    public A(String str)
    {
         
    }
}
public class Test
{
    public static void main(String[] args) 
    {
        A classa=new A("he");
        A classb=new A("he");
        System.out.println(classa==classb);
    }
}

答案:

false

解析:

对于非字符串变量而言,equals和 == 比较的是地址(未被重写的情况下)
对于字符串变量而言,equals比较的是内容,而 == 比较地址

object类 —— 众类鼻祖
1.取得对象信息:toString():对象输出时,会默认调用Object类的toString()方法,将对象信息变为字符串返回。
2.对象相等判断方法:equals():两个对象进行比较时,实际上是比较两个对象的地址值(从程序看出两个对象内容完全相等,但是结果是不相等的,这是因为classa与classb的内容分别在不同的内存空间指向了不同的内存地址)。所以要对equals()进行覆写,判断equals()方法里面的Object类对象是否与调用equals()的类是同一个类的实例(用instanceof判断),如果是,则进行向下转型,然后再调用String类中的equals方法对属性进行比较。
3.对象签名:hashCode():Object类有两种方法来推断对象的标识:equals()和hashCode()。如果根据equals()方法判断两个对象是相等的,那么对这两个对象中的每一个调用hashCode()方法都必然生成相同的整数结果。但是反过来,如果两个hashCode()返回的结果相等,两个对象的equals()方法却不一定相等。在默认情况下equals()方法用来比较两个对象的地址值,而原始的hashCode()方法用来返回其所在对象的物理地址.

3.下面的代码运行的结果是:

class B extends Object
{
    static
    {
        System.out.println("Load B");
    }
    public B()
    {
        System.out.println("Create B");
    }
}
class A extends B
{
    static
    {
        System.out.println("Load A");
    }
    public A()
    {
        System.out.println("Create A");
    }
}
 
public class Testclass
{
    public static void main(String[] args)
    {
        new A();
    }
}

答案:

Load B
Load A
Create B
Create A

解析:

初始化块在构造器执行之前执行,类初始化阶段先执行最顶层父类的静态初始化块,依次向下执行,最后执行当前类的静态初始化块;创建对象时,先调用顶层父类的构造方法,依次向下执行,最后调用本类的构造方法。

优先级:
父类静态初始化块 > 子类静态初始化块 > 父类初始化块 > 父类构造方法 > 本类初始化块 > 本类构造方法
同级按顺序运行

4.Thread. sleep()是否会抛出checked exception?

答案:

解析:

Thread.sleep() 和 Object.wait(),都可以抛出 InterruptedException。这个异常是不能忽略的,因为它是一个检查异常(checked exception)

Checked Exception:指的是编译时异常,该类异常需要本函数必须处理的,用try和catch处理,或者用throws抛出异常,然后交给调用者去处理异常。
Runtime Exception:指的是运行时异常,该类异常不必须本函数必须处理,当然也可以处理。

Thread.sleep()抛出的InterruptException属于Checked Exception;
IllegalArgumentException属于Runtime Exception;

5.下列说法正确的是:
A. 在类方法中可用this来调用本类的类方法
B. 在类方法中调用本类的类方法可直接调用
C. 在类方法中只能调用本类的类方法
D. 在类方法中绝对不能调用实例方法

答案:

B

解析:

在类方法中调用本类的类方法可直接调用。 实例方法也叫做对象方法。 类方法是属于整个类的,而实例方法是属于类的某个对象的。 由于类方法是属于整个类的,并不属于类的哪个对象,所以类方法的方法体中不能有与类的对象有关的内容。

类方法体有如下限制:
(1) 类方法中不能引用对象变量;
(2) 类方法中不能调用类的对象方法;
(3) 在类方法中不能使用super、this关键字。
(4)类方法不能被覆盖。 如果违反这些限制,就会导致程序编译错误。

与类方法相比,对象方法几乎没有什么限制:
(1) 对象方法中可以引用对象变量,也可以引用类变量;
(2) 对象方法中可以调用类方法;
(3) 对象方法中可以使用super、this关键字。

类中的方法分为:实例方法和类方法
方法类型前面不加关键字static修饰的是实例方法
加static关键字修饰的是类方法(也称"静态方法",沿用C++的叫法)

6.以下代码结果是:

public class foo 
{
    public static void main(String sgf[]) 
    {
 
        StringBuffer a=new StringBuffer("A");
 
        StringBuffer b=new StringBuffer("B");
 
        operate(a,b);
 
        System.out.println(a+"."+b);
    }
    static void operate(StringBuffer x,StringBuffer y) 
    {
        x.append(y);
        y=x;
    }
}

答案:

AB.B

解析:
在这里插入图片描述

对于append函数而言,修改的是x引用所指向的对象本身,所以无论是a还是x,其引用没有变化,但指向的值都变成了AB。然而对于y而言,其修改的是引用的值,也就是y这个形参(局部变量)的引用指向了AB,但对于实参b而言,其指向和指向对象的值都没有变动,所以仍然是B

7.以下代码的输出结果是:

public class B
{
    public static B t1 = new B();
    public static B t2 = new B();
    {
        System.out.println("构造块");
    }
    static
    {
        System.out.println("静态块");
    }
    public static void main(String[] args)
    {
        B t = new B();
    }
}

答案:

构造块
构造块
静态块
构造块

解析:

同级代码从上往下运行,所有运行顺序是1,2,3,4.
当运行1时,静态变量t1被初始化,而初始化过程运行构造块,输出"构造块"
当运行2时,静态变量t2被初始化,而初始化过程运行构造块,输出"构造块"
当运行3时,直接运行静态块,输出"静态块"
当运行4时,实例变量被初始化,而初始化过程运行构造块,输出"构造块"

示意图
在这里插入图片描述

具体分析:

这段代码涉及了类的实例化、构造块(实例初始化块)和静态块(静态初始化块)。

静态成员变量初始化:

public static B t1 = new B();
public static B t2 = new B();

在类加载时,静态成员变量 t1 和 t2 被初始化。由于它们是静态成员,它们在类加载阶段就会被初始化。此时会执行类的构造方法,因此会执行构造块和静态块。

静态块(静态初始化块):

static
{
    System.out.println("静态块");
}

在类加载时,静态块会被执行。因此,在创建类的第一个实例之前,就会输出 “静态块”。

构造块(实例初始化块):

{
    System.out.println("构造块");
}

构造块是在对象实例化时执行的,每次创建对象都会执行。在这个例子中,由于每次创建对象都会执行构造块,所以在每个对象实例化时都会输出"构造块"。

main 方法:

public static void main(String[] args)
{
    B t = new B();
}

在 main 方法中创建了一个类的对象 t,这会触发构造方法的执行。 因为在类加载时已经初始化了静态变量,所以不会再次触发静态块的执行。每次创建对象时都会执行构造块,所以会输出 “构造块”。

8.执行如下程序代码后,

char chr = 127;
int sum = 200;
chr += 1;
sum += chr;

sum的值是()
备注:同时考虑c/c++和Java的情况的话

答案:

C/C++:72
Java:328

解析:

在Java中,char 类型是16位的,即占用2个字节。它的取值范围是 0 到65535,用来表示Unicode字符。在Java中,char类型是无符号的,不支持负值。

在C/C++中,char 类型通常是一个字节,但其符号性是实现定义的。在某些系统中,char 可能是有符号的,取值范围是 -128 到127;而在另一些系统中,char 可能是无符号的,取值范围是 0 到 255。

Java中只有byte, boolean是一个字节, char是两个字节, 所以对于java来说127不会发生溢出, 输出328 .
但是对于c/c++语言来说, char是一个字节, 会发生溢出, 对127加一发生溢出, 0111 1111 —> 1000 0000, 1000 0000为补码-128, 所以结果为200-128=72.


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值