zoukankan      html  css  js  c++  java
  • Java SE 基础 (2)

    一、Java 中的 重写(Override)和 重载(Overload)的区别

    1. 重写(Override)

    重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值、方法名和参数类型都不能改变。

    重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。

    方法重写规则:

    • 参数列表必须完全与被重写方法的相同;
    • 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected;
    • 父类的成员方法只能被它的子类重写;
    • 声明为 final 的方法不能被重写;
    • 声明为 static 的方法不能被重写,但是能够被再次声明;
    • 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法;
    • 子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法;
    • 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以;
    • 构造方法不能被重写;
    • 如果不能继承一个方法,则不能重写这个方法。

    2. 重载(Overload)

    重载 (overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。

    每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表

    重载规则:

    • 被重载的方法必须改变参数列表(参数个数或类型不一样);
    • 被重载的方法可以改变返回类型;
    • 被重载的方法可以改变访问修饰符;
    • 被重载的方法可以声明新的或更广的检查异常;
    • 方法能够在同一个类中或者在一个子类中被重载;
    • 无法以返回值类型作为重载函数的区分标准。

    重写与重载的区别:

    1. 方法重载是同一个类中方法名相同,但是参数的数量不同或数量相同而类型和次序不同;
    2. 方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法;
    3. 方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。

    二、Java 中的引用

     Java 中有四种引用:强引用、软引用、弱引用和虚引用

    1. 强引用(StrongReference):即常用的 Object object = new Object(); 只要强引用还存在,垃圾回收器就永远不会回收掉此类对象。

    只要某个对象有强引用与之关联,JVM 必定不会回收这个对象,即使在内存不足的情况下,JVM 宁愿抛出 OutOfMemory 错误也不会回收这种对象。比如下面这段代码:

    public class Main {
        public static void main(String[] args) {
            new Main().fun1();
        }
          
        public void fun1() {
            Object object = new Object();
            Object[] objArr = new Object[1000];
        }
    }

    当运行至 Object[] objArr = new Object[1000]; 这句时,如果内存不足,JVM 会抛出 OOM 错误也不会回收 object 指向的对象。不过要注意的是,当fun1运行完之后,object和objArr都已经不存在了,所以它们指向的对象都会被JVM回收。

    如果想中断强引用和某个对象之间的关联,可以显示地将引用赋值为null,这样一来的话,JVM 在合适的时间就会回收该对象。

    2. 软引用(SoftReference):用来描述一些还有用但非必须的对象。在内存即将发生溢出前,会把这些对象列进回收范围之中进行二次垃圾回收。如果这次回收还没有足够内存,才会发生内存溢出异常。软引用可以用来实现内存敏感的高速缓存。在 Java 中用java.lang.ref.SoftReference 类来表示。

    对于软引用关联着的对象,只有在内存不足的时候 JVM 才会回收该对象。因此,这一点可以很好地用来解决 OOM 的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。如下代码所示:

    import java.lang.ref.WeakReference;
      
    public class Main {
        public static void main(String[] args) {
          
            SoftReference<String> sr = new SoftReference<String>(new String("hello"));
              
            System.out.println(sr.get());
            System.gc();                //通知JVM的gc进行垃圾回收
            System.out.println(sr.get());
        }
    }

    3. 弱引用(WeakReference)描述非必须的对象。被弱引用关联的对象只能存活到下一次垃圾收集发生之前。当进行垃圾回收时,无论当前内存是否足够,都将回收掉被弱引用关联的对象。

    在java中,用 java.lang.ref.WeakReference 类来表示。如下代码所示:

    import java.lang.ref.WeakReference;
      
    public class Main {
        public static void main(String[] args) {
          
            WeakReference<String> sr = new WeakReference<String>(new String("hello"));
              
            System.out.println(sr.get());
            System.gc();                //通知JVM的gc进行垃圾回收
            System.out.println(sr.get());
        }
    }

    4. 虚引用(PhantomReference):最弱的一种引用关系。无法通过一个虚引用获得一个对象的实例;一个对象是否有虚引用,都不会对其生存周期构成影响。设置虚引用的唯一目的就是在垃圾回收时收到一个系统通知。

    虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾使用回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收前采取必要的行动。

    软引用、弱引用的使用场景:实现内存敏感的高速缓存。

    作者:意无尽 公众号:意无尽 关于作者:本人目前传统专业,现自学 Java,后续会有向大数据方向转型。希望自己能一步一个脚印的走下去,以此博客来见证我技术的成长轨迹!
  • 相关阅读:
    css 三角形
    转盘
    使用history.back()出现"警告: 网页已过期的解决办法"
    jQuery 左侧滑动
    Go语言数组的使用
    Go的变量作用域
    Go语言中函数的实现
    Go语言循环判断的使用~
    Go基础
    go环境的安装~
  • 原文地址:https://www.cnblogs.com/reformdai/p/10678990.html
Copyright © 2011-2022 走看看