JAVA【01】 牛客面试题

1、多态:编译看左边运行看右边

package Wangyi;
class Base
{
    public void method()
    {
        System.out.println("Base");
    } 
}
class Son extends Base
{
    public void method()
    {
        System.out.println("Son");
    }
    
    public void methodB()
    {
        System.out.println("SonB");
    }
}
public class Test01
{
    public static void main(String[] args)
    {
        Base base = new Son();
        base.method();
        base.methodB();
    }
}

在这里插入图片描述
这类多态问题中,无论向上或向下转型,都记住一句话就可以了。
编译看左边,运行看右边。意思编译时候,看左边有没有该方法,运行的时候结果看 new 的对象是谁,就调用的谁。

多态成员访问特点
成员变量:编译看左边,运行看左边
静态变量:编译看左边,运行看左边
成员方法:编译看左边,运行看右边
静态方法:编译看左边,运行看左边

2、在基本JAVA类型中,如果不明确指定,整数型的默认是什么类型?带小数的默认是什么类型?

在这里插入图片描述

3、下面哪种情况会导致持久区jvm堆内存溢出?

正确答案: C
A 、 循环上万次的字符串处理
B 、 在一段代码内申请上百M甚至上G的内存
C 、使用CGLib技术直接操作字节码运行,生成大量的动态类
D 、 不断创建对象

4、A,B,C,D 中哪些是 setvar的重载?

public class methodover
{
    public void setVar(int a, int b, float c) {}
}

A、private void setVar(int a, float c, int b){}
B、protected void setVar(int a, int b, float c){}
C、public int setVar(int a, float c, int b){return a;}
D、public int setVar(int a, float c){return a;}

重载是在同一个类中,有多个方法名相同,参数列表不同(参数个数不同,参数类型不同),与方法的返回值无关与权限修饰符无关,B中的参数列表和题目的方法完全一样了。

5、"|“与”||"的区别*

public class Test {
    private static int j = 0;

    private static Boolean methodB(int k) {
        j += k;
        return true;
    }

    public static void methodA(int i) {
        boolean b;
        b = i < 10 | methodB(4);
        b = i < 10 || methodB(8);

    }

    public static void main(String args[]) {
        methodA(0);
        System.out.println(j);
    }
}

在这里插入图片描述
这道题主要考的是"|“与”||"的区别
用法:condition 1 | condition 2、condition 1 || condition 2
"|"是按位或:先判断条件1,不管条件1是否可以决定结果(这里决定结果为true),都会执行条件2
"||"是逻辑或:先判断条件1,如果条件1可以决定结果(这里决定结果为true),那么就不会执行条件2

6、判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个:

  1. 给对象赋值为null,以下没有调用过。
  2. 给对象赋了新的值,重新分配了内存空间。
    在这里插入图片描述

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

public class OuterClass{
   private float f=1.0f;
    //插入代码到这里
}

class InnerClass{
public static float func(){return f;}
}
abstract class InnerClass{
public abstract float func(){}
}
static class InnerClass{
protected static float func(){return f;}
}
public class InnerClass{
static float func(){return f;}
}

正确答案: A B C D

主要考核了这几个知识点:

  1. 静态内部类才可以声明静态方法
  2. 静态方法不可以使用非静态变量
  3. 抽象方法不可以有函数体

8、下列有关java构造函数叙述正确的是()

正确答案: C D

A、构造器的返回值为void类型
B、如果一个源文件中有多个类,那么构造器必须与公共类同名
C、构造器可以有0个,1个或一个以上的参数
D、每个类可以有一个以上的构造器

构造方法是一种特殊的方法,具有以下特点。
(1)构造方法的方法名必须与类名相同。
(2)构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。
(3)构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。
(4)一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码。
(5)构造方法可以重载,以参数的个数,类型,顺序。

9、初始化过程

以下程序执行的结果是

class X{
	Y y=new Y();
	public X(){
		System.out.print("X");
	}
}
class Y{
	public Y(){
		System.out.print("Y");
	}
}
public class Z extends X{
	Y y=new Y();
	public Z(){
		System.out.print("Z");
	}
	public static void main(String[] args) {
		new Z();
	}
}

正确答案:YXYZ
初始化过程:

  1. 初始化父类中的静态成员变量和静态代码块 ;
  2. 初始化子类中的静态成员变量和静态代码块 ;
  3. 初始化父类的普通成员变量和代码块,再执行父类的构造方法;
  4. 初始化子类的普通成员变量和代码块,再执行子类的构造方法;

(1)初始化父类的普通成员变量和代码块,执行 Y y=new Y(); 输出Y
(2)再执行父类的构造方法;输出X
(3) 初始化子类的普通成员变量和代码块,执行 Y y=new Y(); 输出Y
(4)再执行子类的构造方法;输出Z
所以输出YXYZ

10、在创建派生类对象,构造函数的执行顺序()

A、基类构造函数,派生类对象成员构造函数,派生类本身的构造函数
B、派生类本身的构造函数,基类构造函数,对象成员构造函数
C、基类构造函数,派生类本身的构造函数,派生类对象成员构造函数
D、对象成员构造函数,基类构造函数,派生类本身的构造函数

学java的看这边:
父类静态域——>子类静态域——>父类成员初始化——>父类构造块——>1父类构造方法——>2子类成员初始化——>子类构造块——>3子类构造方法;
加黑的123,对应为A

11、JAVA 中可以让线程停止执行方法有()

在这里插入图片描述

12、full GC触发的条件可能有哪些

答案: 老年代满、持久代满、System.gc()
分析:
在这里插入图片描述

  1. 新生代:(1)所有对象创建在新生代的Eden区,当Eden区满后触发新生代的Minor GC,将Eden区和非空闲Survivor区存活的对象复制到另外一个空闲的Survivor区中。(2)保证一个Survivor区是空的,新生代Minor GC就是在两个Survivor区之间相互复制存活对象,直到Survivor区满为止。
  2. 老年代:当Survivor区也满了之后就通过Minor GC将对象复制到老年代。老年代也满了的话,就将触发Full GC,针对整个堆(包括新生代、老年代、持久代)进行垃圾回收。
  3. 持久代:持久代如果满了,将触发Full GC。

13、以下JAVA程序代码的输出是

public static void main(String args[]) {
    System.out.println(17^5);
}

亦或运算符号。
运算规则是:两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1。
17:0001 0001
5: 0000 0101
结果:0001 0100 转10进制:20

&按位与 |按位或 ~取反 ^异或

14、对于如下代码段

class A{
    public A foo(){return this;}
}
class B extends A{
    public A foo(){
        return this;
    }
}
class C extends B

{
    _______

}

在这里插入图片描述
重写 :要求两同两小一大原则,
方法名相同,参数类型相同,子类返回类型小于等于父类方法返回类型, 子类抛出异常小于等于父类方法抛出异常, 子类访问权限大于等于父类方法访问权限。[注意:这里的返回类型必须要在有继承关系的前提下比较]

重载
方法名必须相同,参数类型必须不同,包括但不限于一项,参数数目,参数类型,参数顺序

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

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中静态变量只能在类主体中定义,不能在方法中定义。 静态变量属于类所有而不属于方法。

16、下面哪个行为被打断会导致InterruptedException

API里面写的:当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出该异常。
在这里插入图片描述

抛InterruptedException的代表方法有:
java.lang.Object 类的 wait 方法
java.lang.Thread 类的 sleep 方法
java.lang.Thread 类的 join 方法

CyclicBarrier是一个屏障类,它的await方法可以简单的理解为:等待多个线程同时到达之后才能继续进行,在此之前它就是这些线程的屏障,线程不能继续进行,而对于失败的同步尝试,CyclicBarrier 使用了一种要么全部要么全不 (all-or-none) 的破坏模式:如果因为中断、失败或者超时等原因,导致线程过早地离开了屏障点,那么在该屏障点等待的其他所有线程也将通过 BrokenBarrierException(如果它们几乎同时被中断,则用 interruptedException)以反常的方式离开。因此它被中断也是可以抛出interruptedException的

17、访问修饰符

在这里插入图片描述

18、顺序执行下列程序语句后,则b的值是()

String a="Hello";
String b=a.substring(0,2);

String b=a.substring(0,2);左开右闭

19,抽象类和接口修饰符

关于抽象类
JDK 1.8以前,抽象类的方法默认访问权限为protected
JDK 1.8时,抽象类的方法默认访问权限变为default

关于接口
JDK 1.8以前,接口中的方法必须是public的
JDK 1.8时,接口中的方法可以是public的,也可以是default的
JDK 1.9时,接口中的方法可以是private的

20、面向对象设计七大原则

  1. 单一职责原则(Single Responsibility Principle) 每一个类应该专注于做一件事情。
  2. 里氏替换原则(Liskov Substitution Principle) 超类存在的地方,子类是可以替换的。
  3. 依赖倒置原则(Dependence Inversion Principle) 实现尽量依赖抽象,不依赖具体实现。
  4. 接口隔离原则(Interface Segregation Principle) 应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口
  5. 迪米特法则(Law Of Demeter) 又叫最少知识原则,一个软件实体应当尽可能少的与其他实体发生相互作用。
  6. 开闭原则(Open Close Principle) 面向扩展开放,面向修改关闭。
  7. 组合/聚合复用原则(Composite/Aggregate Reuse Principle CARP) 尽量使用合成/聚合达到复用,尽量少用继承。

21、基本数据类型占字节

数据类型 所占字节 范围
byte 1个字节 (-128 - 127)
short 2个字节 (-2^15 - 2^15 -1)
int 4个字节 (-2^31 - 2^31 -1)
long 8个字节
float 4个字节
double 8个字节
char 2个字节
boolean 1个字节或4个字节

在java规范2中,如果boolean用于声明一个基本类型变量时占4个字节,如果声明一个数组类型的时候,那么数组中的每个元素占1个字节。

22、下列代码片段中,存在编译错误的语句是()

正确答案: B C D 语句1/3/4

byte b1=1,b2=2,b3,b6,b8;
final byte b4=4,b5=6,b7;
b3=(b1+b2);  /*语句1*/
b6=b4+b5;    /*语句2*/
b8=(b1+b4);  /*语句3*/
b7=(b2+b5);  /*语句4*/
System.out.println(b3+b6);

b4 、b5被声明final 所以类型是不会转换, 计算结果任然是byte ,所以 语句2正确。

23、 java 类加载器

A、引导类加载器(bootstrap class loader):
		它用来加载 Java 的核心库,是用原生代码来实现的
B、扩展类加载器(extensions class loader):
		它用来加载 Java 的扩展库。
C、系统类加载器(system class loader):
		它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类
D、tomcat 为每个 App 创建一个 Loader,里面保存着此 WebApp 的 ClassLoader。
		需要加载 WebApp 下的类时,就取出 ClassLoader 来使用

24、左移右移

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42390340/article/details/108293706