Java进阶知识,看看有没有你的知识盲区
点击上方“罗晓胜”,马上关注,您的支持对我帮助很大
上期文章
/ 前言 /
本篇文章会介绍接口和抽象类,静态类和非静态类,override和overload,以及Object的用法,包括你知道的和你不知道的,如果你感兴趣就接着往下看吧!
/ 正文 /
Interface与abstract类的区别
-
抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。
-
一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。
-
接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。
-
抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。
-
抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。
-
有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。
Static class 与non static class的区别
内部静态类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的引用。非静态内部类能够访问外部类的静态和非静态成员。静态类不能访问外部类的非静态成员。他只能访问外部类的静态成员。一个非静态内部类不能脱离外部类实体被创建,一个非静态内部类可以访问外部类的数据和方法,因为他就在外部类里面。
foreach与正常for循环效率对比
直接for循环效率最高,其次是迭代器和 ForEach操作。作为语法糖,其实 ForEach 编译成 字节码之后,使用的是迭代器实现的,反编译后,testForEach方法如下:
public static void testForEach(List list) {
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
Object t = iterator.next();
Object obj = t;
}
}
可以看到,只比迭代器遍历多了生成中间变量这一步,因为性能也略微下降了一些。
Override和Overload的含义与区别
-
Overload:顾名思义,就是Over(重新)——load(加载),所以中文名称是重载。它可以表现类的多态性,可以是函数里面可以有相同的函数名但是参数名、类型不能相同;或者说可以改变参数、类型但是函数名字依然不变。
-
Override:就是ride(重写)的意思,在子类继承父类的时候子类中可以定义某方法与其父类有相同的名称和参数,当子类在调用这一函数时自动调用子类的方法,而父类相当于被覆盖(重写)了。
-
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
Object有哪些公用方法?
1.clone方法 保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。主要是JAVA里除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递,我们有时候不希望在方法里讲参数改变,这是就需要在类中复写clone方法。
2.getClass方法 final方法,获得运行时类型。
3.toString方法 该方法用得比较多,一般子类都有覆盖。
4.finalize方法 该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
5.equals方法 该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。
6.hashCode方法 该方法用于哈希查找,可以减少在查找中使用equals的次数,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。一般必须满足obj1.equals(obj2)==true。可以推出obj1.hashCode()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。如果不重写hashCode(),在HashSet中添加两个equals的对象,会将两个对象都加入进去。
7.wait方法
-
wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。调用该方法后当前线程进入睡眠状态,直到以下事件发生。
-
其他线程调用了该对象的notify方法。
-
其他线程调用了该对象的notifyAll方法。
-
其他线程调用了interrupt中断该线程。
-
时间间隔到了。此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
-
8.notify方法 该方法唤醒在该对象上等待的某个线程。
9.notifyAll方法 该方法唤醒在该对象上等待的所有线程。
/ 总结 /
本文主要讲了java开发中的一些特性对比介绍,java像此类的特性还有很多,例如Object,单列一篇文章都讲不完,后续文章大家敬请期待。
往期推荐:
关注我的公众号,学习技术或投稿
长按上图,识别图中二维码即可关注
上一篇: 也说AOP