文章目录
- 1、多态:编译看左边运行看右边
- 2、在基本JAVA类型中,如果不明确指定,整数型的默认是什么类型?带小数的默认是什么类型?
- 3、下面哪种情况会导致持久区jvm堆内存溢出?
- 4、A,B,C,D 中哪些是 setvar的重载?
- 5、"|"与"||"的区别*
- 6、判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个:
- 7、往OuterClass类的代码段中插入内部类声明, 哪一个是错误的:
- 8、下列有关java构造函数叙述正确的是()
- 9、初始化过程
- 10、在创建派生类对象,构造函数的执行顺序()
- 11、JAVA 中可以让线程停止执行方法有()
- 12、full GC触发的条件可能有哪些
- 13、以下JAVA程序代码的输出是
- 14、对于如下代码段
- 15、如下代码的输出结果是什么?
- 16、下面哪个行为被打断会导致InterruptedException
- 17、访问修饰符
- 18、顺序执行下列程序语句后,则b的值是()
- 19,抽象类和接口修饰符
- 20、面向对象设计七大原则
- 21、基本数据类型占字节
- 22、下列代码片段中,存在编译错误的语句是()
- 23、 java 类加载器
- 24、左移右移
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、判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个:
- 给对象赋值为null,以下没有调用过。
- 给对象赋了新的值,重新分配了内存空间。
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
主要考核了这几个知识点:
- 静态内部类才可以声明静态方法
- 静态方法不可以使用非静态变量
- 抽象方法不可以有函数体
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)初始化父类的普通成员变量和代码块,执行 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)所有对象创建在新生代的Eden区,当Eden区满后触发新生代的Minor GC,将Eden区和非空闲Survivor区存活的对象复制到另外一个空闲的Survivor区中。(2)保证一个Survivor区是空的,新生代Minor GC就是在两个Survivor区之间相互复制存活对象,直到Survivor区满为止。
- 老年代:当Survivor区也满了之后就通过Minor GC将对象复制到老年代。老年代也满了的话,就将触发Full GC,针对整个堆(包括新生代、老年代、持久代)进行垃圾回收。
- 持久代:持久代如果满了,将触发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、面向对象设计七大原则
- 单一职责原则(Single Responsibility Principle) 每一个类应该专注于做一件事情。
- 里氏替换原则(Liskov Substitution Principle) 超类存在的地方,子类是可以替换的。
- 依赖倒置原则(Dependence Inversion Principle) 实现尽量依赖抽象,不依赖具体实现。
- 接口隔离原则(Interface Segregation Principle) 应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口
- 迪米特法则(Law Of Demeter) 又叫最少知识原则,一个软件实体应当尽可能少的与其他实体发生相互作用。
- 开闭原则(Open Close Principle) 面向扩展开放,面向修改关闭。
- 组合/聚合复用原则(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 来使用