一、 Object类
1、含义
所有类的基类/超类,一个类没有明确继承的类,默认继承Object
2、equals
比较两个对象内存地址是否相同
判断两个对象是否相同,Object不同的子类判断两个的对象是否相同有不同的判断规则,子类重写equals即可
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
3、getClass
获取该类的字节码文件对象
A a = new A(); //获取A类的字节码文件对象 Class<? extends A> c = a.getClass(); //获取A类中所有属性 Field[] declaredFields = c.getDeclaredFields(); for (Field field : declaredFields) { System.out.println(field); } //获取A类中所有的方法 Method[] declaredMethods = c.getDeclaredMethods(); for (Method method : declaredMethods) { System.out.println(method); }
4、hashCode
获取对象的hash值
hash值-系统利用对象的内存地址+散列算法获取的一个值
注意:hash值不等于内存地址
5、toString
获取对象的字符串表示(将对象转换为字符串)
返回对象的字符串表示,Object不同的子类有不同的属性,重写toString,返回属性
public String toString(){ return getClass().getName() + "@" + Integer.toHexString(hashCode()); } Object obj1 = new Object(); //java.lang.Object@15db9742 System.out.println(obj1.toString());
二、final 作用:
1.修饰变量 - 常量
存储在常量池中,直到项目结束才会被销毁
2.修饰类,类不能被继承
//A类不能有子类
public final class A {
}
3.修饰方法,方法不能被重写
public class A {
//该方法不能被子类重写
public final void method(){}
}
三、抽象类及抽象方法
1、抽象方法:
没有代码块并使用abstract修饰的方法,交给非抽象的子类去重写
public abstract class Person { private String name; private char sex; private int age; public Person() { } ...... //抽象方法 public abstract void eat(); public void sleep(){ System.out.println(this.name + "睡觉觉"); } } public abstract class Chinese extends Person{ private String id; public Chinese() { } ...... //抽象方法 public abstract void hobby(); } public class GuangDong extends Chinese{ public GuangDong() { } ...... @Override public void hobby() { System.out.println(super.getName() + "喜欢做生意"); } @Override public void eat() { System.out.println(super.getName() + "吃肠粉、潮汕牛肉火锅"); } }
2、应用场景:
当一个方法必须在父类中出现,但是这个方法又不好实现,就把该方法变成抽象方法,
交给非抽象的子类去实现
3、深入抽象类及抽象方法
①.抽象类中只能有抽象方法?
抽象类里可以有构造方法、静态方法、成员方法
②.抽象类中不可以没有抽象方法?
可以没有抽象方法,但是这样毫无意义
③.如果父类是抽象类,则子类必须实现父类的抽象方法?
子类如果是抽象类,可以不实现父类对的抽象方法
④.抽象类不能有构造方法?
可以有构造方法的
⑤.可以使用new关键字来创建抽象类对象?
不可以的,创建出的是匿名内部类的对象
//1.创建匿名类,继承Chinese,重写eat、hobby方法
//2.创建匿名类的对象
//3.赋值给父类的引用
Chinese c = new Chinese() {
@Override
public void eat() {
}
@Override
public void hobby() {
}
};
c.eat();
四、接口
1.接口是特殊的抽象类
public interface I1 {
}
2.接口中只能有静态常量和抽象方法
public interface I1 {
//默认添加public static final
int i = 100;
//默认添加abstract
public void method01();
public void method02();
}
3.JDK1.8的新特性允许接口中使用默认方法和静态方法
public interface I1 {
//默认方法
default void defaultMethod(){
System.out.println("接口中的默认方法");
}
//静态方法
public static void staticMethod(){
System.out.println("接口中的静态方法");
}
}
4、管理系统的规范接口
public interface IManagerSystem {
public static final int NAME = 1;
public static final int SEX = 2;
public static final int AGE = 3;
public static final int CLASS_ID = 4;
public static final int ID = 5;
public boolean add(Student stu);
public boolean delete(String classId,String id);
public boolean update(String classId,String id,int type,Object value);
public int query(Student stu);
public int query(String classId,String id);
public void expansion();
}
5、深入接口
① 类 - 接口的关系:
类 - 类:单继承
类 - 接口:多实现
接口 - 接口:多继承
② 面试题:
一个类可以实现多个接口?
可以
一个接口可以实现多个接口?
不可以,接口与接口之间是多继承关系
接口里面的方法不一定都是抽象的?
JDK1.8开始接口中允许默认方法和静态方法
接口解决了类的单继承问题?
是的
一个类是否可以继承一个类并同时实现多个接口?
可以
接口可以new对象?
不可以,创建的是匿名内部类的对象
//1.创建匿名类,实现I5接口中的i5method01方法
//2.创建匿名类的对象
//3.赋值给接口的引用
I5 i5 = new I5() {
@Override
public void i5Method01() {
}
};