• 匿名内部类与equals之学习要扎实


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

         一,匿名内部类

    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()方法。

     
     
     
  • 相关阅读:
    ##JDBC
    《人月神话》阅读笔记(三)
    《人月神话》阅读笔记(二)
    《人月神话》阅读笔记(一)
    记账小软件开发(网页版)(四)
    记账小软件开发(网页版)(三)
    记账小软件开发(网页版)(二)
    记账小软件开发(网页版)(一)
    课程信息管理系统
    Java课程作业之动手动脑(六)
  • 原文地址:https://www.cnblogs.com/java-7/p/5667303.html
Copyright © 2020-2023  润新知