牛客刷题——JAVA

选择题

1、Java 中类的加载顺序

  1. 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)
  2. 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)
  3. 父类非静态代码块(包括非静态初始化块,非静态属性)
  4. 父类构造函数
  5. 子类非静态代码块(包括非静态初始化块,非静态属性)
  6. 子类构造函数

1.其中:类中静态块按照声明顺序执行,并且 (1) 和 (2) 不需要调用 new 类实例的时候就执行了(意思就是在类加载到方法区的时候执行的)

2.其次,需要理解子类覆盖父类方法的问题,也就是方法重写实现多态问题。

下面代码的输出是什么?

public class Base
{
    	private String baseName = "base";
    	public Base()
    	{
        	callName();
    	}
 
    	public void callName()
    	{
        	System. out. println(baseName);
    	}
 
    	static class Sub extends Base
    	{
        	private String baseName = "sub";
        	public void callName()
        	{
            	System. out. println (baseName) ;
        	}
    	}

    	public static void main(String[] args)
    	{
        	Base b = new Sub();
    	}
}
null

分析:

Base b = new Sub(); 它为多态的一种表现形式,声明是 Base,实现是 Sub 类, 理解为 b 编译时表现为 Base 类特性,运行时表现为 Sub 类特性。

当子类覆盖了父类的方法后,意思是父类的方法已经被重写,题中父类初始化调用的方法为子类实现的方法,子类实现的方法中调用的 baseName 为子类中的私有属性。

由 1. 可知,此时只执行到步骤 4.,子类非静态代码块和初始化步骤还没有到,子类中的 baseName 还没有被初始化。所以此时 baseName 为空。所以为 null。


2、this 关键字

在 JAVA 中,假设 A 有构造方法 A(int a),则在类 A 的其他构造方法中调用该构造方法和语句格式应该为()

this.A(x)
this(x)
super(x)
A(x)

分析:

this 的作用其中一个就是在一个构造方法中调用另一个构造方法,格式为 this(参数)

super 是调用父类的方法;

A(a) 这种形式是在 new 一个类时使用。


3、多线程 join 函数

下列代码执行结果为()

public static void main(String args[])throws InterruptedException{
            Thread t=new Thread(new Runnable() {
                public void run() {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    System.out.print("2");
                }
            });
            t.start();
             
            t.join();
            System.out.print("1");
        }
21

分析:

因为子线程的休眠时间太长,因此主线程很有可能在子线程之前结束也就是输出结果是 12,但是子线程用了 join 函数,因此主线程必须等待子线程执行完毕才结束因此输出结果只能是 21。

join() 的作用是:“等待该线程终止”,这里需要理解的就是该线程是指的主线程等待子线程的终止。也就是在子线程调用了 join()方法后面的代码,只有等到子线程结束了才能执行。


4、字符串拆分问题

String str = "";
System.out.print(str.split(",").length);
1

分析:

注意 2 点:

1:split() 返回的是字符串数组,String 获取长度用的是 length()方法,而数组类型我们直接用属性 length 获取长度,所以 String[] 数组类型我们应该用 length 获取长度;

2:总结来说,因为原字符串不包含分隔符,所以直接返回原字符串分割出来只有一个空的字符串数组,所以结果是 1.(注意,虽然原字符串为空,存到字符串数组为空,但是这个空也会算一个元素。)


5、抽象类和接口

下列描述正确的是( )?

类不可以多继承而接口可以多实现		√
抽象类自身可以定义成员而接口不可以
抽象类和接口都不能被实例化		√
一个类可以有多个基类和多个基接口

分析:

1.java 支持单继承,却可以实现多个接口。a 对 d 错
2.接口没有构造方法,所以不能实例化,抽象类有构造方法,但是不是用来实例化的,是用来初始化的。c 对
3.抽象类可以定义普通成员变量而接口不可以,但是抽象类和接口都可以定义静态成员变量,只是接口的静态成员变量要用 static final public 来修饰。b 错


6、赋值语句

下面的 Java 赋值语句哪些是有错误的 ()

int i =1000;
float f = 45.0;		×
char s = ‘\u0639’
Object o = ‘f’;
String s = "hello,world\0";
Double d = 100;		×

7、构造函数

以下程序编译会发生什么错误?

public class MyClass {
    long var;
    public void MyClass(long param) { var = param; }//(1)
    public static void main(String[] args) {
        MyClass a, b;
        a =new MyClass();//(2)
        b =new MyClass(5);//(3)
    }
}

分析:

注意 (1) 处的函数并不是构造函数,普通函数也可以与类重名!!!


8、关于 static 关键字

如下代码的输出结果是什么?

public class Test {
    public int aMethod(){
        static int i = 0;
        i++;
        return i;
    }
public static void main(String args[]){
    Test test = new Test();
    test.aMethod();
    int j = test.aMethod();
    System.out.println(j);
    }
}

分析:

Java 中的静态变量只能在类主体中定义,不能在方法中定义静态变量属于类所有而不属于方法


9、类的加载过程

类的加载过程包括:加载、验证、准备、解析、初始化。

在这里插入图片描述


10、抽象类和接口

jdk1.8 中,下面有关 java 抽象类和接口的区别,说法错误的是?

抽象类可以有构造方法,接口中不能有构造方法	√
抽象类中可以包含非抽象的普通方法,接口中的方法必须是抽象的,不能有非抽象的普通方法	×
一个类可以实现多个接口,但只能继承一个抽象类	√
接口中可以有普通成员变量,抽象类中没有普通成员变量	×

分析:

抽象类

特点:

  1. 抽象类中可以构造方法;
  2. 抽象类中可以存在普通属性,方法,静态属性和方法;
  3. 抽象类中可以存在抽象方法;
  4. 如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法;
  5. 抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。

接口

特点:

  1. 在接口中只有方法的声明,没有方法体;
  2. 在接口中只有常量,因为定义的变量,在编译的时候都会默认加上 public static final ;
  3. 在接口中的方法,永远都被 public 来修饰;
  4. 接口中没有构造方法,也不能实例化接口的对象;
  5. 接口可以实现多继承;
  6. 接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法则实现类定义为抽象类;
  7. 接口中也可以有 default、static 方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值