Java语言基础(内部类,匿名内部类,object类)

1.内部类

在这里插入图片描述

成员内部类

class Outer
{	
      class Inner	
         {	
             //成员内部类	}
}

特点:

  • 1、成员内部类可以直接访问外部类的成员,包括私有的,也可以通过 外部类名.this.成员名调用外部成员
  • 2成员内部类和外部类不存在继承关系
  • 3访问成员内部类的格式:Outer.Inner oi = new Outer().new Inner();

局部内部类

class Outer{
	public void method()	{	
	        final int a = 10;		
	           class Inner	{			
	    System.out.println(a);
	    	//局部内部类		
	          }	
	       }
	}

特点:

  • 可以直接访问外部类的成员

  • 在局部位置可以创建局部内部类对象,通过对象调用成员
    注意:
    局部内部类访问局部变量必须用final修饰 JDK1.8之后默认加上

因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失,还要使用那个变量,为了让数据还能继续被使用,就用fianl修饰,这样,在堆内存里面存储的其实是一个常量值。

匿名内部类

前提: 存在一个类或者接口;这里的类可以是具体类也可以是抽象类。
本质:是一个继承了该类或者实现了该接口的子类匿名对象

public abstract class Person//抽象类 或  interface Person 接口
{ 
      public abstract void work();
        } 
new Person(){
	public void work()	
	{		
	System.out.println("work");	}
}.work();

静态内部类

package laolao;
class didi{
    public static void main(String[] args) {
        new di();
        new  di.dada().eat();
    }
}
 class di {
  static  int age=10;
      static    class dada{
          public void eat(){
              int a = di.age;
              System.out.println(a);
          }
    }
}

特点:

  • 静态内部类访问的外部类数据必须用静态修饰。
  • 成员方法可以是静态的也可以是非静态的
  • 格式: 外部类名.内部类名 对象名 = new 外部类名.内部类名();

2.object类

概述: 类层次结构的根类
所有类都直接或者间接的继承自该类

(1)Object类的hashCode()方法

  • 返回该对象的哈希码值。
    默认情况下,该方法会根据对象的地址来计算。
  • 不同对象的,hashCode()一般来说不会相同。
    但是,同一个对象的hashCode()值肯定相同。
  • 不是对象的实际地址值,可以理解为逻辑地址值。

(2)Object类的getClass()方法

  • 返回此 Object 的运行时类。
  • 可以通过Class类中的一个方法,获取对象的真实类的全名称。
    public String getName()

(3)Object类的toString()方法

  • 返回该对象的字符串表示
 源代码:
 public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

(4)Object类的equals()方法

  • 指示其他某个对象是否与此对象“相等”。
  • 默认情况下比较的是对象的引用是否相同
源代码:
public boolean equals(Object obj) {
         return (this == obj);
    }

注意:== 和 equals() 有什么区别?

==是一个比较运算符,他可以比较基本数据类,也可以比较引用数据类型,比较基本数据类型,比较的是两个值是否相同,比较引用数据类型,比较的是地址值是否相同。
equals() 是Object类中的方法,只能比较引用数据类型,比较的是两个对象的地址值是否相同

(5)Object类的clone() 方法

  • clone()的权限修饰符是受保护的
  • 对象的克隆:浅克隆和深克隆
  • 使用clone()方法采用的是浅克隆的方式

浅克隆的细节:

  1. 如果一个对象需要调用clone的方法克隆,那么该对象所属的类必须要实现Cloneable接口。
  2. Cloneable接口只不过是一个标识接口而已,没有任何方法。
  3. 对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把另外一个对象也克隆一份。
  4. 对象的浅克隆也不会调用到构造方法的。
public class MyTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        Dog dog = new Dog("旺财", 3);
        Dog dog2 = (Dog) dog.clone();
        dog2.name="小白";
        System.out.println(dog2.name);
        System.out.println(dog2.age);
    }
}
class Dog extends Object implements Cloneable{
    String name;
    int age;
    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章