继承的实现:
使用extends关键字,子类是父类的扩展。instanceof 类型判断。
注意:
1、父类也成为超类,派生类,基类。
2、Java中只有单继承,没有C++中的多继承,多继承会引起混乱,使得继承链过于复杂,系统难于维护。
3、Java中类没有多继承,接口有多继承
4、子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法),但不一定可以直接访问(例如父类的属性和方法)。
5、如果定义一个类的时候没有使用extends,那么该类的父类为:java.lang.Object
public class TestExtends{
public static void main(String[] args){
Student stu = new Student("", 172, "");
}
}
class Person{
String name;
int height;
public void rest(){
System.out.println("休息");
}
}
class Student extends Person{//继承实现代码重用
String major;
public Student(String name, int height, String major){
this.name = name;
this.height = height;
this.major = major;
}
public void study(){
System.out.println("学习满两小时");
}
}
方法的重写(override):
方法的重写要符合三个要点:
1.方法名、形参列表相同
2.返回值类型和声明异常类型,子类小于等于父类。
3.访问权限,子类大于等于父类。
“==”和equals方法:
“==”代表双方是否相同,如果是基本类型则表示值相等,如果是引用类型则表示地址相等,即是同一个对象。
Object类中定义有:public boolean equals(Object obj)方法,提供定义“对象内容相等”的逻辑。
equals方法默认就是比较两个对象的hashcode,是同一个对象的引用时返回true,负责返回false,但是,可以根据自己的要求重写equals方法。
super关键字:
super是直接父类对象的引用,可以用过super来访问父类中被子类覆盖的方法或属性。
使用super调用普通方法,语句没有位置限制,可以在子类中随便调用。
若是构造方法的第一行代码没有显示调用super(...)或者this(...),Java会默认调用super(),调用父类的无参数构造方法,此时super()可以省略。
继承树追溯:
属性/方法的查找顺序:
1.查找当前类中没有属性h
2.依次上溯每个父类,查看每个父类中是否有h,直到Object.
3.如果没找到,则出现编译错误
4.如果找到h变量,则终止该过程
构造方法的调用顺序:
构造方法的第一句总是super(...)来调用父类对应的构造方法,所以,流程就是:先向上追溯到Object,然后再依次向下执行类的初始化和构造方法,直到当前子类为止。
编程中封装的好处:(通过访问控制符来实现)
提高代码安全性、提高代码的复用性、高内聚低耦合
修饰符 | 同一个类 | 同一个包 | 子类 | 所有类 |
private | * | |||
default | * | * | ||
protected | * | * | * | |
public | * | * | * | * |
类的属性处理:
1.一般使用private访问权限
2.提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的,以提供对属性的赋值和读取操作。布尔变量的get方法是is开头。
3.一些只用于本类的辅助性方法可以用private修饰,希望其他类调用的方法用public修饰。
多态(Polymorphism)
指的是同一个方法调用,由于对象不同可能会有不同的行为。现实生活中,同一个方法,具体实现会完全不同。
要点:
1. 多态是方法的多态,不是属性的多态(多态与属性无关)
2. 多态的存在有三个必要条件:继承、方法重写、父类引用指向子类对象。
public class testPoly {
public static void main(String[] args) {
Dog d = new Dog();
animalCry(d);
Cat c = new Cat();
animalCry(c);
Animal a = new Animal();
animalCry(a);
}
static void animalCry(Animal a){
a.shout();
}
}
class Animal{
public void shout(){
System.out.println("叫一声!");
}
}
class Dog extends Animal{
@Override
public void shout() {
// TODO Auto-generated method stub
System.out.println("汪汪汪");
}
}
class Cat extends Animal{
@Override
public void shout() {
System.out.println("喵喵喵");
}
}