JAVA--面向对象(3)

接口(interface)

接口的由来:当一个抽象类中 所有的函数都是抽象的时候,那么我们就可以将这个抽象类用另外一种表现形式-接口。

在JDK7之前 接口中是不可以定义具体函数的 
在JDK8以后 接口中是可以定义具体函数的(必须是静态的函数 成员函数还是依旧默认抽象的)

类与类之间是什么关系---单继承 ( 一个类只能且只有一个父类)

接口与类之间是什么关系---实现关系(一个类可以实现多个接口 implements)

接口与接口之间是什么关系---多继承

为什么类与类之间不能多继承?为什么接口与接口之间可以多继承?
 本质就看 函数是否有函数体!

final关键字

  • final修饰变量 表示该变量所存储的数据的地址不能被改变
  • final修饰函数 表示该函数不能被重写
  • final修饰类 表示该类不能被继承

内部类

当我们在描述一个事物的时候,发现该事物当中又存在另外一个事物的时候,

我们把当前的事物称之为外部类 ,另一个事物称之为内部类

class 铁扇公主{
    class 孙悟空{
        }
}

Object类解析

所有类的最终父类都是Object   !!!

native本地函数:就是指当前的方法内容有计算机具体的底层来实现 C/C++语言

  • private static native void registerNatives();

Object的这个类一旦被加载进方法区 则执行 注册本地方法registerNatives()
就会在底层去创建一个Object对象并对类进行一定程度上初始化

static {
        registerNatives();
}

所有Object的子类 可以继承到此方法 但是不能重写

功能:主要就是获取当前类的信息(当前对象的类的对象 - Class类)

本地方法

  •     public final native Class<?> getClass();

功能:获取当前对象的哈希值(在哈希表中的一个存储位置)
本方法可以被重写:
        如果子类重写该方法 就意味着有子类去决定它自己的哈希值
        如果子类没有重写该方法 默认将该对象的地址当做哈希值

  •     public native int hashCode();    *****

功能:当前对象this和传入的对象obj是否相等
           对于Object而言 比较的其实就是两个对象的地址!!!
           如果子类没有重写该方法 那么也默认进行地址的比较!!!
         【一般而言 我们比较的应该对象的内容 而不是对象的地址】
         【== equals有什么区别:==比的永远是地址 equals在Object中与==一样 当然 也可以由子类自行重写】

  •  public boolean equals(Object obj) {    *****
            return (this == obj);
        }

功能:就是当我们直接打印一个对象时 打印的内容默认就是toString返回的内容
           返回当前对象的字符串形式

           Object obj=new Object();
           println(obj); == println(obj.toString()); 

           全类名+@+十六进制哈希值的字符串形式

  •  public String toString() {    *****
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }

基本数据类型包装类

万事万物接对象对象 ,所以我们的基本数据类型其实也有其针对的类描述

    byte    - Byte
    short     - Short
    int     - Integer
    long    - Long
    float    - Float
    double    - Double
    char    - Character
    boolean    - Boolean

    Number
        |-- Byte Short Integer Long Float Double 【BigDecimal BigInteger】
    Object
        |-- Character Boolean

StringBuffer类与StringBuilder类

字符串缓冲区(就是个动态扩容的数组而已!)

String是固定长度的且不能修改内容的字符串

SB就是长度可变的且能够修改内容的字符串

StringBuffer和StringBuilder 方法都是一样的,唯一的区别就在于适用的场景不同

  • StringBuffer适用于多线程
  • StringBuilder适用于单线程
  • StringBuilder是线程不安全的->没加锁(同步锁) 单        效率会更高
  • StringBuffer是线程安全的->加锁(同步锁)        多        效率会更低

String和SB本质上都是字符数组

  • String中不支持字符数组扩容和修改内容的
  • SB中支持字符数组扩容和修改内容的

AbstractStringBuilder
        |impl Appendable 可扩展(字符/字符序列)的
            Appendable append(char c)  
            Appendable append(CharSequence csq)  
            Appendable append(CharSequence csq, int start, int end) 
            
        |impl CharSequence 此接口对许多不同种类的 char 序列提供统一的只读访问
             char charAt(int index)  
             int length()  
             CharSequence subSequence(int start, int end)  
             String toString()  
             
            |StringBuilder 有final表示不能被继承 成员函数没有synchronized修饰 无同步锁
                |impl Serializable
                |impl CharSequence
            |StringBuffer 有final表示不能被继承 成员函数都有synchronized修饰 同步锁
                |impl Serializable
                |impl CharSequence
                
    String 有final表示不能被继承  线程不安全的 会产生额外的垃圾!
        |impl    Serializable
        |impl    Comparable
        |impl    CharSequence

字符串缓冲区SB其实就是个动态扩容的数组而已!
     如果扩容的次数越多,那么也就意味着所用过的数组也越多 产生的垃圾越多!
     我们在使用String去操作的话,也会产生许多临时的字符串 产生的垃圾也多!

     SB产生的垃圾主要集中在         堆内存
     String产生的垃圾主要集中在     方法区(字符串常量池)

【JVM告诉你,GC在堆内存中活跃程度 比在方法区的活跃程度 要大的大的大的多!】
【GC 垃圾收集器】
【也就意味着 GC在堆内存中回收垃圾的效率要远远比在方法区高】
     (堆垃圾就像是家用垃圾桶,满了就清理)
     (方法区就像是垃圾场,满了才清理)
【堆的垃圾被回收的很快 方法区的垃圾回收的很慢】
 综上而言 还是推荐使用SB

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值