JAVA-面向对象

1. 一个不重写的类的equals()方法是如何比较的

比较是对象的地址

2. hashCode()和equals()方法联系

➀相等(相同)的对象必须具有相等的哈希码(或者散列码)。
➁如果两个对象的hashCode相同,它们并不一定相同。

3.构造函数、构造函数重载

当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。
Java中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。

只有返回值类型不同的方法,不构成重载;只有形参的名称不同,不构成方法重载。

4.Java中的方法覆盖(Overriding)和方法重载(Overloading)

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。
Java中static方法不能被重写,因为方法重写是基于运行时动态绑定的,而static方法是编译时静态绑定的。

5.Query接口的list方法和iterate方法

①list()方法无法利用一级缓存和二级缓存(对缓存只写不读),它只能在开启查询缓存的前提下使用查询缓存;iterate()方法可以充分利用缓存,如果目标数据只读或者读取频繁,使用iterate()方法可以减少性能开销。
② list()方法不会引起N+1查询问题,而iterate()方法可能引起N+1查询问题

6.面向对象的"六原则一法则"

  • 单一职责原则:一个类只做它该做的事情。
  • 开闭原则:软件实体应当对扩展开放,对修改关闭。
    开闭有两个要点:①抽象是关键,一个系统中如果没有抽象类或接口系统就没有扩展点;②封装可变性,将系统中的各种可变因素封装到一个继承结构
  • 依赖倒转原则:面向接口编程
  • 里氏替换原则:任何时候都可以用子类型替换掉父类型
  • 接口隔离原则:接口要小而专,绝不能大而全
  • 合成聚合复用原则:优先使用聚合或合成关系复用代码。
  • 迪米特法则:迪米特法则又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解。

7.通过反射获取和设置对象私有字段的值

可以通过类对象的getDeclaredField()方法字段(Field)对象,然后再通过字段对象的setAccessible(true)将其设置为可以访问,接下来就可以通过get/set方法来获取/设置字段的值了。

8.内部类引用

一个内部类对象可以访问创建它的外部类对象的内容,内部类如果不是static的,那么它可以访问创建它的外部类对象的所有属性,内部类如果是sattic的,即为nested class,那么它只可以访问创建它的外部类对象的所有static属性,一般普通类只有public或package的访问修饰,而内部类可以实现static,protected,private等访问修饰。当从外部类继承的时候,内部类是不会被覆盖的,它们是完全独立的实体,每个都在自己的命名空间内,如果从内部类中明确地继承,就可以覆盖原来内部类的方法。

9.异常处理,关键字:throws,throw,try,catch,finally

Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。
在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。
当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。
Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。
一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。用try来指定一块预防所有”异常”的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的”异常”的类型。throw语句用来明确地抛出一个”异常”。throws用来标明一个成员函数可能抛出的各种”异常”。Finally为确保一段代码不管发生什么”异常”都被执行一段代码。
可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。
每当遇到一个try语句,”异常“的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种”异常”进行处理,堆栈就会展开,直到遇到有处理这种”异常”的try语句。

10.请判断当一个对象被当作参数传递给一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
Java参数,不管是原始类型还是引用类型,传递的都是副本。
如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.
如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的 值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的地址,所以不会改变参数的值。

11.静态内部类和内部类

Static Nested Class静态内部类可以在不创建实例的条件下直接创建,因为它只访问静态方法和成员,它和类直接绑定,并且不能访问任何非静态类型的方法和成员变量。
Inner class内部类是和实例绑定的,他可以访问实例的成员变量和方法,所以在创建它之前必须先创建一个实例,然后通过实例创建它才行。

12.abstract class和interface区别

声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它可以在实现了该接口的类的任何对象上调用接口的方法。

13.final, finally, finalize的区别

  • final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
  • finally是异常处理语句结构的一部分,表示总是执行。
  • finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以复写此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

14.面向对象的特征

  • 抽象:
    – 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
    – 抽象类不能被实例化;抽象方法是必须被子类重写的方法;如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法。
  • 继承:
    – 继承定义了类如何相互关联,共享特性。继承的工作方式是,定义父类和子类,或叫做基类或者派生类,其中子类继承父类的所有特性,还可以定义新的特性。
    – 如果子类继承于父类:1.子类拥有父类非private的属性和功能;2.子类具有自己的属性和功能,即子类可以扩展父类没有的属性和功能;3.子类可以以自己的方式实现父类的功能(方法重写)
  • 封装:
    – 每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装,因此对象不必依赖其他对象来完成自己的操作。
    – 封装的优势:1.良好的封装能够减少耦合2.类内部的实现可以自由地修改3.类具有清晰的对外接口
  • 多态:
    – 多态表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。
    – 子类以父类的身份出现;子类在工作时以自己的方式来实现;子类以父类的身份出现时,子类特有的属性和方法不可以使用。

15.Comparable和Comparator接口的作用以及区别

Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以给两个对象排序。
Java提供了包含compare()和equals()两个方法的Comparator接口。
– compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。
– equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。

16.接口和抽象类的区别

Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
– 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
JDK1.8后接口中的类方法、默认方法、私有方法都可以有方法体的。
– 类可以实现很多个接口,但是只能继承一个抽象类
– 类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
– 抽象类可以在不提供接口方法实现的情况下实现接口。
– Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
– Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
– 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。

17.通过反射创建对象

  • 方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance()
  • 方法2:通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInstance(“Hello”);

18.static环境中访问非static变量

static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。

19.extends 和super 泛型限定符

20.什么是泛型

泛型,即“参数化类型”,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

21.类加载机制

某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。

22.Object类的方法

  • Object()默认构造方法。
  • clone() 创建并返回此对象的一个副本。
  • equals(Object obj) 指示某个其他对象是否与此对象“相等”。
  • finalize()当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
  • getClass()返回一个对象的运行时类。
  • hashCode()返回该对象的哈希码值。
  • notify()唤醒在此对象监视器上等待的单个线程。
  • notifyAll()唤醒在此对象监视器上等待的所有线程。
  • toString()返回该对象的字符串表示。
  • wait()导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
  • wait(long timeout)导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。
  • wait(long timeout, int nanos) 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。

23.类和对象

  • 对象是一个自包含的实体,用一组可识别的特性和行为来标识。
  • 类是具有相同的属性和功能的对象的抽象的集合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值