java学习笔记——内部类和Object根类

只愿长相守 提交于 2020-01-20 22:10:28

内部类和Object根类


内部类

内部类简单使用类内部的类就是内部类。

位置:把一个类定义到另一个类中,那么内部的类就是内部类。

注意:内部类不能直接创建

创建内部类的语法:

外部类.内部类 变量名 = new 外部类对象.new内部类对象

内部类的外部类的方法如果想要访问内部类的方法,必须创建内部类的对象,根据内部类的对象来访问。

普通内部类

class Outter{

    int num;

    public void outMethod(){
        System.out.println("我是外部的类的方法");
    }

    class Inner{

        int innerNum;

        public void inMethod(){
            System.out.println("我是内部的类的方法");
        }
    }
}

public class TestInner{
    public static void main(String[] args){
        //创建内部类的对象  外部类.内部类 变量名 = new 外部类对象.new内部类对象
        Outter.Inner inner = new Outter().new Inner();
        inner.innerNum = 13;
        inner.inMethod();//我是内部的类的方法

    }
}

内部类的编译后的class
在这里插入图片描述

内部类的特点

  1. 本类可以直接创建内部类的对象

  2. 内部类的方法可以访问外部类的属性和方法

匿名内部类

什么是匿名类:没有名字的类,这种类需要在接口上实现

匿名类和匿名内部类都需要接口或者抽象类的支持。

创建一个匿名的类的对象这个类的对象实现OuterInter的接口,在大括号中实现接口中的方法,方法调用完毕后就会被垃圾回收

  • 接口中的匿名内部类
interface Outter{

    public void outMethod();

}
class OutterImpl implements Outter {
    public void outMethod(){
    }

}
public class TestInner{
    public static void main(String[] args){
        Outter outter = new OutterImpl();
        outter.outMethod();

        //创建的不是接口本身,new Outter() 后面的大括号就是一个匿名内部类,
        // 实现了Outter接口
       Outter o = new Outter() {
           @Override
           public void outMethod() {
               System.out.println("我是匿名内部类的方法");
           }
       };
       o.outMethod();

    }
    //我是匿名内部类的方法
}
  • 抽象类中的匿名内部类

    abstract class Outter{
        public abstract void outMethod();
    
    }
    public class TestInner{
        public static void main(String[] args){
            //创建的不是接口本身,new Outter() 后面的大括号就是一个匿名内部类,
            // 实现了Outter接口
           Outter o = new Outter() {
               @Override
               public void outMethod() {
                   System.out.println("我是匿名内部类的方法");
               }
           };
           o.outMethod();
    
        }
        //我是匿名内部类的方法
    }
    

Object

Object概述

  • Object是所有类的根类,所有的类都是直接或者间接的去继承Object类。

  • 类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。

  • 在定义一个类时,没有使用extends关键字,也就是没有显式地继承某个类,那么这个类直接继承Object类。所有的对象都继承这个类的方法。
    在这里插入图片描述

基本方法

  • toString()方法

返回当前对象本身的有关信息,返回字符串对象。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。

Object中的toString的实现

Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于: 获得类的名称 “@” getClass().getName() + ‘@’ + Integer.toHexString(hashCode())

public class Test{
    public static void main(String[] args) {
        Object o = new Object();
        System.out.println(o.toString());
    }
}//java.lang.Object@1540e19d
public class Test{
    private String name = "张三";
    private  int age  = 10;

    @Override
    public String toString() {
        return "name='" + name + '\'' + ", age=" + age ;
    }

    public static void main(String[] args) {
        Test t=new Test();
        System.out.println(t.toString());
    }
}//name='张三', age=10
  • getClass()

getClass()返回值是Class(类的类对象),与反射有关。通过getClass().getName()获得对象的类名。

  • hashCode()

由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。

  • finalize()

用于垃圾回收,我们不用手动的去调用,由jvm来调用,

当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

  • equals(Object obj),返回值为布尔类型

    equals用于比较两个对象是否相等

public class Test {
    public static void main(String[] args) {
        //1. 创建Object类型的对象
        Object obj1 = new Object();
        Object obj2 = new Object();

        //2. 测试Object类中的成员方法
        //2.1 hashCode:不同对象的哈希码值一般不同
        int code1 = obj1.hashCode();
        int code2 = obj2.hashCode();
        System.out.println(code1);//356573597
        System.out.println(code2);//1735600054
        
        //2.2 Class<?> getClass():一个类只有一个字节码对象。
        Class cls1 = obj1.getClass();
        Class cls2 = obj2.getClass();
        System.out.println(cls1);//class java.lang.Object
        System.out.println(cls2);//class java.lang.Object
        
        //2.3 String toString():返回对象的字符串形式,默认返回的是地址值,不同的对象有不同的返回值
        //地址值的组成:全类名@该对象的哈希码的无符号十六进制形式
        String s1 = obj1.toString();
        String s2 = obj2.toString();
        System.out.println(s1);//java.lang.Object@1540e19d
        System.out.println(s2);//java.lang.Object@677327b6
        
        //2.4 boolean equals():比较两个对象是否相等,默认比较地址值(无意义),子类一般会重写。
        boolean b = obj1.equals(obj2);
        System.out.println(b);//false
    }
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!