继承 extends
java中一个类只能继承一个类,可以被多个类继承,只能继承public和protected类型,不能继承private类型
Objec 所有类的父类,所有类默认继承他
Object中的方法(面试重点)
1、equals() 这个方法用于比较两个对象是否相等。在Java中,默认的equals()方法比较的是对象的引用,也就是说,如果两个对象在内存中指向同一个地址,那么它们就被认为是相等的。如果你想比较两个对象的内容是否相等,你需要在你的类中重写equals()方法。注意,在String类中,equals()方法比较的是字符串的内容,而不是引用。
2、getClass() 获取类信息,这个方法用于获取对象的类信息。所有的Java对象都继承自Object类,getClass()方法是Object类的一个方法。当你调用一个对象的getClass()方法时,你得到的是该对象的运行时类(即实际的类)。例如,如果你有一个String对象并调用getClass()方法,你将得到java.lang.String。
3、hasCode() 根据每个对象的地址计算出来,不同对象的散列码有极小的概率重复(散列:局部没有规律,整体均匀)。这个方法用于获取对象的哈希码。哈希码通常用于数据结构(如哈希表),通过哈希码可以快速定位对象在内存中的位置。Java要求如果你重写equals()方法,你也需要重写hashCode()方法。这是因为Java的HashMap和HashSet等数据结构需要同时使用equals()和hashCode()方法来正确地存储和检索对象。两个对象散列码不一样,这两个对象一定是不同的对象,对象不一样,散列码有极小可能一样
equals()和hashCode()方法在hashMap中是如何配合的?
在Java中,HashMap是一种基于哈希表实现的键值对映射的数据结构。在这个结构中,每个键值对(Key-Value Pair)都是一个独立的单元,其中键(Key)用于标识特定的值(Value)。为了能够高效地存储和检索这些键值对,HashMap使用了哈希函数(Hash Function)来计算每个键的哈希码(Hash Code),并用这个哈希码来决定键值对的存储位置。
equals()和hashCode()两个方法在这个过程中起着至关重要的作用。
这两个方法通常需要一起使用,因为如果两个对象相等(即它们的equals()方法返回true),那么它们的hashCode()方法应该返回相同的值。这是因为如果两个对象相等,它们应该在同一个桶中,以便能够正确地被找到和检索。反之,如果两个对象的hashCode()相同,这并不意味着它们的equals()方法也返回true,因为不同的对象可能会被映射到同一个桶中。
总的来说,equals()和hashCode()在HashMap中的配合使得我们能够高效地存储和检索键值对。通过使用这两个方法,我们可以根据键快速地找到特定的值,而不需要遍历整个数据结构。
String s1="OK";
String s2 = new String("OK");
StringBuilder s3 = new StringBuilder (s1) ;
s1和s2的散列码相同,因为String中重写了equals方法,比较大时字符串的内容;s1与s3的散列码不同,因为StringBuilder类中没有hashCode方法,其散列码由Object默认的hashCode()方法导出的是对象的地址。
4、notify() 这个方法用于唤醒在此对象监视器上等待的所有线程。如果有多个线程在等待,则所有线程都会被唤醒。例如,假设你有一个共享资源,当资源可用时,你可能会调用notifyAll()方法来唤醒所有正在等待的线程。
5、notifyAll() 这个方法用于唤醒在此对象监视器上等待的所有线程。如果有多个线程在等待,则所有线程都会被唤醒。例如,假设你有一个共享资源,当资源可用时,你可能会调用notifyAll()方法来唤醒所有正在等待的线程。
6、wait() 这个方法使当前线程等待直到另一个线程调用该对象的notify()方法或notifyAll()方法。这个方法通常在多线程编程中使用,当你需要让当前线程等待某个条件满足时(例如,当一个资源变得可用时),你可能会调用wait()方法
7、toString() 这个方法返回对象的字符串表示形式。在Java的Object类中,toString()方法返回的是对象的类名和对象的哈希码的字符串表示形式。在很多类中(如String类),toString()方法返回的是对象的实际内容。例如,对于字符串"hello",toString()方法将返回"hello"。
在Java中,多态(Polymorphism)是指一个接口或类具有多种形态。它是一种面向对象编程的特性,可以使得代码更加灵活、可扩展,并且更容易维护。
Java中的多态性主要通过以下几种方式实现:
Object类只能被泛型强制转换
new一个子类时,会自动生成所有父类
调用父类方法用super,调用自己方法用this
非静态方法只能依托对象进行调用,静态方法可以直接调用
抽象类 abstract,继承抽象类就必须实现里面的抽象方法,提取共性,不能new抽象类