JAVASE(十)面向对象:特性之多态性、Object类、代码块、关键字:static、final、父子类执行顺序

个人博客网:https://wushaopei.github.io/    (你想要这里多有)

1、面向对象的特性之:多态性

多态性的理解:事物的多种形态

1.1 广义上多态性的体现:
①方法的重写,重载。 ②子类对象的多态性

1.2 狭义上多态性的体现:
①子类对象多态性

1.3 何为子类对象多态性:
父类的引用指向子类的对象

1.4 多态性的应用:
  虚拟方法调用:编译看左边,运行看右边
  编译时:只能看到父类中的方法和属性
  运行时:调用的是子类重写的父类的方法

1.5 多态性的说明:
   思考?什么是多态性?
    父类的引用指向子类的对象
  思考?属性没多态性?
    没
  思考?如果需要调用子类中的特有的属性和方法怎么办?
    向下转型

1.6 多态性使用的前提:
①必须继承关系  ②必须方法的重写

1.7 关于向上转型与向下转型:
向上转型:  多态
向下转型: 将父类的引用再强转成子类
图:

JAVASE(十)面向对象:特性之多态性、Object类、代码块、关键字:static、final、父子类执行顺序JAVASE(十)面向对象:特性之多态性、Object类、代码块、关键字:static、final、父子类执行顺序

为什么要使用向下转型?
父类的引用指向子类的对象,编译看左边,运行看右边。在编译的时候只能看到父类中的属性和方法。当实际上在内存中也加载了子类中特的方法和属性。那我们需要调用子类中特有的方法和属性那么就需要向下转型。

说明:
    ①向下转型可能会出现:    ClassCastException
    ②向下转型可以使用:强制类型转换符
    ③向下转型需要判断:    instanceof

a  instanceof A : a对象是否是A类的一个实例,如果是返回true,否则返回false

1.8 面试题:多态是编译时行为还是运行时行为?
     运行时行为

2、Object

1.1 Object类的说明

  1. Object是所类的基类(父类
  2. 一个类如果没有显示的继承其它类,那么默认继承Object类
  3. Object类中11个方法(其中有3个是重载的方法)
  4. Object只一个空参的构造器

2.2 equals方法

一 Object中的equals方法

public boolean equals(Object obj) {
return (this == obj);
}

JAVASE(十)面向对象:特性之多态性、Object类、代码块、关键字:static、final、父子类执行顺序

二 像系统中的String,Date等类,都重写了equals方法。
 在自定义类中,如果没有重写equals方法那么比较的是对象的地址值。
         往往我们调用equals方法时都是需要比较的是内容。所以自定义类中需要重写equals方法

2.3 toString方法

一 Object中的toString方法

 public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

JAVASE(十)面向对象:特性之多态性、Object类、代码块、关键字:static、final、父子类执行顺序

二 像系统中的String,Date等类,都重写了toString方法。
     
    在自定义类中,如果没有重写toString方法那么输出的是对象的地址值。
         往往我们调用toString方法时都是需要输出对象中属性的内容。所以自定义类中需要重写toString方法

2.4 面试题?==和equals的区别?

== :基本数据类型 : 比较的是具体的数值
         引用数据类型 : 比较的是对象的地址值。(两个地址是否指向同一块内存)
equals : 如果没重写equals方法那么调用的是Object中的equals方法比较的是地址值。一般我们都会重写equals方法进行内容的比较。

3、关键字static

3.1可以用来修饰的结构
属性,方法,内部类,代码块

3.2 static修饰属性
1.同一个类的多个对象各自拥有一份实例变量,多个对象共同拥有一份类变量。
2.当一个对象对类变量进行修改后,那么其它的对象看到的是修改后的类变量。
3.类变量是随着类的加载而加载,实例变量是随着对象的创建而加载。
4.类的加载只加载一次
5.类变量的调用 : 类名.类变量  对象名.类变量

3.3 static修饰方法
1.静态方法是随着类的加载而加载
2.静态方法的调用 : 类名.静态方法名    对象名.静态方法名
3.静态方法中不能调用非静态方法和实例变量,非静态方法中可以调用静态方法和实例变量。
4.类的加载优先于对象的创建
5.静态方法中不能使用this和super

3.4 内存解析

JAVASE(十)面向对象:特性之多态性、Object类、代码块、关键字:static、final、父子类执行顺序JAVASE(十)面向对象:特性之多态性、Object类、代码块、关键字:static、final、父子类执行顺序

3.5 什么时候使用static修饰属性和方法
static修饰属性:
    ①当多个对象共同拥一份属性的时候   ②声明为常量时。Math.PI
static修饰方法:
  ①时需要调用类变量时,使用静态方法。 ②作为工具类中的方法时

4、 类的结构:代码块

4.1.代码块的作用:可以对类的属性、类的声明进行初始化操作

4.2.分类:静态代码块  vs 非静态代码块
格式:
        静态代码块:static{}
        非静态代码块: {}
注意:代码块只能被static修饰

4.3.说明
静态代码块:

  1. 是随着类的加载而加载,类的加载只加载一次(静态代码块只执行一次)
  2. 静态代码块的执行优先于非静态代码块
  3. 如果多个静态代码块,那么执行的顺序是从上到下依次执行
  4. 只能调用静态方法和类变量

非静态代码块:

  1. 随着对象的创建而加载,每创建一次对象就执行一次
  2. 非静态代码块的加载优先于构造器的调用。
  3. 如果多个非静态代码块,那么执行的顺序是从上到下依次执行
  4. 可以调用静态方法和类变量

5、属性的赋值顺序

属性赋值的方式 :1.默认值    2.显示赋值    3.构造器赋值   4.对象名.方法名,对象名.属性名    5.代码块

顺序 :1 -> 2/5(根据位置谁在上面谁先赋值) -> 3 -> 4

6、关键字final

Final修饰类 :不能被继承
Final修饰属性 :只能赋值一次,往往作为常量使用
Final修饰方法 :不能被重写
Final修饰的属性的赋值方式 :
1.显示赋值   2.代码块  3.构造器(每个构造器都要进行赋值

7、父类和子类的执行顺序

在父类、子类都有静态代码块、静态方法、构造方法情况下:具体的执行顺序如下:

  • 执行父类的静态代码块
  • 执行子类的静态代码块
  • 执行父类的构造代码块
  • 执行父类的构造方法
  • 执行子类的构造代码块
  • 执行子类的构造方法
上一篇:JDK1.8源码阅读笔记(1)Object类


下一篇:整体二分(SP3946 K-th Number ZOJ 2112 Dynamic Rankings)