Java面向对象面试题

1. Java面向对象的知识结构

  • 1.1 Java语法以及关键字、如接口与类、内部类,final/finally/finalize, throw/throws,域访问符权限等;

  • 1.2 Java面向对象思想以及体系,例如设计思想。

2. 经典面试题

2.1 Java 有没有 goto? 如果有,一般用在什么地方?如果没有,如何跳出当前的多重嵌套循环?

goto是Java中的保留字,在目前Java版本中没有使用。

在Java中跳出多重循环的的方法有三种:

1. break + 标签,在外层循环前加上一个标签lable,
然后在最里层循环使用 break lable.

public static void main(String[] args) {
    label:    //标记
    for (int i = 0 ; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
                System.out.println("i = " + i + ", j = " + j);
            if(j == 5) {  //满中一定条件跳到某个标记
                break label;
            }
        }
    }
}

2. 通过异常捕获

public static void main(String[] args) {
    try {
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                System.out.println("i = " + i + ", j = " + j);
                if (j == 5) {// 满足一定条件抛异常
                    throw new RuntimeException("test exception for j = 5");
                }
            }
        }
    } catch (RuntimeException e) { //循环外层捕获异常
        e.printStackTrace();
    }
}


3. 通过标置变量

 public static void main(String[] args) {
    boolean flag = false; //初始化标置变量
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            System.out.println("i = " + i + ", j = " + j);
            if (j == 5) {   //满足一定条件进行设置标置变量
                flag = true;
            }
            if (flag) { //内层循环判断标置变量
                break;
            }

        }
        if (flag) {//外层循环判断标置变量
            break;
        }
    }
}

2.2 抽象类(abstract class)和接口(interface)有什么异同?

  • 相同点

      1. 不能直接实例化。如果要实例化,抽象变量必须实现所有抽象方法,接口变量必须实现接口未实现的方法。
      2. 都可以有实现方法(Java1.8之前不能有实现方法)
      3. 都可以不需要实现类或者继承者去实现所有方法(Java8 以前的接口,Java8 及以后的接口中可以包括默认方法,不需要实现者实现)。
    
  • 不同点

      1. 抽象类和接口所反映的设计理念不同,抽象类表示的是对象/类的抽象,接口表示的是行为的抽象。
      
      2. 抽象类不可以多重继承,接口可以多重继承。即一个类只能继续一个抽象类,却可以继承多个接口。
       
      3. 抽象类中的方法可以用 public protected 和 default abstract 修饰符,不能用 private、static、synchronize、native 修饰;变量可以在子类中重新定义,也可以重新赋值;
      接口的方法默认修饰符是 public abstract, Java8 开始出现静态方法,多加 static 关键字;变量默认是 public static final 型,且必须给其初值,在实现类中也不能重新定义,也不能改变其值。
    
      4. 抽象类可以有构造器,接口没有构造器。
    

2.3 Java 创建对象的方式有哪些?

1. 使用 new关键字
2. 反射创建,使用java.lang.Class 类的newInstance 方法

这种方式会调用无参的构造函数来创建对象,有两种实现方式。

//方式一,使用全路径包名
User user = (User)Class.forName("com.imooc.interview.demo.User").newInstance(); 
//方法二,使用class类
User user = User.class.newInstance();

反射,使用 java.lang.reflect.Constructor 类的 newInstance 方法。

Constructor<User> constructor = User.class.getConstructor();
User user = constructor.newInstance();

使用 clone 方法。

public class User implements  Cloneable {
/** 构造方法 */
public User(Integer age) {
    this.age = age;
}

public Integer getAge() {
    return age;
}

private Integer age;

// 重写(Overriding)Object的clone方法
@Override
protected User clone() throws CloneNotSupportedException {
    return (User) super.clone();
}


public static void main(String[] args) throws Exception {
    User person = new User(new Integer(200));
    User clone = person.clone();
    System.out.println("person == clone, result =  " +  (person == clone));  // false,拷贝都是生成新对象
    System.out.println("person.age == clone.age, result =  " +  (person.getAge() == clone.getAge())); // true,浅拷贝的成员变量引用仍然指向原对象的变量引用
}

}

浅拷贝和深拷贝

  • 浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,对拷贝后对象的引用仍然指向原来的对象。

  • 深拷贝:不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。

      3. 使用反序列化。
      为了序列化 / 反序列化一个对象,需要该类实现空接口 Serializable
      
      序列化时首先创建一个输出流对象 oos, 使用 oos 的 writeObject () 方法将 p 对象写入 oos 对象中去。使用反序列化创建对象时,首先创建一个输入流对象 ois,使用输入流对象 ois 的 readObject () 方法将序列化存入的对象读出,重新创建一个对象。
    
      序列化是深拷贝。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359