JAVA学习日志6
代码块
代码块是写在大括号里的一段代码。(类=成员变量+成员方法+代码块,一些执行语句是不能直接写在类里的,只能放在方法里或代码块里)
-
局部代码块
1.定义位置:方法中
2.作用:限制变量的生命周期,即代码块中局部变量随着代码块的执行而开始,随着代码快的结束而终止节省内存空间 -
构造代码块
1.定义位置:类中方法外
2.作用:主要给成员变量来赋值
3.说明
[1].构造比构造方法先执行
[2].构造代码块是由jvm来执行的
[3].每实例化对象一次 都会执行一次构造代码块
[4].所有的构造方法都需要给成员变量进行赋值时候 这时候就可以使用构造代码块来进行赋 -
静态代码块
1.定义位置:类中方法外 static{ 内容}
2.作用: 1.用于给静态变量来进行赋值 2. 静态代码块只加载一次,在加载驱动、工具实例化、都可以使用静态代码块
3.说明
[1].静态代码块 是优先于这个类 最先进行加载
[2].静态代码 块只执行一次
final关键字
final可以修饰类 方法 变量,拿final修饰的元素其中一但确定就不能改变
- final 修饰的类不能被继承
- final 修饰的方法不能重写
- final修饰的后的变量实际就是一个常量,只能赋值一次。final修饰的引用类型数据,其地址值是无法改变的,但地址指向的具体内容是可改变的。如:使用final来修饰实例化的对象可以修改成员变量的值,但无法把新的地址给到这个实例化对象
内部类
定义在类内部的类,定义在方法里的类叫做 局部内部类,定义在 类中方法外的类 叫做成员内部类。成员内部类又可以分为 : 普通内部类 私有内部类 静态内部类
- 普通内部类
- 格式:
class 类名{
属性
方法
} - 说明:
[1] 内部类可以获取到外部类的资源,包括私有成员
[2] 外部类在获取内部类的属性和方法时需要先实例化
[3] 其他外部类实例化内部类的语法 外部类.内部类 对象名 = new 外部类().new 内部类( )
- 私有内部类
- 格式:
private class 类名{
} - 说明
[1] 内部类可以获取到外部类的资源,包括私有成员
[2] 外部类在获取内部类的属性和方法时需要先实例化
[3] 其他外部类想获取内部类的属性或方法时是无法获取的,可以在外部类里定义一个方法实例化内部类对象,这个对象调用内部类的方法或返回内部类的属性。其他外部类调用外部类的该方法来间接获取内部类的属性或方法。
- 静态内部类
- 格式:static class 类名{
} - 说明:
[1] 内部类中定义的静态变量,外部类可以通过 类名.属性名 的方式获取
[2] 内部类中的非静态变量,外部类在访问时需要先实例化对象
[3] 其他外部类实例化内部类的语法 外部类.内部类 对象名 = new 外部类.内部类()
- 局部内部类
- 格式(需要定义在方法里): class 类名{
} - 说明: 如果需要调用内部类中的方法,需要在内部类的方法中实例化这个对象 ,对象在调用方法,外部类访问这个方法时就是访问到者内部类了。
java 中四大访问修饰权限
public > protected > 默认修饰符 > private
多态
- 多态的前提条件:
[1].必须是有继承关系
[2].有方法的重写
[3].父类的对象引用指向子类对象的引用 ==> 多态的语法 - 多态的语法:
父类 对象名 = new 子类的对象()
个人理解:子类发生了重写、添加了新的成员变量或方法,所以子类往往是对父类的扩充。但通过多态的语法可以看出,多态实际是把一个扩充了的内容强行缩小到一个固定统一的内容里,这样势必会发生一些替换,由子类里的新内容(发生了重写的内容)替换了父类里的内容,而子类比父类多出的内容暂时被砍掉了。所以通过 对象名.重写方法() 或取到的方法是重写后的方法。而变量没有重写的概念,即使子父类里有重名的变量 但通过对象名.属性名访问到的还是父类的属性。父类可以有多个子类,子类里重写后的方法功能可以是各不相同的,但经过多态后这些实际上类型不同的类变成了类型相同的类,通过操纵一个类型的父类达到操纵不同类型的子类的目的
-
在多态中成员变量的访问规则
通过 对象名.属性 访问的时候在父类中查找,找不到则向上查找,直到object类(不会向下到子类中查找) -
在多态中成员方法的访问规则
1.没有重写的时候 == >调用的是父类的方法
2.有重写的时候 ==> 调用的子类重写的方法 -
多态中的向上转型
父类对象 对象名 = new 子类对象(); -
多态中向下转换
子类对象 对象名 = (子类类名)已经进行了向上转型后的对象
注:父类对象B是有子类a进行向上转型得到的,所有对象B在向下转型时只能还原为a类型的,可以通过 instanceof 判断是否可以还原为目标类型
pet是由Dog类向上转型过的对象,现判断是否可以还原为Dog类型
个人理解:向下转型实际是把向上转型砍掉的内容进行恢复,由于恢复了父类成员之外的成员,所以类型就不能是父类类型,还原为缩减之前的类型 -
多态好处
- 以父类作为参数 可以简化 代码
- 有利于代码的后期的维护与扩展
- 多态后 只需关注父类,不必拘泥于若干个功能不同子类