Java面试题总结:基础及语法篇169道(四)——(狂神说版)

本文探讨了编程中的一些核心概念,包括if和switch的区别、循环控制(while和do-while)、冒泡排序算法实现、面向对象的特性(封装、继承、多态)以及递归在文件遍历中的应用。此外,还涉及了类的构造方法、关键字this和super的使用,以及代码实例展示了类的继承和方法重写。最后,分析了关键字的使用规则,并给出了面向对象编程在游戏设计中的生活实例。
摘要由CSDN通过智能技术生成

if和switch的异同之处

相同之处: 都是分支语句,多超过一种的情况进行判断处理。

不同之处: switch更适合用于多分支情况,就是有很多种情况需要判断处理,判断条件类型单一。

只有一个入口,在分支执行完后(如果没有break跳出),不加判断地执行下去; 而if—elseif—else多分枝主要适用于分支较少的分支结构,判断类型不是单一,只要一个分支被执行后,后边的分支不再执行。

switch为等值判断(不允许比如>= <=),而if为等值和区间都可以,if的使用范围大。

while和do-while循环的区别

答:while先判断后执行,第一次判断为false , 循环体一次都不执行。

do while先执行 后判断,最少执行1次。

如果while循环第一次判断为true, 则两种循环没有区别。

break和continue的作用

回答:break: 结束当前循环并退出当前循环体。break还可以退出switch语句。

continue: 循环体中后续的语句不执行,但是循环没有结束,继续进行循环条件的判断(for循环还会i++)。continue只是结束本次循环。

请写出冒泡排序代码

public class Bubble {
  public int[] sort(int[] array) {
    int temp = 0;
   // 外层循环,它决定一共走几趟 //-1为了防止溢出
    for (int i = 0; i < array.length - 1; i++) {
      int flag = 0; //通过符号位可以减少无谓的比较,如果已经有序了,就退出循环
      //内层循环,它决定每趟走一次
      for (int j = 0; j < array.length - i - 1; j++) {
        //如果后一个大于前一个,则换位
        if (array[j + 1] > array[j]) {
          temp = array[j];
          array[j] = array[j + 1];
          array[j + 1] = temp;
          flag = 1;
       }
     }
      if(flag == 0){
        break;
     }
   }
    return array;
 }
 
  public static void main(String[] args) {
    Bubble bubble = new Bubble();
    int[] array = {2,5,1,6,4,9,8,5,3,1,2,0};
    int[] sort = bubble.sort(array);
    for (int num:sort){
      System.out.print(num+"\t");
   }
 }
}

this和super关键字的作用

回答:this是对象内部指代自身的引用,同时也是解决成员变量和局部变量同名问题;this可以调用成员变量,不能调用局部变量;

this也可以调用成员方法,但是在普通方法中可以省略this,在构造方法中不允许省略,必须是构造方法的第一条语句。

而且在静态方法当中不允许出现this关键字。

super代表对当前对象的直接父类对象的引用。

super可以调用直接父类的成员变量(注意权限修饰符的影响,比如不能访问private成员)

super可以调用直接父类的成员方法(注意权限修饰符的影响,比如不能访问private成员);

super可以调用直接父类的构造方法,只限构造方法中使用,且必须是第一条语句。

递归应用题

题目 : 使用递归算法输出某个目录下及其子目录下所有文件.
递归 : 自动调用自己 , 需要定义递归出口.

public class ShowFile {
/*
 静态私有化方法的特点:
  1. 方法只能在类内部使用。
  2. 性能提高,静态的函数无需检测this指针是否为空。
  (一般函数的第一个参数是对象本身,而静态的可以为null,不需要额外的检查)
*/
  private static void test(String path) {
    //list()方法是返回某个目录下的所有文件和目录的文件名,返回的是String数组
    //listFiles()方法是返回某个目录下所有文件和目录的绝对路径,返回的是File数组
    File f = new File(path);
    File[] fs = f.listFiles();
    //如果没有文件,返回空;
    if (fs == null) {
      return;
   }
    //递归遍历输出
    for (File file : fs) {
      //如果是文件就直接打印出来,否则就递归循环
      if (file.isFile()) {
        System.out.println(file.getPath());
     } else {
        test(file.getPath());
     }
   }
 }
  public static void main(String[] args) {
    String path = "E:\\XXX\\xxx";
    test(path);
 }
}

给定以下代码,程序将输出 ()

class A {
  public A(){
    System.out.print("A");
 }
}
class B extends A{
  public B(){
    System.out.print("B");
 }
  public static void main(String[] args) {
    B b=new B();
 }
}

A 不能通过编译
B. 通过编译,输出AB
C. 通过编译,输出B
D. 通过编译,输出A

答案:B
分析:在继承关系下,创建子类对象,先执行父类的构造方法,再执行子类的构造方法。

下列关于关键字的使用说法错误的是()

A. abstract不能与final并列修饰同一个类
B. abstract类中可以有private的成员
C. abstract方法必须在abstract类中
D. static方法能处理非static的属性

答案:D

分析:因为static得方法在装载class得时候首先完成,比构造方法早,此时非static得属性和方法还没有完成初始化所以不能调用。

面向对象的特征有哪些方面?请用生活中的例子来描述。

面向对象的三大特征: 封装、继承、多态。

举例:
比如设计一个游戏:

我建了一个对象,叫人。 属性 : 性别,年龄,职业,等级,血量 方法 : 逃跑,吃饭,睡觉,死。

我现在创建了一个对象,名叫战士。 战士的属性 : 性别,年龄,职业,等级,战斗力,血量。 它的方法 : 战斗,逃跑,吃饭,睡觉,死。

我让人,成为战士的父类,战士可以直接继承人的属性和方法。 战士修改成— 属性 : 战斗力。 方法 : 战斗。

看上去战士的资料变少了,实际上没有,我们仍然可以调用方法—战士.死。 而且我们还可以重载战士.死的方法,简称重载死法

我还建了一个对象—法师,父类也是人。 属性 : 法力值 方法 : 施法,泡妞。 你看,用了继承,创建对象变得更方便了。

再后来,我又建立了一个对象,叫怪物。 属性 : 等级,战力,血量。 方法 : 战斗,死。

建了个对象,叫白兔怪,父类怪物,可继承怪物所有的属性和方法。 属性 : 毛色。 方法 : 卖萌,吃胡萝卜。

沉湎于希望的人和守株待兔的樵夫没有什么两样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值