DESKTOP-9EO7JOG_2020_12_8

一、static关键字

static关键字可以实现通过类名加“.”直接调用类的成员。

1.static修饰属性

使用static修饰的属性为静态属性或类变量。没有使用static修饰的属性称为实例变量。使用static修饰的属性属于类,不属于具体的某个对象。类属性在类名首次出现时初始化,即使没有创建对象,类属性也是存在的。

例:

2.static修饰方法

用static修饰的方法称为静态方法或类方法,不使用static修饰的方法称为实例方法。类方法不依赖于任何对象,用类名加“.”调用即可。类方法在类名首次出现时初始化,即使没有创建对象,类方法也是存在的。

例:

  • 静态方法中不能直接访问实例变量和实例方法。
  • 在实例方法中可以直接调用类中定义的静态变量和静态方法。

3.静态成员与实例成员的区别

(1) 静态成员和实例成员分配内存的时机

l 静态成员是在类名首次出现时,最先分配内存的,静态属性分配在方法区中。然后调用静态块,多个静态块按照定义的顺序从上到下调用。

l 实例成员是在实例化时分配内存的,如果没有实例化对象那么实例成员就没有分配内存。

(2) 静态成员和实例成员分配内存的次数

静态成员只分配一次内存,因此静态成员只有一份

实例成员分配内存的次数由实例化的次数决定,每实例化一次分配一次内存。

(3) 静态成员和实例成员的调用规则

静态成员由类名调用,也可以由对象名调用,但是不推荐使用对象名调用。

实例成员由对象名调用,不能使用类名调用。

这种调用规则是因为

  • 静态属于类成员,因此静态成员也称为类成员(类变量,类方法)
  • 实例属性对象成员

(4) 静态块的作用

实例属性可以通过构造函数初始化。

静态属性可以通过静态块初始化,因为类名首次出现时先为静态变量分配内存,然后就调用静态块。

4.java中的常量

使用static final修饰的变量是类常量

使用final修饰变量是实例常量

final是java的关键字,翻译为最终。final可以修饰类,属性,方法。修饰类时不能被继承,修饰方法时不能被子类重写,修饰属性时属性不能改值。

二、继承

继承是面向对象的三大特征之一(封装、继承、多态)

继承可以解决编程中代码冗余的问题,是软件可重用性的一种表现,新类可以在不断增加自身代码的情况下,通过从现有类中继承其属性和方法,来实现充实自身内容。新类称为子类,现有类称为父类。

java中只支持单继承,即一个类只能有一个直接父类。

子类继承父类后,子类就继承了父类中的成员,导致子类无需从从创建,简化了子类的设计。

1.super与this关键字

super表示父类

this表示子类

2.super的用法1:在子类构造函数中调用父类构造函数

例如:

​ 注意:super调用父类构造函数时,必须写在子类构造函数的第一行

​ 通常父类定义的属性有父类负责初始化,子类定义的属性由子类负责初始化。子类通过super(参数列表)的方式将子类构造函数中的参数传递给父类,让父类初始化。

3.super的用法2:在子类的方法中调用父类的方法

例如

4.继承中属性的初始化问题

建议谁定义的属性,由谁初始化

观察下面的代码,分析初始化的方法

调试程序,观察初始化的过程

当前类的构造函数得到的参数中,留下自己定义的函数需要的参数,其余的参数通过super传递给父类初始化。

5.继承中对象实例化的顺序问题

观察下面的代码

问题:main方法中创建对象c时,jvm到底创建了多少个对象?

答:当实例化一个对象时,该对象的所有父类也都被实例化了。

问题:这些被实例化的对象实例化的顺序是什么?

答:实例化顺序是从父类到子类。

问题:继承中构造函数的调用顺序是?

答:从子类到父类调用

问题:继承中构造函数的执行顺序是?

答:从父类到子类

评论