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()方法采用的是浅克隆的方式
浅克隆的细节:
- 如果一个对象需要调用clone的方法克隆,那么该对象所属的类必须要实现Cloneable接口。
- Cloneable接口只不过是一个标识接口而已,没有任何方法。
- 对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把另外一个对象也克隆一份。
- 对象的浅克隆也不会调用到构造方法的。
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();
}
}