继承:extends
把共性的东西抽取出来行为父类,实际需求的子类在继承父类的基础上写自己特有代码即可。
作用:
- 提高代码复用性
- 继承的出现让类与类之间产生了联系,提供了多态的前提
- 不要仅为了获取其他类中某个功能而去继承
子类不是父类的子集,而是对父类的“扩展”
java只支持单继承,不允许多重继承
方法的重载:一个类可以有多个同名方法
方法的重写:子类可以重新写父类的方法,覆盖父类的方法
@Override
public void employed() {
System.out.println("这是重写父类的方法");
}
public static void main(String[] args) {
Kinds kinds = new Kinds(1, 12);
kinds.setSex(1);
kinds.setSalary(10000);
kinds.setYearsOld(23);
kinds.manOrWomen();
kinds.employed(); //调用的是子类的重写了父类之后的方法。如果子类没有重写,则调用父类的方法。
kinds.printAge();
}
| 修饰符 | 类内部 | 同一个包 | 不同包子类 | 任何地方 |
|---|---|---|---|---|
| private | yes | no | no | no |
| default | yes | yes | no | no |
| protected | yes | yes | yes | no |
| public | yes | yes | yes | yes |
- 如果子类和父类在同一个包下,那么对于父类的成员修饰符只有不是私有的private,那就都可以使用
- 如果子类和父类不在同一个包下,子类只能使用父类中protected和public修饰的成员
关键字super
父类有参构造
public MainKind(int sex, int salary) {
this.sex = sex;
this.salary = salary;
}
子类用super调用父类的构造器
public Kinds(int sex, int salary) {
super(sex, salary);
}
在父类只有有参构造可以使用的时候,子类必须显示的构造一个构造来调用父类的有参构造,并且调用父类的构造方法要写在第一行
对象实例化过程
简单类对象的实例化过程
Person p = new Person();
子类对象的实例化过程
Student stu = new Student();
多态性
在java中有两种体现:
- 1.方法的重载(overload)和重写(overwrite)
- 2.对象的多态性——可以直接应用在抽象类和接口上
Java引用变量有两个类型:编译时类型和运行时类型,编译时类型由声明变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定
Student stu = new Student();
//编译期类型 运行期类型
如果编译时类型和运行时类型不一致,就会出现多态
对象的多态
在Java中,子类的对象可以替代父类的对象使用
Person p = new Person();
Person e = new Student(); //Person类型的变量e,指向Student类型的对象,向上转型
e.属性/方法 //只能访问父类(Person类)的属性和方法,因为属性是编译时确定的,编译时e为Person类型。
虚拟方法调用
Person e = new Student();
e.getInfo(); //调用Student类的getInfo()方法,因为方法调用是在运行时确定的,所以调用的是Student类的getInfo()方法 ——动态绑定
成员方法的多态性,也就是动态绑定,必须得存在于方法的重写之上。
instanceof操作符
x instanceof A :检验x是否为类A的对象,返回值为boolean类型。
Object类
Object类是所有Java类的根父类(基类)。
场景:如果我想给test方法设置一个形参参数,这个参数我不确定到底会传来一个什么类,但可以确定的是实参一定是一个类,那么这个形参就可以设置成Object类
public class Test {
public void printInfo(Object obj) {
System.out.println("Object!!!!");
}
public static void main(String[] args) {
MainKind mainKind = new MainKind();
Kinds kinds = new Kinds();
MainKind mainKind1 = new Kinds();
Test test = new Test();
test.printInfo(kinds);
test.printInfo(mainKind);
System.out.println(kinds.equals(test)); //false
System.out.println(kinds.equals(mainKind)); //false
System.out.println(kinds.equals(mainKind1)); //false
// Object o = new MainKind();
Object o = new Kinds();
System.out.println(o.hashCode());
System.out.println(kinds.toString());
}
}