JAVA之旅(九)——Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类


天天被一些琐事骚扰,学习还得继续

一.Object类

Object是什么呢?我们可以翻阅JAVA API文档看他的介绍

上面介绍说,object是类层次结构的根类,也就是超类

  • Object:是所有对象的直接后者间继承关系,传说中的老祖宗,你父亲还有父亲,你父亲的父亲还有父亲是爷爷,这是继承关系,但是你的祖宗却只有一位,该类中定义的肯定是所有对象都具备的功能
class Demo { // extends Object

}

1.equals

我们可以用equals去比较两个对象是否相同

//公共的   类   类名
public class HelloJJAVA {
    // 公共的 静态 无返回值 main方法 数组
    public static void main(String[] str) {
        // 比较
        Demo1 demo1 = new Demo1();
        Demo2 demo2 = new Demo2();
        System.out.println(demo1.equals(demo2));
    }
}

class Demo1 {

}

class Demo2 {

}

结果肯定返回的是false

这里我们要注意的是,他比较的是内存地址

假设我们需要定义一个比较内容

//公共的   类   类名
public class HelloJJAVA {
    // 公共的 静态 无返回值 main方法 数组
    public static void main(String[] str) {
        // 比较
        Demo demo1 = new Demo(5);
        Demo demo2 = new Demo(8);
        System.out.println(demo1.Comper(demo2));
    }
}

class Demo {

    private int num;

    public Demo(int num) {
        this.num = num;
    }

    public boolean Comper(Demo d) {
        return this.num == d.num;
    }
}

他返回的也是false,但是我们有必要这样去做吗?

  • object类中已经提供了对对象是否相同的比较方法,如果自定义类中也有相同的功能,没有必要重新定义,只要沿袭父类的功能,简历自己的特有内容即可,这就是覆盖,所以我们已经复写
//公共的   类   类名
public class HelloJJAVA {
    // 公共的 静态 无返回值 main方法 数组
    public static void main(String[] str) {
        // 比较
        Demo demo1 = new Demo(5);
        Demo demo2 = new Demo(5);
        System.out.println(demo1.equals(demo2));
    }
}

class Demo {

    private int num;

    public Demo(int num) {
        this.num = num;
    }

    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        return this.num == ((Demo)obj).num;
    }
}

这里运用了多态的向下转型

2.toString

转换成字符串

//公共的   类   类名
public class HelloJJAVA {
    // 公共的 静态 无返回值 main方法 数组
    public static void main(String[] str) {
        // 比较
        Demo demo = new Demo(5);
        System.out.println(demo.toString());
    }
}

class Demo {

    private int num;

    public Demo(int num) {
        this.num = num;
    }
}

转换的结果十什么呢?

这个是什么值呢?

  • 类名@哈希值

什么是哈希值?我们可以用toHexString来转换

System.out.println(demo.toString());
System.out.println(Integer.toHexString(demo.hashCode()));

3.getClass

这个就不用多说,返回当前运行的Class,所以

//公共的   类   类名
public class HelloJJAVA {
    // 公共的 静态 无返回值 main方法 数组
    public static void main(String[] str) {
        // 比较
        Demo demo = new Demo(5);
        /*
         * System.out.println(demo.toString());
         * System.out.println(Integer.toHexString(demo.hashCode()));
         */

        System.out.println(demo.getClass());
    }
}

class Demo {

    private int num;

    public Demo(int num) {
        this.num = num;
    }
}

我们这里就直接返回了Demo

方法还有很多,比如getName

System.out.println(demo.getClass().getName());

得到的就是Demo这个名称了

二.内部类

这是一个小知识点,我们先看一下概念

  • 将一个类定义在另一个类里面,对立面那个类就称为内部类(内置类,嵌套类)

  • 访问特点

    • 内部类可以直接访问外部类的成员,包括私有成员
    • 而外部类要访问内部类中的成员就必须建立内部类的对象

我们来写一个内部类

class Outer {
    int x = 3;

    void show() {
        System.out.println("x = " + x);
        new Inner().fini();
    }

    /**
     * 内部类
     *
     * @author LGL
     *
     */
    class Inner {
        void fini() {
            System.out.println("内部类"+x);
        }
    }
}

内部类的访问规则上面已经体现了

  • 内部类可以直接访问外部类的成员,包括私有成员
  • 而外部类要访问内部类中的成员就必须建立内部类的对象

那我们可以不可以直接访问内部类中的成员呢?

Outer.Inner inner = new Outer().new Inner();
inner.fini();

这样就可以访问了,不过我们一般都不这样做,因为大多数的情况我们会将内部类私有

那你有没有想过?为什么匿名内部类可以访问外部的成员?我们可以做一个这样的小测试,在内部类里面定义一个x分别是成员变量和局部变量

//公共的   类   类名
public class HelloJJAVA {
    // 公共的 静态 无返回值 main方法 数组
    public static void main(String[] str) {
        Outer.Inner inner = new Outer().new Inner();
        inner.fini();
    }
}

class Outer {
    int x = 3;

    void show() {
        System.out.println("x = " + x);
        new Inner().fini();
    }

    /**
     * 内部类
     *
     * @author LGL
     *
     */
    class Inner {
        int x = 5;

        void fini() {
            int x = 6;
            System.out.println("内部类" + x);
        }
    }
}

我们现在输出的这个x你知道是多少吗?结果显而易见,是6

那我现在想打印这个5怎么打?用this就行了

那我们想打印这个3呢?this是内部类的,那我们需要外面的this,就用Outer.this.x,输出的就是3了

之所以可以直接访问外部类中的成员是因为内部类中持有了一个外部类的引用,该引用写法是:外部类名.this

三.静态内部类

当内部类在成员位置上,就可以被成员修饰符所修饰,比如:

  • private,将内部类在外部类中进行封装
  • static,内部类就具备了static的特性,当内部类被static修饰后,只能直接访问外部类中的static的成员,出现了访问局限,但是静态内部类出现的不是很多,毕竟有访问局限

在外部类中,我们是如何访问静态内部类呢?

//公共的   类   类名
public class HelloJJAVA {
    // 公共的 静态 无返回值 main方法 数组
    public static void main(String[] str) {
        new Outer.Inner().fini();
    }
}

class Outer {
    private static int x = 3;

    /**
     * 内部类
     *
     * @author LGL
     *
     */
    static class Inner {

        void fini() {
            System.out.println("内部类" + x);
        }
    }
}

这样就可以访问了

四.内部类原则

我们来分析下内部类是怎么来的,为什么这样用

  • 当描述事物时,事物的内部还有事物,该事物用内部类描述,因为内部事物在使用外部事物

内部类就是能直接访问外部类中的具体事物,一般都用于程序设计上

五.匿名内部类

一般内部类不会被公有实现,我们内部类可以定义在任意位置,也可以这样做

class Outer {

    int x = 3;

    void fini() {

        class fini {

            void show() {

                System.out.println("内部类");
            }
        }

    }
}

这段程序,内部类会运行吗?答案是不会,因为没有对象,我们就给他new一个对象呗

//公共的   类   类名
public class HelloJJAVA {
    // 公共的 静态 无返回值 main方法 数组
    public static void main(String[] str) {
        new Outer().fini();
    }
}

class Outer {

    int x = 3;

    void fini() {

        class fini {

            void show() {

                System.out.println("内部类");
            }
        }
        new fini().show();
    }
}

这样就可以访问了,内部类定义在局部

  • 1.不可以被成员修饰符修饰
  • 2.可以直接访问外部类中的成员,因为还持有类中的引用,但是不可以访问他所在的局部变量,只能访问被final修饰的局部变量

而我们的匿名内部类,是什么概念?我们顾名思义,匿名内部类,是没有名字的

  • 1.匿名内部类其实就是内部类的简写格式
  • 2.定义匿名内部类的前提,就是内部类必须继承一个类或者实现接口

正常的逻辑代码

//公共的   类   类名
public class HelloJJAVA {
    // 公共的 静态 无返回值 main方法 数组
    public static void main(String[] str) {
        new Outer().function();
    }
}

class Outer {

    int x = 3;

    class Inner extends AdsDemo {
        @Override
        void show() {
            System.out.println("method:" + x);
        }
    }

    public void function() {
        new Inner().show();
    }
}

abstract class AdsDemo {

    abstract void show();
}

而我们现在要使用匿名内部类,就简化了代码,具体怎么做?

//公共的   类   类名
public class HelloJJAVA {
    // 公共的 静态 无返回值 main方法 数组
    public static void main(String[] str) {
        new Outer().function();
    }
}

class Outer {

    int x = 3;

    // class Inner extends AdsDemo {
    // @Override
    // void show() {
    // System.out.println("method:" + x);
    // }
    // }

    public void function() {
        // new Inner().show();
        new AdsDemo() {
            @Override
            void show() {
                System.out.println("x:" + x);
            }
        };

    }
}

abstract class AdsDemo {

    abstract void show();
}

这个就是匿名内部类

  • 匿名内部类的格式:new 父类或者接口(){定义子类的内容}
  • 其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖,你也可以把他理解为带内容的对象
  • 匿名内部类中定义的方法最好不超过三个

OK,本篇幅就到这里,我们的JAVA之旅这个课程不知不觉已经讲了这么多了,从当初的不确定,想尝试一下写,现在已经积累到第九篇了,所以总结出来,我们想做的事情还是得去尝试一下,万一实现了呢?

有志同道合的人,欢迎加群:555974449

JAVA之旅(九)——Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类的更多相关文章

  1. 1.9(java学习笔记)object类及toString()与equals()方法

    object类 java中objec是所有类公共的父类,一个类只要没有明显的继承某一类,那么它就是继承object类. 例如 class Person {......};和class Person e ...

  2. java继承,final,super,Object类,toString,equals,

    Java中的内部类:成员内部类静态内部类方法内部类匿名内部类 内部类的主要作用如下: 1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类 2. 内部类的方法可 ...

  3. Java中的Object类的toString()方法,equals()方法

    Object类是所有类的父类,若没有明确使用extends关键字明确表示该类继承哪个类,那么它就默认继承Object类,也就可以使用Object中的方法: 1.toString 如果输出一个对象的时候 ...

  4. Object类的toString方法和equals方法

    Object类 概述 java.long.Object 类是java语言中的根类,即所有类的父类.它中描述的所有方法子类都可以使用.在对象实例化的时候,最终的父类就是Object 类Object是类层 ...

  5. Object类的toString()和equals()方法

    我们知道,Object类是所有类的父类,因此也被称为根类.祖先.那么,我们就来看一看Object类的最常用的两个方法是如何用的. 1.toString方法: Object类的toString()方法默 ...

  6. Java基础知识强化27:Object类之toString()方法

    1. Object类的toString()方法: public  String  toString():返回该对象的字符串表示 2. 案例演示: (1)Student类: package cn.itc ...

  7. java 中Object类中toString()的使用

    1. 当我们输出一个对象的引用时,实际上就是调用当前对象的toString() 2. Object类中toString()的定义: public String toString() { return ...

  8. Java提高学习之Object类详解(1)

    转自:http://www.importnew.com/10304.html 问:什么是Object类? 答:Object类存储在java.lang包中,是所有java类(Object类除外)的终极父 ...

  9. Java SE学习笔记 --->高级类特性 ---> toString() 方法

    概述: toString() 方法在面向对象当中十分常见,使用频率很高,和equals() 方法一样,也是Object类中定义的方法. jdk中 源码: java.lang.Object类中ToStr ...

随机推荐

  1. 渗透测试环境DVWA搭建

    一.DVWA介绍 DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供 ...

  2. python if判断语句&计算

    python对缩进要求严格,代码块里的缩进必须一样,可以常用 tab键  表示4个空格 if 条件: 代码块 else: if判断语句如下: 1 print("吃饭,喝水,回家") ...

  3. Hibernate异常之Integer转float(自动类型转换错误)

    错误代码: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Float at org.hiber ...

  4. ACM Find them, Catch them

    The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TW ...

  5. PHP 5 Filesystem 函数

    PHP Filesystem 简介 Filesystem 函数允许您访问和操作文件系统. 安装 Filesystem 函数是 PHP 核心的组成部分.无需安装即可使用这些函数. Runtime 配置 ...

  6. JavaScripy execCommand函数

    execCommand函数命令 execCommand方法是执行一个对当前文档,当前选择或者给出范围的命令.处理Html数据时常用如下格式:document.execCommand(sCommand[ ...

  7. Python3 MySQL 数据库连接

    什么是 PyMySQL? PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. PyMySQL 遵循 Python 数据库 AP ...

  8. Android简易实战教程--第四十七话《使用OKhttp回调方式获取网络信息》

    在之前的小案例中写过一篇使用HttpUrlConnection获取网络数据的例子.在OKhttp盛行的时代,当然要学会怎么使用它,本篇就对其基本使用做一个介绍,然后再使用它的接口回调的方式获取相同的数 ...

  9. The Zen Programmer

    专注 何为专注 关于 休息 怎么睡觉 心无杂念 我的体会 自我分析 初学者心态 无我 不要设置职业目标 敏事慎言 正念 做自己的老板 玩物养志 结语 最近在研读Christian Grobmeier ...

  10. SSH 之 Spring的源码(二)——Bean实例化

    首先来看一段代码,看过上一节的朋友肯定对这段代码并不陌生.这一段代码诠释了Spring加载bean的完整过程,包括读取配置文件,扫描包,加载类,实例化bean,注入bean属性依赖. <span ...