乐趣区

关于java:15道类和对象面试题会一半算你厉害了

1. 类与对象有哪些区别?

类是一个形象的概念,是对某一事物的形容;而对象是类的实例,是实实在在存在的个体。

比方:“男人”就是一个类(一个概念),而老田(田维常)就是实实在在的一个“对象”。

留神:对象中又有类对象,即 Class 对象,然而类对象始终还是对象,不是类,这两个概念别搞混同了。

2.Java 中能够多继承吗?

Java 中只能单继承,但能够实现多接口,并且反对多层继承。

3.Java 中为什么不能实现多继承?

答:从技术的实现角度来说,是为了升高编程的复杂性。假如 A 类中有一个 m() 办法,B 类中也有一个 m() 办法,如果 C 类同时继承 A 类和 B 类,那调用 C 类的 m() 办法时就会产生歧义,这无疑减少了程序开发的复杂性,为了防止这种问题的产生,Java 语言规定不能多继承类,但能够实现多接口。

4. 笼罩和重载有哪些区别?

  • 重写 (Override) 从字面上看,重写就是 从新写一遍的意思。其实就是在子类中把父类自身有的办法从新写一遍。子类继承了父类原有的办法,但有时子类并不想一成不变的继承父类中的某个办法,所以在办法名,参数列表,返回类型 (除过子类中办法的返回值是父类中办法返回值的子类时) 都雷同的状况下,对办法体进行批改或重写,这就是重写。但要留神子类函数的拜访润饰权限不能少于父类的。
public class Father {public static void main(String[] args) {
        // TODO Auto-generated method stub
        Son s = new Son();
        s.sayHello();}

    public void sayHello() {System.out.println("Hello");
    }
}

class Son extends Father{

    @Override
    public void sayHello() {
        // TODO Auto-generated method stub
        System.out.println("hello by");
    }

}

重写 总结:

1. 产生在父类与子类之间

2. 办法名,参数列表,返回类型(除过子类中办法的返回类型是父类中返回类型的子类)必须雷同

3. 拜访修饰符的限度肯定要大于被重写办法的拜访修饰符(public>protected>default>private)

4. 重写办法肯定不能抛出新的查看异样或者比被重写办法的更加宽泛的查看型异样

  • 重载(Overload)在一个类中,同名的办法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数程序不同)则视为重载。同时,重载对返回类型没有要求,能够雷同也能够不同,但不能通过返回类型是否雷同来判断重载。
public class Father {public static void main(String[] args) {
        // TODO Auto-generated method stub
        Father s = new Father();
        s.sayHello();
        s.sayHello("wintershii");

    }

    public void sayHello() {System.out.println("Hello");
    }

    public void sayHello(String name) {System.out.println("Hello" + " " + name);
    }
}

重载 总结:1. 重载 Overload 是一个类中多态性的一种体现 2. 重载要求同名办法的参数列表不同(参数类型,参数个数甚至是参数程序) 3. 重载的时候,返回值类型能够雷同也能够不雷同。无奈以返回型别作为重载函数的辨别规范。

5. 为什么办法不能依据返回类型来辨别重载?

答:因为在办法调用时,如果不指定类型信息,编译器就不晓得你要调用哪个办法了。比方,以下代码:

float max(int x,int y);
int max(int x,int y);
// 办法调用
max(1,2);

因为 max(1,2) 没有指定返回值,编译器就不晓得要调用哪个办法了。

6. 说说构造方法的特点有哪些?

答:构造方法的特色如下:

  • 构造方法必须与类名雷同;
  • 构造方法没有返回类型(默认返回本类类型);
  • 构造方法不能被继承、笼罩、间接调用;
  • 类定义时提供了默认的无参构造方法;
  • 构造方法能够公有,内部无奈应用公有构造方法创建对象。

构造函数能不能被笼罩?能不能被重载?

构造函数能够重载,但不能笼罩。

7. 以下程序执行的后果是?

class ExecTest {public static void main(String[] args) {Son son = new Son();
    }
}
class Parent{
    {System.out.print("1");
    }
    static{System.out.print("2");
    }
    public Parent(){System.out.print("3");
    }
}
class Son extends Parent{
    {System.out.print("4");
    }
    static{System.out.print("5");
    }
    public Son(){System.out.print("6");
    }
}

后果是:251346

8. 类加载程序

整体

细分

以下程序执行的后果是?

class A {
    public int x = 0;
    public static int y = 0;
    public void m() {System.out.print("A");
    }
}
class B extends A {
    public int x = 1;
    public static int y = 2;
    public void m() {System.out.print("B");
    }
    public static void main(String[] args) {A myClass = new B();
        System.out.print(myClass.x);
        System.out.print(myClass.y);
        myClass.m();}
}

后果是:00B

留神:在 Java 语言中,变量不能被重写。

9.Java 中的 this 和 super 有哪些区别?

this 和 super 都是 Java 中的关键字,起指代作用,在构造方法中必须呈现在第一行,它们的区别如下。

  • 根底概念:this 是拜访本类实例属性或办法;super 是子类拜访父类中的属性或办法。
  • 查找范畴:this 先查本类,没有的话再查父类;super 间接拜访父类。
  • 应用:this 独自应用时,示意以后对象;super 在子类笼罩父类办法时,拜访父类同名办法。

10. 在静态方法中能够应用 this 或 super 吗?为什么?

在静态方法中不能应用 this 或 super,因为 this 和 super 指代的都是须要被创立进去的对象,而静态方法在类加载的时候就曾经创立了,所以没方法在静态方法中应用 this 或 super。

11. 静态方法的应用须要留神哪些问题?

静态方法的应用须要留神以下两个问题:

  • 静态方法中不能应用实例成员变量和实例办法;
  • 静态方法中不能应用 this 和 super。

12.final 修饰符的作用有哪些?

final 也是很多面试喜爱问的中央, 但我感觉这个问题很无聊, 通常能答复下以下 5 点就不错了:

  • 被 final 润饰的类不能够被继承
  • 被 final 润饰的办法不能够被重写
  • 被 final 润饰的变量不能够被扭转. 如果润饰援用, 那么示意援用不可变, 援用指向的内容可变.
  • 被 final 润饰的办法,JVM 会尝试将其内联, 以进步运行效率
  • 被 final 润饰的常量, 在编译阶段会存入常量池中.

除此之外, 编译器对 final 域要恪守的两个重排序规定更好:

在构造函数内对一个 final 域的写入, 与随后把这个被结构对象的援用赋值给一个援用变量, 这两个操作之间不能重排序 首次读一个蕴含 final 域的对象的援用, 与随后首次读这个 final 域, 这两个操作之间不能重排序.

经典应用场景:Integer,String 等类中有应用到。

13. 笼罩 equals() 办法的时候须要恪守哪些规定?

Oracle 官网的文档对于 equals() 重写制订的规定如下。

  • 自反性:对于任意非空的援用值 x,x.equals(x) 返回值为真。
  • 对称性:对于任意非空的援用值 x 和 y,x.equals(y) 必须和 y.equals(x) 返回雷同的后果。
  • 传递性:对于任意的非空援用值 x、y 和 z,如果 x.equals(y) 返回值为真,y.equals(z) 返回值也为真,那么 x.equals(z) 也必须返回值为真。
  • 一致性:对于任意非空的援用值 x 和 y,无论调用 x.equals(y) 多少次,都要返回雷同的后果。在比拟的过程中,对象中的数据不能被批改。
  • 对于任意的非空援用值 x,x.equals(null) 必须返回假。

此题目不要求记忆,能晓得大略即可,属于加分项题目。

14. 在 Object 中 notify() 和 notifyAll() 办法有什么区别?

notify() 办法随机唤醒一个期待的线程,而 notifyAll() 办法将唤醒所有在期待的线程。

如何应用 clone() 办法?

如果是同一个类中应用的话,只须要实现 Cloneable 接口,定义或者解决 CloneNotSupportedException 异样即可,请参考以下代码:

public class CloneTest implements Cloneable {
    int num;
    public static void main(String[] args) throws CloneNotSupportedException {CloneTest ct = new CloneTest();
        ct.num = 666;
        System.out.println(ct.num);
        CloneTest ct2 = (CloneTest) ct.clone();
        System.out.println(ct2.num);
    }
}

如果非外部类调用 clone() 的话,须要重写 clone() 办法,请参考以下代码:

class CloneTest implements Cloneable {
    int num;
    public static void main(String[] args) throws CloneNotSupportedException {CloneTest ct = new CloneTest();
        ct.num = 666;
        System.out.println(ct.num);
        CloneTest ct2 = (CloneTest) ct.clone();
        System.out.println(ct2.num);
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {return super.clone();
    }
}
public class CloneTest2 {public static void main(String[] args) throws CloneNotSupportedException {CloneTest ct = new CloneTest();
        ct.num = 666;
        System.out.println(ct.num);
        CloneTest ct2 = (CloneTest) ct.clone();
        System.out.println(ct2.num);
    }
}

对象克隆是原型模式的经典实现。

15.java 中对象的创立形式有哪几种?

java 中提供了以下四种创建对象的形式:

  • new 创立新对象
  • 通过反射机制
  • 采纳 clone 机制
  • 通过序列化机制
退出移动版