匿名内部类是胡哥给我上的第一节课,他一直在不断强调着“逻辑与思维”的重要性, 遇到问题不能用“不知道和没学过”去逃避它,所有的不知道和没教过都源自于没见过,一定要学会去看源代码,不要人云亦云......胡哥讲了那么多,我就记得这么几句话了,今天他催我交博客,我满脑子都是这么几句话.....不过他的这些话还是很有作用的,至少我现在这个小菜鸟不再那么惧怕那些想不出来的编程思想了,因为可以百度啊!不然你想破脑袋也想不出来呀!下面就来回顾一下胡哥三天前给我们讲过的知识点吧!

一,匿名内部类

abstract class Person {
    public abstract void eat();
}
 
public class Demo {
    public static void main(String[] args) {
        Person p = new Person() {
            public void eat() {
                System.out.println("eat something");
            }
        };
        p.eat();
    }
}
由上面的程序可以看出匿名内部类就是把某些只用了一次的类(为其编写一个单独的类太麻烦)的时候就可以用匿名内部类。
 
二,equals与“==”的区别----“关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”
 
public class df {
 public static void main(String[] args){
    int n=3;
         int m=3;
         System.out.println(n==m);
         String str = new String("hello");
         String str1 = new String("hello");
         String str2 = new String("hello");
         System.out.println(str1==str2); //它们分别指向的是不同的对象,也就是说它们实际存储的内存地址不同
         System.out.println(str1.equals(str2));
         str1 = str;
         str2 = str; //都让str1和str2指向了str指向的对象,那么得到的结果毫无疑问是true。
         System.out.println(str1==str2);
     }
}
输出的结果是:true  false  true  true
 
解析:

在Java中游8种基本数据类型:

浮点型:float(4 byte), double(8 byte)

整型:byte(1 byte), short(2 byte), int(4 byte) , long(8 byte)

字符型: char(2 byte)

布尔型: boolean(true  false)

对于这8种基本数据类型的变量,变量直接存储的是“值”,因此在用关系操作符==来进行比较时,比较的就是 “值” 本身。要注意浮点型和整型都是有符号类型的,而char是无符号类型的(char类型取值范围为0~2^16-1).

也就是说比如:

int n=3;

int m=3;

变量n和变量m都是直接存储的”3″这个数值,所以用==比较的时候结果是true

而对于非基本数据类型的变量,在一些书籍中称作为 引用类型的变量。比如上面的str1就是引用类型的变量,引用类型的变量存储的并不是 “值”本身,而是于其关联的对象在内存中的地址。比如下面这行代码:String str1;

这句话声明了一个引用类型的变量,此时它并没有和任何对象关联。

而 通过new String(“hello”)来产生一个对象(也称作为类String的一个实例),并将这个对象和str1进行绑定:str1=new String(“hello”);

那么str1指向了一个对象,此时变量str1中存储的是它指向的对象在内存中的存储地址,并不是“值”本身,也就是说并不是直接存储的字符串”hello”。
因此在用==对str1和str2进行第一次比较时,得到的结果是false。因此它们分别指向的是不同的对象,也就是说它们实际存储的内存地址不同。而在第二次比较时,都让str1和str2指向了str指向的对象,那么得到的结果毫无疑问是true。
 那么为什么  “System.out.println(str1.equals(str2));”的运行结果是“true”呢?——看源代码
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) { //instanceof它的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。可以用来判断继承中的子类的实例是否为父类的实现。
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}

很显然,在Object类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。

而且String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。

其他的一些类诸如Double,Date,Integer等,都对equals方法进行了重写用来比较指向的对象所存储的内容是否相等。

总结:

1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

如果作用于引用类型的变量,则比较的是所指向的对象的地址

2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量

如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

3)tostring()方法是每个类都有的一个方法,因为所有的类都是object的子类,object里有tostring()方法,所以每个类都有这个方法,对了还有hashcode()方法。

 
 
 

匿名内部类与equals之学习要扎实的更多相关文章

  1. Java基础:hashCode与equals个人学习记录

    摘要: 本文主要记录本人对hashCode和对equals两个知识点的学习过程. 从学生时期初学java,就知道hashCode和equals这两个方法,工作中equals方法使用也是特别频繁,要说e ...

  2. Java equals方法学习

    通过某个特征值来判断两个对象是否"等价",当这两个对象等价时,判断结果为true,否则结果为false. Object类(Java的"对象世界"的根)中实现的e ...

  3. java匿名内部类使用场景列举

    示例一: package com;      interface Operation {       double operateTwoIntNum(int a, int b);   }      p ...

  4. Java学习_面向对象编程

    抽象类 一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰.因为抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译 ...

  5. Java8学习(3)- Lambda 表达式

    猪脚:以下内容参考<Java 8 in Action> 本次学习内容: Lambda 基本模式 环绕执行模式 函数式接口,类型推断 方法引用 Lambda 复合 上一篇Java8学习(2) ...

  6. JAVA学习,是一条漫长的道路

    我在Java 1.0正式问世前就开始学习Java,这么多年过去了,到现在我的Java学习历程还没有停过.我阅读原文书,研究原始码,撰写程序,自认为走得扎实,不奢望一步登天.像我这样老式的学习方式,显然 ...

  7. “全栈2019”Java第一百零九章:匿名内部类实现唯一抽象类或接口

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. “全栈2019”Java第一百零七章:匿名内部类与构造方法注意事项

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. 慕课网金职位 Java工程师2020 百度网盘下载

    百度网盘链接:https://pan.baidu.com/s/1xshLRO3ru0LAsQQ0pE67Qg 提取码:bh9f 如果失效加我微信:610060008[视频不加密,资料代码齐全,超清一手 ...

随机推荐

  1. Web API初探

    前几天有位同事说web api中的接口参数为对象的时候不好接收,具体什么方式我忘记了,虽然本人以前并没有接触过这方面的知识,但是据说和MVC差不多的,今天小小的研究一下,我想应该是可以的. 直接新建一 ...

  2. asp.net mvc 简易通用自定义Pager实现分页

    asp.net mvc 自定义Pager实现分页 Intro 一个WEB应用程序中经常会用到数据分页,本文将实现一个简单通用的分页组件,包含一个 PagerModel (用来保存页码信息),一个 Ht ...

  3. 函数模块:CTVB_COMPARE_TABLES--两个表中删除/变更/粘贴分解

    这个函数模块比较两个内表,将被删除.增加和修改的内表行分别分组输出. 输入参数:TABLE_OLD:旧表TABLE_NEW:新表KEY_LENGTH:键长度,指定内表中的前若干个字节(在 Unicod ...

  4. 用SourceTree合并工程冲突,工程打不开时的操作

    1.右键工程 --> 显示包内容 2.打开project.pbxproj文件 3.command + F :搜索“<<<<<” 或“>>>> ...

  5. UItableView与UICollectionView

    UITableView 1. UITableViewStyleGrouped 分区表格样式创建表格 .separatorStyle = UITableViewCellSeparatorStyleSin ...

  6. SQL SERVER 2012 从Enterprise Evaluation Edtion 升级到 Standard Edtion SP1

    案例背景:公司从意大利购买了一套中控系统,前期我也没有参与其中(包括安装.实施都是第三方),直到最近项目负责人告诉我:前期谈判以为是数据库的License费用包含在合同中,现在经过确认SQL Serv ...

  7. Hadoop2.5.0 搭建实录

    目录: 第一步:准备相关材料 第二步:虚拟机环境搭建 第三步:用户信息 第四步 安装.配置Java环境 第五步 Zookeeper安装配置 第六步 Hadoop安装.配置 第七步:HBase安装部署 ...

  8. 从零自学Hadoop(16):Hive数据导入导出,集群数据迁移上

    阅读目录 序 导入文件到Hive 将其他表的查询结果导入表 动态分区插入 将SQL语句的值插入到表中 模拟数据文件下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并 ...

  9. C# Lambda表达式

    C# Lambda表达式 Lambda表达式 "Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量.它可以包含表达式 ...

  10. openstack-swift云存储部署(二)

    接上篇,swift-proxy和swift-store的安装 先说一下服务器分配 swift-proxy和keystone部署在192.168.25.11 swift-store是两台  分别是192 ...