内部类
内部类的分类:实例内部类、静态内部类局部内部类匿名内部类
1.1实例内部类
java
//外部类
public class OutClass1 {
public int date;
//实例内部类
class Innerclass{
public int ger;
public void test(){
System.out.println("test方法被执行了");
}
}
public void func(){
System.out.println("func方法被执行了");
}
}
问:(1)如何实例化实例内部类对象
java
OutClass1 outClass1=new OutClass1();
OutClass1.Innerclass innerclass=outClass1.new Innerclass();
需要外部类对象的引用
(2)实例内部类是可以访问外部类的成员属性的,但当实例内部类和外部类的成员属性同名时,实例内部类会优先访问自己的。那么,如何访问外部类的成员属性呢

通过外部类名称.this.同名成员在实例内部类方法里访问外部类的成员属性
注:
1.外部类中的任何成员都可以在实例内部类方法中直接访问
2.实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束
3.实例内部类对象必须在先有外部类对象的前提下才能创建
4.实例内部类的非静态方法中包含了一个指向外部类对象的引用
5.外部类中,不能直接访问实例内部类中的成员,如果要访问必须要先创建内部类的对象
1.2静态内部类
实例化静态内部类
java
OutClass1.Innerclass innerclass=new OutClass1.Innerclass();
**注:**1.静态内部类只能访问外部类当中的静态成员
1.3局部内部类
局部内部类一般在方法中,只能在方法当中使用,并且不能被public等修饰
java
public class OuterClass2 {
public int a;
public void method(){
class InnerClass{
public int b=200;
public void innerclassMethod(){
System.out.println("内部类方法");
}
}
InnerClass innerClass =new InnerClass();
innerClass.innerclassMethod();
}
}
1.4匿名内部类
匿名内部类通常用于创建只需要使用一次的类
java
public class Test1 {
public void test(){
System.out.println("test方法执行了");
}
public static void main(String[] args) {
//相当于继承了Test1类
new Test1(){
@Override
public void test() {
System.out.println("重写的test方法执行了");
}
}.test();
}
}
java
interface HA{
void test();
}
public class Test2 {
public static void main(String[] args) {
//相当于有一个类实现了HA接口
new HA(){
public int a;
@Override
public void test() {
System.out.println("重写了接口方法");
}
}.test();
}
}
匿名内部类可以定义和正常类一样的变量但是和正常类一样不能直接包含执行语句
Object类
概述:Object类是Java默认提供的一个类,除了Object类之外其他所有的类都有继承关系
Object的方法:
1)toString方法
如果使用object提供的方法打印引用类型的就是"地址",重写Object提供的方法的话,就可以打印引用类型当中的内容,数据类型打印出来的都是它本身的值.
2)equals方法
在Java当中,如果基本数据类型变量,使用"=="比较变量的值是否相同.
如果引用类型变量,使用"=="比较就是他们的地址是否相同
那么,如果你想要比较对象当中的内容的值是否相同,就需要重写Object类当中的equals()方法.
问题来了,为什么要重写Object当中的这个方法呢?
da:因为Object类当中的equal方法就是比较的他们的地址所以要重写地址
java
public boolean equals(Object obj) {
return (this == obj);
}
3)hasCode方法
说白了就是确定两个对象的属性在内存当中的存储位置是否在同一个位置当中
java
package demo5;
import java.util.Objects;
class Student{
public String name;
public int a ;
public Student(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", a=" + a +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return a == student.a && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, a);
}
}
class Person{}
public class ObjectClass {
}
java
package demo5;
public class Test6 {
public static void main(String[] args) {
Student student =new Student("张三");
Student student2 =new Student("张三");
Student student3 =new Student("张三");
System.out.println(student.a);
System.out.println(student);
System.out.println(student2.equals(student3));
System.out.println(student2.hashCode());
System.out.println(student3.hashCode());
System.out.println(student.hashCode());
}
}