Java学习笔记(三)

81 阅读3分钟

继承: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();
}
修饰符类内部同一个包不同包子类任何地方
privateyesnonono
defaultyesyesnono
protectedyesyesyesno
publicyesyesyesyes
  • 如果子类和父类在同一个包下,那么对于父类的成员修饰符只有不是私有的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());
    }
}