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到底创建了多少个对象?
答:当实例化一个对象时,该对象的所有父类也都被实例化了。
问题:这些被实例化的对象实例化的顺序是什么?
答:实例化顺序是从父类到子类。
问题:继承中构造函数的调用顺序是?
答:从子类到父类调用
问题:继承中构造函数的执行顺序是?
答:从父类到子类
评论