1. 什么时候讲一个变量定义为成员变量
如果这个变量能够描述这个类的属性(现实真实事物的真实属性),则将它定义为成员变量 (类中方法外).
如果不能够描述当前这个类(现在世界事物)的真实属性,优先定义为局部变量.
总结:
以后不要看到变量,就将它定义到类中方法外(根据题意分析);
先局部,局部变量随着方法调用而存在,随着方法调用结束而消失,从内存角度考虑,比较节省内存空间!
2.面试题: 类的初始化过程完成了哪些事
例: Student s = new Student() ;创建学生对象s
初始化过程:
1)在栈内存中开辟空间 Student s,变量s开辟
2)new Student(),需要在堆内存中申请空间
3)在申请空间的同时,需要对成员变量,进行默认初始化(根据数据类型进行默认赋值)
4)当默认初始化完毕,申请空间完毕,产生堆内存空间地址
5)通过构造方法初始化
6)将堆内存空间地址值赋值给栈内存的变量s
7)栈内存的变量s指向堆内存地址
8)当对象整个完毕之后,等待垃圾回收器空闲时候回收不用的对象...
3.继承
3.1 定义:
将多个类的共性内容抽取出来,单独放在一个独立的类中,让这个多个类和这个独立的类产生一种关系----"继承" extends
3.2 格式
class 子类名 extends 父类名{
}
3.3 继承的好处和弊端
继承的好处:
1)提高了代码复用性
2)提高了代码的维护性
3)类与类产生的这种关系"继承",是多态的前提条件!
继承的弊端:
不满足开发的设计原则: "低耦合,高内聚."
因为存在关系,类与类之间就存在耦合性!所以耦合性越低越好,否则,继承关系如果很多,一个父类有问题,其他类都会有问题.
3.4 继承的特点
1)在Java语言中,类与类之间的继承关系,只支持单继承
(Java中不支持类和类之间多继承)
2)虽然类与类之间只支持单继承,但是可以多层继承
3.5 继承的注意事项
1)子类继承父类,只能继承父类非私有的成员,私有的成员可以间接通过公共访问访问! 因为私有成员,只能在本类访问,外界类不能访问!
2)子类继承父类,不能继承父类的构造方法,但是可以通过super访问(super重点关键字)
3.5.1 类的成员
一个类的三个成员:
成员变量
构造方法
成员方法
3.5.2 继承中成员变量的访问问题–就近原则
情况1:子类继承父类,子类的成员变量名称和父类的成员变量名称不一致的情况:
很简单,分别调用即可!
情况2:子类继承父类,子类的成员变量名称和父类的成员变量名称一致的情况:
遵循 "就近原则"
1)现在子类的局部位置中找,如果存在,就使用
2)如果不存在,那么就在子类的成员位置中找,如果存在,就使用
3)如果子类的成员位置中不存在,那么就在父类的成员位置中找,如果存在,就使用;
4)如果父类的成员位置中不存在,那么就报错了,压根不存在这个变量
3.5.3 继承构造方法的访问问题–分层初始化
子类继承父类,不能继承父类的构造方法,但是可以通过super访问(super重点关键字)
如何访问:
子类的所有构造方法都要(默认)访问父类的无参构造方法
因为存在继承关系,子类的构造方法可能会用到父类的数据,所以需要让父类先初始化(构造方法),然后子类在进行初始化 ---->分层初始化
在子类的所有构造方法中默认存在第一句话:super() ; 访问父类的无参构造方法
3.5.4 面试题
子类继承父类,如果父类的无参构造方法没有提供,仅仅提供父类的有参构造方法,子类会出现什么现象,如何解决呢?
子类的所有构造方法都会报错,原因就是没有父类的无参构造方法,子类的所有构造方法默认访问父类的无参构造方法(super();)
解决方案:
1)最简单的方式:给父类提供出无参构造方法
2)现在不想让你父类的无参构造方法可以让子类的所有构造方法直接访问父类的有参方法...
3)很少用到:方式3:
先通过子类的有参构造方法,访问本类的无参构造方法 this()后通过本类的无参构造方法,访问父类的有参构造方法,让其初始化(子类的所有构造方法只要一个能够让父类初始化)
3.6 方法重写
3.6.1 定义
子类继承父类的时候,子类的出现了 和父类一模一样的方法声明,这个子类的功能将父类的功能覆盖掉,使用自己的业务功能完成!
英文单词:override
方法重写(覆盖/复写):override:子类继承父类的时候,子类的出现了和父类一模一样的方法声明
3.6.2 目的
目的:使用子类的功能,将父类的功能覆盖掉
3.7 final关键字
final:最终的,无法更改的,状态修饰
3.7.1 特点
1)可以修饰类,该类不能被继承,它不能在进行扩展了...
举例:后面常用类中重要的类String: 被final修饰
2)可以修饰变量,此时这个变量是一个常量:自定义常量
3)可以修饰成员方法,此时这个方法不能被重写
3.7.2 应用场景
自定义常量使用居多;
final会结合static一块使用(static修饰:可以类名直接调用)
public static final int num = 100 ; //修饰基本数据类型 :编译时期常量 (Jvm不需要加载)
//Integer:int类型的包装类类型(引用类型)
public static final Integer i = new Integer() ;//修饰的引用数据类型 :运行时期常量(JVM需要加载类)
3.7.3 面试题
final修饰的基本数据类型和修饰引用数据类型的区别?
修饰的基本数据类型:基本数据类型的值不能在改变,只能赋值一次,不能在赋值了!
此时这种常量,称为"编译时期常量",Jvm只是检查语法,不需要加载的!
修饰的引用数据类型:引用数据类型的空间地址值不能在改变,但是里面的成员变量(没有加入final),依然可以方法这种常量,Jvm加载引用数据类型,属于"运行时期常量"!
开发中使用最多的:
就是修饰基本数据类型:
传统方式的自定义常量
public static final 基本数据类型 变量名 = 常量值 ;
JDK5以后:枚举类 Enum :定义常量
4.静态
4.1 static关键字的特点:
1)被静态修饰的变量/方法,都是随着类的加载而加载
2)优先于对象存在,不能和this关键字共存,this是需要等待对象被创建完毕,而被静态修饰的,优先进了static内存区了
3)共享,共用(可以被多个对象共用)
比如: 三个人姓名,性别,年龄都不同,但是国籍都是中国,可以静态国籍, 只要有一个人将国籍初始化为中国,其他两个人可以直接访问方法区中static 区的中国.
4)被静态修饰的变量/方法,推荐使用的类名访问!
如果是静态的成员变量:
类名.变量名;
如果是静态的成员方法:
类名.方法名();
4.2 静态的使用过程中 的注意事项:
1)非静态的成员方法,可以访问静态的成员变量或者是非静态的成员变量;
2)静态的成员方法:
只能访问静态的方法或者静态的成员变量...
简单记:静态永远只能访问静态!
5. 代码块
5.1 代码块的含义
使用{}包裹起来的称为"代码块"
5.2 代码块的分类
局部代码块:
{},在局部位置(方法定义中定义)
作用:限定局部变量的生命周期
构造代码块:
{} :在构造方法之前(类的成员位置)
特点:在执行构造方法之前,如果存在构造代码块,优先执行构造代码块,然后才 是构造方法!
作用:将构造方法中初始化的过程,可以在构造代码块中使用(一般开发中很少, 一些笔试题出现,考点:考的就是构造代码块和构造方法之前)
静态代码块----->应用场景:jdbc中就会使用到...
特点:随着类的加载而加载,优先于对象存在
static{
}
5.3 代码块的优先级
静态代码块 > 构造代码块 > 构造方法
静态代码块只执行一次,因为类就加载一次!!!
6.创建文档说明书
自定义的ArrayTool类
工具类:
1)无参构造私有化
2)对外提供公共的静态方法,直接通过类名访问
如何通过刚才写的文档注释给ArrayTool类产生文档说明书
1)将ArrayTool这个类 的内容复制到一个java文件中(不需要包),使用dos控制台来使用
2)进入dos控制台,找到当前文件的内容(.java) ArrayTool.java
3)使用命令:
javadoc -d 目录名称 -author -version ArrayTool.java(java文件)
7. 面试题: this和super的区别
访问区别
访问成员变量:
this.变量名 :访问当前类的成员变量
super.变量名;访问的父类的成员变量
访问构造方法:
this() ; 访问当前类的无参构造方法
super() ; 访问的是父类的无参构造方法
this(xx) ; 访问的是当前类的有参构造方法
super(xx) ; 访问的是父类的有参构造方法
访问成员方法
this.方法名() ; 访问的是当前类的成员方法
super.方法名() ;访问的是父类的成员方法