Java笔试面试题(一)

没有章节,没有分类,碰到啥总结啥,路漫漫其修远兮

1、Javac和java命令

Javac是编译,java是执行。(javac命令需要在path中配置java环境变量,classpath是类查找路径)

2、三种循环结构的区别

do…while循环至少会执行一次循环体。

for循环和while循环只有在条件成立的时候才会去执行循环体

eg:问以下程序循环次数
 

int x=37;

int y=3;

while(y<=x){

    y*=y;

}

or:打印各种三角形

3、分支结构

If(表达式){}else if{}else{}

switch(表达式) {

case 值1:语句体1;

                     break;

              case 值2:语句体2;

                     break;

                  …

                  default:语句体n+1;

                     break;

}

三元表达式:表达式?为true的结果:为false的结果

注意:switch语句中一个case后面若没有及时break,可能会出现case穿透的现象。

         eg:
        

final int A = 4;

int a = 2;

switch (a * 2) {

    case A:System.out.print(a);

    default:System.out.println(a * 2);

}

          这个的输出是什么呢?

4、java程序默认都引入一个包?

Java.lang包, 它提供了java中的基础类。包括基本Object类、Class类、String类、基本类型的包装类、基本的数学类等等最基本的类。不需要显式的import就能使用

5、java默认的处理异常的方式

终止程序,显式异常

在Java中异常被当做对象来处理,根类是java.lang.Throwable类,java中异常分为两类:error:一般发生这种异常,JVM会选择终止程序。因此我们编写程序时不需要关心这类异常。

exception:大多是程序员所写程序导致,我们可以处理,还可细分为运行时异常(RuntimeException)(不检查异常)常见的有NullPointerException、IndexOutOfBoundsException、。和非运行时异常(检查异常)常见的有IOException,

处理异常

(1)、对代码块用try..catch进行异常捕获处理;

(2)、在该代码的方法体外用throws进行抛出声明,告知此方法的调用者这段代码可能会出现这些异常,你需要谨慎处理。此时有两种情况:

如果声明抛出的异常是非运行时异常,此方法的调用者必须显示地用try..catch块进行捕获或者继续向上层抛出异常。

如果声明抛出的异常是运行时异常,此方法的调用者可以选择地进行异常捕获处理。

(3)、在代码块用throw手动抛出一个异常对象,此时也有两种情况,跟2中的类似

如果抛出的异常对象是非运行时异常,此方法的调用者必须显示地用try..catch块进行捕获或者继续向上层抛出异常。

如果抛出的异常对象是运行时异常,此方法的调用者可以选择地进行异常捕获处理。

如果最终将异常抛给main方法,则相当于交给jvm自动处理,此时jvm会简单地打印异常信息

自定义异常

补充:

(1),子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法只能抛出父类的异常或者该异常的子类。

(2),如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子类。

(3),如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时也不能抛出异常。如果子类方法发生了异常,就必须try处理,不能抛。

6、继承封装多态

         封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。

    继承是为了重用父类代码。

    面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。

多态指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。即同种事物,在不同境况下的不同的体现方式。

eg:

class Car {

    public static String sName = "sCar";

    public String name = "car";

    public void run() {

        System.out.println("car run...");

    }

}

class BMW extends Car {

    public static String sName = "sBMWCar";

    public String name = "BMWcar";

    public void run() {

        System.out.println("BMWcar run...");

    }

}


有以上代码求以下运行结果:

Car c = new BMW();
System.out.println(c.sName);
System.out.println(c.name);
c.run();

武功秘籍:

         多态关系中成员访问特点

    成员变量:编译看左边,运行看左边

    成员方法:编译看左边,运行看右边

    静态方法:编译看左边,运行看左边

7、基本数据类型

Java里面包含8个基本数据类型,分别是:

boolean、byte、char、short、int、float、douboe、long

        

默认类型转换

    byte,short,char—int—long—float—double

byte,short,char相互之间不转换,他们参与运算首先转换为int类型

这也就解释了下面这道题:下面那一句编译不通过

1.byte b1=3,b2=4,b;

                  2.b=b1+b2;

                  3.b=3+4;

         然后下面这个运算结果是什么?

         int x=1,y=2,z=3;

         System.out.println(y+=z--/++x);

8、值传递和引用传递

(1)基本数据类型传值,对形参的修改不会影响实参;

(2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;

(3)String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。

eg:下面程序的输出结果?

int[] scores = {3,2,1,5,2};

int[] bak = scores; bak[3]=100;

System.out.println(scores[3]);

9、抽象和接口

         abstract:

         1) 抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类;

    2) 没有抽象构造方法,也没有抽象静态方法;也没有final抽象方法

    3) 抽象类中可以有非抽象的构造方法;

4) 抽象类及抽象方法不能被final修饰符修饰。

interface:

解决多重继承问题

  1. 接口中的变量会被隐式地指定为public static final变量,也只能是public static final变量。并且必须被显式初始化。
  2. 接口中的方法会被隐式地指定为public abstract方法且只能是public abstract方法。换句话说,接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。

接口中没有构造方法,不能被实例化。

10、类加载的过程

         1).类加载,同时初始化类中静态的属性(赋默认值)

    2).执行静态代码块

    3).分配内存空间,同时初始化非静态的属性(赋默认值)

    4).调用父类构造器

    5).父类构造器执行完后,如果自己声明属性的同时有显示的赋值,那么进行显示赋值把默认值覆盖

    6).执行匿名代码块

    7).执行构造器

8).返回内存地址

如果父类没有加载过,那么父类要先在内存中加载

eg:

class Print {

    public Print(String msg){

        System.out.println(msg);

    }

}

class Fu {

    private static Print p = new Print("fu name");

    public Fu() {

        System.out.println("new Fu()");

    }

    static {

        System.out.println("Fu password");

    }

}

public class Zi extends Fu{

public static Print print = new Print("Zi name");

    public Zi(){

        System.out.println("new Zi()");

    }

    static {

        Print print = new Print("Zi password");

    }

}

有以上代码,new Zi()会输出什么?

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值