一,成员内部类
二、静态内部类
三,局部内部类
四,匿名内部类
一,成员内部类
1,如果出现同名属性,会优先访问内部类属性
2,成员内部类不能定义静态属性
class InnerClass {
// 不能写定义静态成员
private int prop;
public int getProp() {
return prop;
}
public void setProp(int prop) {
this.prop = prop;
}
}
}
package com.mobiletrain;
public class MemberInnerClassPractice {
public static void main(String[] args) {
// 外部类的使用
MemberOuterClass mic = new MemberOuterClass();
// 内部类的使用
MemberOuterClass.InnerClass inner = mic.new InnerClass();
System.out.println(inner.getProp());
}
}
二,静态内部类
package com.mobiletrain;
public class StaticOuterClass {
static class StaticInnerClass {
private int value = 10;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
}
package com.mobiletrain;
public class StaticInnerClassPractice {
public static void main(String[] args) {
StaticOuterClass.StaticInnerClass sic = new StaticOuterClass.StaticInnerClass();
System.out.println(sic.getValue());
}
}
三,匿名内部类
package com.mobiletrain;
public interface Swimable {
public void swim();
}
package com.mobiletrain;
public class UnnameInnerClassPractice {
public static void main(String[] args) {
Swimable swimable = new Swimable() {
@Override
public void swim() {
System.out.println("游啊游...");
}
};
swimable.swim();
}
常用类Object
getClass方法
能够确切的确定对象的类型
equals方法&hashcode方法
equals精确对比两个对象 hashCode用哈希码粗略对比两个对象 哈希碰撞: 哈希冲突 两个对象确实不一样,但生成的hash值是一样的 编写hashCode时,配置编写equals就能有效地防止哈希碰
使用IntelliJ默认方式生成
package com.mobiletrain.obj;
public class Student {
private String name;
private int score;
// int a = 10;
// int b = 10;
// if (a == b) {}
// Student stu1 = new Student("张三", 100);
// Student stu2 = new Student("张三", 100);
// 以下代码,只会判断两个对象所在的内存空间是否一样
// 即: 是否指向了同一个内存空间
// if (stu1 == stu2){}
// if (stu1.equals(stu2)) {
// 如果 stu1 相等于 stu2 的话
// 那么就...
// }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Student)) return false;
Student student = (Student) o;
if (getScore() != student.getScore()) return false;
return getName() != null ? getName().equals(student.getName()) : student.getName() == null;
}
@Override
public int hashCode() {
int result = getName() != null ? getName().hashCode() : 0;
result = 31 * result + getScore();
return result;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
package com.mobiletrain.obj;
public class MiddleSchoolStudent extends Student {
// 年级
private int grade;
// 班级
private String className;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof MiddleSchoolStudent)) return false;
if (!super.equals(o)) return false;
MiddleSchoolStudent that = (MiddleSchoolStudent) o;
if (getGrade() != that.getGrade()) return false;
return getClassName() != null ? getClassName().equals(that.getClassName()) : that.getClassName() == null;
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + getGrade();
result = 31 * result + (getClassName() != null ? getClassName().hashCode() : 0);
return result;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}
使用JDK7方式生成
package com.mobiletrain.obj;
import java.util.Objects;
public class Student {
private String name;
private int score;
// int a = 10;
// int b = 10;
// if (a == b) {}
// Student stu1 = new Student("张三", 100);
// Student stu2 = new Student("张三", 100);
// 以下代码,只会判断两个对象所在的内存空间是否一样
// 即: 是否指向了同一个内存空间
// if (stu1 == stu2){}
// if (stu1.equals(stu2)) {
// 如果 stu1 相等于 stu2 的话
// 那么就...
// }
@Override
public boolean equals(Object o) {
return Objects.equals(this, o);
}
@Override
public int hashCode() {
return Objects.hash(getName(), getScore());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
package com.mobiletrain.obj;
import java.util.Objects;
public class MiddleSchoolStudent extends Student {
// 年级
private int grade;
// 班级
private String className;
@Override
public boolean equals(Object o) {
return Objects.equals(this, o);
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), getGrade(), getClassName());
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}
toString方法
将一个对象,转换成字符串(introduce yourself)
package com.mobiletrain.obj;
import java.util.Objects;
public class Student {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", score=" + score +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}