java学习day17---(Object类和内部类)

一、Object类

Object类是所有类的超类,任何对象都能继承它的一些方法。

hashCode()方法

原型:public native int hashCode();     有native修饰的表示是使用C++来实现的

含义:利用对象的地址以及属性等,返回一个整数值

 

           对象的内存地址不同,返回的哈希值不同
           同一应用程序的同一个对象,多次调用hashCode(),返回哈希值相同

toString()方法

原型:

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

含义:输出对象类的全限定类型+@+对象的哈希值转换成16进制的字符串
            直接输出对象名等于调用了这个方法
            一般建议在子类中重写

主要是把类的属性都显示出来:

public String toString(){

return "说明"+私有属性名;

}           

equals(Object object)方法
含义:比较两个对象的内存地址是否一样 调用:a.equals(b); 比较a和b地址是否相等
           建议重写
            一般对象比较的属性相同,人们就任务这是同一个东西,重写时就是比较属性的:

           public boolean equals(Object obj){
           if(this==obj){return true;}      //判断地址相等
           if(this==null||obj==null){return false;}     //判断是否是空
           if(obj instanceof Book){            //判断是否是Book类型的   关键字instanceof
           Book work=(Book)obj;             //想下转型,否则obj调用不了子类独有的方法
           if((work.getNumber()==this.number&&work.name==this.name))     //属性的判断
            return true;
       }
           return false;
      }

以上3个方法都可以用Alt+F10(Insert)快速生成,新手还是多练练

String类的一些问题

String类的equals()已经重写,调用equals就是比较两个字符串存储的字符是否一样
String s1="123"; String s2="123";s1、s2是同一个内存地址,在常量池

String 创建对象以及使用“+”字符的连接,有些不同,有些面试的时候可能会问到,需要注意(后续再去研究)

String一样可以new对象
变量相加和字面值拼接开辟的空间不一样

finalze()方法
垃圾回收器(gc)调用的方法,不需要程序员调用,调用了对象就会被销毁
垃圾回收器(gc):管理堆内存的守护线程,当对象不在被引用,那么gc就会启动finalze()方法销毁对象,释放内存

垃圾回收器与jvm虚拟机,如果main方法很快就执行完了,那么gc来不及唤醒,jvm就关闭了gc就不会工作
因为jvm不会管gc执不执行. gc线程会和main主线程抢占cpu的时间片,几率是一样的

涉及到程序的运行以及线程,还需学习

二、内部类

使用不多,匿名内部类需要掌握
含义:就是类嵌套一个类,在类中再写一个类,分别叫外部类和内部类
1.内部类可以调用外部类所有属性和方法,省略了外部类.this
2.外部类不能调用内部类的属性和方法,只能创建对象调用
3.在别的类调用内部类,需要借助外部类,语法:
外部类.内部类 对象名=new 外部类().new内部类();

静态内部类
只能调用外部类静态的属性和方法!
外部类调用静态内部类的属性和方法,内部类名+属性和方法,调用非静态就要创建对象调用
别的类调用静态内部类,通过外部类.内部类.+属性和方法调用 调用非静态创建对象调用


局部内部类
含义:在类的一个方法中,写一个类
不能有权限修饰符
局部内部类只能在方法体中使用


匿名内部类(需要掌握)
匿名内部类是特殊的局部内部类,局部内部类只有类体,没有类名和修饰符

抽象实例化需要用到:
在main方法体中,不想创建抽象类的子类时,例子:
public sbstract class A{
public abstract void fun(){}
}
抽象类A在创建对象时会报错,可以在main方法中直接写个匿名类,重写fun方法
A a1=new A(){
public abstract void fun(){
System.out.println();
}
};
函数式接口:只有个抽象方法的接口

           

 

posted @ 2021-07-22 19:44  墨衣i  阅读(52)  评论(0)    收藏  举报