-
什么是多态?
-
1.多态的理解
-
(1)同一个动作作用于不同的对象产生不同的行为(多种形态):比如说方法重写
-
(2)多态就是一个对象的多种形态
-
2.多态的体现方式
-
(1)基于继承的实现,不同的子类重写了父类方法以后体现不同的形式
-
(2)接口的实现
-
3.以下都是多态的条件
-
(1)继承:子类去继承父类 Dog extends Pet
-
(2)重写:子类重写父类的方法
-
(3)重载:同一个方法名,根据形参不同,实现的功能也不同
-
(4)子类对象的多态性:父类的引用指向子类(常用)相当于这个对象有两种形态,一个父类形态,一个子类形态
-
3.程序分为两种状态,一种是编译状态,一种是运行时状态
-
对于多态来说,编译时看左边,会把P1变量看做是pet类类型,也就是父类
-
运行时,看右边,真正执行的对象,也就是子类对象,执行的就是子类重写后的方法
-
4.向上转型和向下转型
-
向上转型:将子类对象交给父类的引用,可以自动类型转换
-
向下转型;把父类转成子类,需要强制 类型转换
-
5.多态的类型
-
(1)编译时多态:方法的重载(在编译期间,调用相同的方法名根据不同的参数列表来确定调用的是哪个方法),静态的
-
(2)运行时多态:方法的重写
-
(只有在运行期间才能确定使用的对象类型,才能确定变量的引用指向哪个实例)
-
final修饰的类不能被继承。提高安全性,提高程序的可读性。
比如:String类、System类、StringBuffer类
final修饰的方法不能被子类重写。
比如:Object类中的getClass()。
final修饰的属性为常量。一旦初始化后,不可再被赋值。习惯上,常量用大写字符表示。
final标记的成员变量必须在声明的同时或在每个构造方法中或代码块中显式赋值,然后才能使用。
比如:final double PI=3.14;
若变量用static final修饰:全局常量。比如:Math 类的PI
*final关键字代表最终的意思
- 可以修饰什么?
- 1.类
- 2.方法
- 3.成员变量
- 4.局部变量
- 修饰类,代表这个类是一个最终类
- 这个类不能被继承,但是可以继承别的类
- 修饰方法,就是一个最终方法
- 这个方法不能被重写
- 修饰成员变量,成员变量的值不可改变
- 1.成员变量不会再有默认值
- 2.如果加了final关键字,需要对成员变量直接赋值
- //在生成get,set方法的时候就不会再生成set方法了,因为这个成员变量的值不可以改变了
- 修饰局部变量,局部变量就变成了一个常量
- 一旦赋值不可改变
- 一般就用它修饰局部变量,成员变量
*一个类中可以使用不包含在任何方法体中的静态代码块。
-
当类被载入时,静态代码块被执行,且只被执行一次。
-
静态块经常用来进行类属性的初始化。
-
代码块(初始化块):同时对多个属性进行初始化
-
1.代码块的作用就是初始化类、对象
-
2.代码块如果进行修饰的只能通过static进行修饰
-
直接就是大括号,没有名字,就把它当成一个方法就可以了,
-
那怎么调用呢?
-
静态代码块属于类,类加载的时候就可以加载静态代码块
-
那么非静态代码块怎么办呢?
-
随着对象的创建而执行,属于对象
-
3.静态代码块
-
可以写输出语句
-
随着类的加载而执行,属于类的,类加载几次静态代码块就加载几次
-
静态代码块的执行要优先非静态代码块的执行
-
静态代码块里面只能调用静态变量和静态方法
-
后期的jdbc,对数据库连接池进行初始化,会用到静态代码块
-
4.非静态代码块,对创建的对象进行初始化
-
可以写输出语句
-
随着对象的创建而执行,属于对象
-
我创建了几个对象,非静态代码块就加载几次
-
作用:可以在创建对象的同时,给对象的属性进行初始化,说白了就是赋值
*我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,
-
某些特定的数据在内存空间里只有一份。
-
static关键字
-
1.static:静态的
-
2.static可以修饰属性、方法、代码块
-
3.static修饰属性:静态变量,本来是成员变量是动态的,是实例变量,现在变成静态变量了
-
3.1按照是否使用static进行修饰,可以分为:实例变量(就创建了实例以后才可以使用的变量)和静态变量
-
实例变量:我们创建了多个对象,每个对象都独立有一套类中非静态变量。当修改了其中一个对象的非静态变量的属性值时,不会导致其他对象同样的属性值的修改,(没有static修饰的成员变量)
-
静态变量:我们创建了多个对象,多个对象共享同一个静态变量,当其中一个对象对静态变量进行了更改,会导致其他对象同样的属性值的更改
-
3.2static修饰属性
-
(1)这个属性就不在属于对象了,而属于类本身,只要通过这个类创建的对象,都可以共享该静态变量,
-
实例变量属于对象的
-
也是有默认值的
-
(2)静态变量是随着类的加载而加载,实例变量随着对象的创建而加载
-
(3)静态变量的加载时机早于对象的创建
-
(4)由于类只会加载一次,静态变量在内存中也只有一份
-
4.static修饰方法
-
(1)这个方法就不在属于对象了,而属于类本身。
-
(2)静态方法是随着类的加载而加载,可以通过"类名.方法名"的方式调用
-
(3)静态方法中只能调用静态变量和静态方法
-
非静态方法可以调用静态方法和静态变量,也可以调用非静态变量和非静态方法
-
在静态方法里面可以使用this和super关键字吗?
-
不可以,因为这个两个关键字是有了对象以后才存在,静态方法早于对象的创建
-
this代表当前对象或者当前正在创建的对象
-
super作用在父类,在子类创建对象的时候,我们才可以使用super关键字,/*子类调用父类的方法和属性,也是已经创建了对象了
-
什么时候会让其成为静态的呢
-
5.开发中,如果确定一个属性使用static进行修饰呢?
-
如果一个属性需要被多个对象共享,使用static进行修饰
-
6.开发中,如果确定一个方法使用static进行修饰呢?
-
工具类会使用static进行修饰方法。比如jdbc工具类,collection连接对象,
-
操作静态变量的方法,一般使用static进行修饰
方法区里面有一块静态域,专门存放我们的静态变量或者静态方法的