DAY5
如何封装一个工具类:
将一些常用的方法以及相同功能封装在一个类中,然后将这些方法用static关键字修饰,那么以后再调用这些方法时,就不用再创建对象了,可以直接通过类名调用
static关键字:
- 表示静态的意思;
- 被static修饰的成员(成员变量和成员方法)是随着类的加载而加载的,优先于对象而存在
- 被static修饰的成员被所有的对象所共享
- 被static修饰的成员可以使用类名直接调用,还可以使用对象名调用
注意事项: - 被static修饰的成员轻易不会释放,等到程序结束的时候才会释放,所以能不用静态的地方就不用
- 被static修饰的成员方法只能访问被static修饰的成员变量,今天的只能访问静态的
- 静态方法中不能出现this关键字
非静态成员变量和静态成员变量: - 所属的不同
- 非静态成员变量:属于对象,随着对象的创建而存在
- 静态成员变量:属于类,随着类的加载而存在
- 内存中的不同
- 非静态成员变量:放在堆内存中
- 静态成员变量:放在方法区中的静态区
- 生命周期
- 非静态成员变量:随着对象的创建而存在,随着对象的消失而消失
- 静态成员变量:随着类的加载而加载,随着类的消失而消失
- 调用不同
- 非静态成员变量:只能通过对象名调用
- 静态成员比变量:可以通过类名和对象名调用
main方法格式解析: - public:是访问权限修饰符,表示访问权限最大化,方便JVM的调用;
- static:是静态修饰符,被static修饰的成员可以直接通过类名调用,方便JVM调用
- void:表名JVM不需要返回值
- main:不是关键字,JVM识别main方法,作为入口
- String[]:表示JVM给main一个字符串类型的数组;
- args:仅仅是一个变量名,args是可以改变的,只要符合变量的命名规则即可
- String[] args:早期用于键盘录入信息的,JDK1.5之后用Scanner代替了
代码块的分类和特点介绍: - 代码块
- 静态代码块:静态代码块是随着类的加载而加载的,只会执行一次,优先于对象而存在,可以做一些整个应用程序的初始化
- 构造代码块:每次创建对象的时候都会执行,优先于构造方法执行,可以做一些所有构造方法都必须初始化的操作
- 普通代码块:和普通的代码执行并没有区别,但是放在普通代码块里面的内容会在使用完成之后立马释放
- 构造方法、静态代码块、构造代码块的执行顺序:
静态代码块—>构造代码块—>构造方法
注: 如果一个类的构造方法没有调用完毕,那么对象就没有创建成功
继承:
定义:当多个类出现相同的属性和行为时,为了提高代码复用性,将这多个属性和行为封装到一个类中,然后剩余的这些类继承这个封装的类
可以通过extends关键字进行继承,格式为:
说明: - 被继承的这个类叫做父类,也可以叫做超累或者基类
- 继承的这些类叫做子类或者派生类
- 子类还可以定义自己特有的方法和属性
继承的好处: - 提高了代码的复用性
- 提高了代码的维护性
- 让类与类之间产生了关系,是多态的前提(后续讲到)
继承的特点: - Java中的继承只支持单继承
- Java中的继承支持多层继承
继承中的注意事项: - 父类的私有成员(成员变量和成员方法),子类是无法继承的
- 子类不能为了部分功能去继承
- 类B需要一个show方法的功能,这个时候就没有必要去继承A,因为类A中的show2和show3方法是多余的,如果仅仅为了一个show方法去继承,就会显得很臃肿
- 子类不能继承父类的构造方法,但是在子类内部可以调用父类的构造方法(在super关键字的时候讲解)
类的组成: - 成员变量
- 构造方法
- 成员方法
子类和父类之间成员变量、构造方法、成员方法之间的关系: - 子类和父类之间成员变量的关系
- 通过子类对象的方法访问一个变量的查找顺序
首先在子类方法的局部范围查找;再在子类的成员范围查找;再在父类的成员范围查找;如果最后没有找到就会报错
- 通过子类对象的方法访问一个变量的查找顺序
- super关键字代表的是父类引用;this关键字代表的是子类引用
- 调用子类和父类的成员变量:
- 调用子类构造方法和父类构造方法:
- 调用子类成员方法和父类成员方法:
- 子类和父类构造函数的关系:
- 当子类进行初始化的时候,需要先初始化父类,因为子类可能会使用到父类
中的成员 - 子类会默认调用父类的无参构造方法
- 在所有子类的构造函数的可执行代码的第一行:super();
注: - 我们知道所有的子类构造函数可执行代码的第一行都是访问父类的无参构造函数,那么如果父类中没有无参构造函数怎么办了?
可以通过super手动指定要访问的有参构造函数,但是也必须放在可执行代码的第一行;
我们也可以通过this关键字访问本类中的构造函数,但是通过this关键字访问本来的构造函数代码也必须放在可执行代码的第一行
另外:子类和父类的构造函数关系规则:子累初始化之前一定要先初始化父类 - 子类和父类成员方法的关系
- 通过子类访问一个方法
首先在子类范围找;再在父类范围找;找不到就报错;
方法重写与方法重载: - 方法重写(覆盖):当不满意父类中的方法实现时,但是又想使用父类的功能时,可以在子类中定义一个相同名字的方法,但是方法体由子类字节实现
- 方法重载:方法名相同,但是参数个数或者参数类型不同,和返回值类型无关
注:当使用子类对象访问一个方法时,如果子类和父类中都有相同的方法,最终使用还是子类自己的方法
方法重写注意事项: - 子类重写父类的成员方法,但是访问权限不能比父类的方法低
- 父类的私有方法,子类不能进行重写
- 子类重写父类的静态方法时,子类的这个重写方法必须也是静态的(这个静态方法的重写,没有重写的特性,算不上方法的重写)
final修饰符:
定义:是最终的意思 - 修饰类:被修饰的类就不能被继承
- 修饰成员变量:变量就变成常量,常量的值不能被改变,在初始化的时候必须赋值
- 修饰成员方法:被修饰的方法不能被重写
注: - 被final修饰的变量就变成了常量;
- 被final修饰的成员变量就变成成员常量
- 成员常量的初始化时机:
成员常量需要在对象创建成功之前赋值 - 局部常量必须在声明的时候就赋值
final修饰局部变量的问题: - 如果final修饰的局部变量是引用类型时,这个引用不能被重新赋值的,但是这个引用执行的对象里面的成员变量是可以被重新赋值的
- 如果final修饰的局部变量是一个基本数据类型变量,这个被final修饰的变量不能被重新赋值
- final是一个修饰符,它修饰的东西以前放在什么位置,现在还是放在什么位置,并不会改变他们在内存中的位置