一 . 引入关键字"static"
1. static基本概念
statuc : 共享,共用-------可以被多个对象共用.
2. 特点
1>被静态修饰的变量或方法,都是随着类的加载而加载
2>优先于对象存在,不能和 this 关键字共存 ( this 是需要等待对象被创建完毕,而被静态修饰的,优先进入 static 内存区 )
3>共享,共用(可以被多个对象共用)
4>被静态修饰的变量或方法,推荐使用类名访问 < 类名 . 变量名 / 类名 . 方法名() >
3. 注意事项
1>非静态的成员方法:可以访问静态的成员变量或非静态的成员变量;
2>静态的成员方法:只能访问静态的成员方法或静态的成员变量
二 . 局部变量和成员变量使用时机
这个变量能够描述这个类的属性(现实真实事物的真实属性)时将变量定义为成员变量.
1>静态变量和成员变量的区别
(1)存储区域不同
静态变量:存储在方法区中的共享内存区域中静态区域中(static区域).
成员变量:堆内存中的.
(2)称谓不同
静态变量:跟类有关系(类加载,静态的东西就进static内存区)----->被称为"类成员".
成员变量:对象的特有属性------>称为"实例(对象)变量".
(3)生命周期不同
静态变量:随着类的加载而加载,随着类的加载完毕,进入static区域中,然后就消失了.
成员变量:随着对象的创建而存在,随着对象的创建完毕,等待垃圾回收器空闲时候回收而消失.
(4)调用方式不同
静态变量:既可以使用对象名访问,也可以使用类名访问,推荐使用类名访问(类成员).
成员变量:只能使用对象名来访问.
三 .自定义工具类(了解)
1> 工具类需求
(1). 无参构造私有化
(2).对外提供公共静态方法,直接通过类名访问
2> 如何通过文档注释生成文档说明书
使用命令:javadoc -d 目录名称 -author -version ArrayTool.java(java文件)
四 .一个类的初始化过程
Student s = new Student();
(1)在栈内存中开辟空间 Student s,为变量s开辟空间
(2)new Student(),需要在堆内存中申请空间
(3)在申请空间的同时,需要对成员变量,进行默认初始化<根据数据类型进行默认赋值>
(4)当默认初始化完毕,申请空间完毕,产生堆内存空间地址
(5)通过构造方法初始化
(6)将堆内存空间地址值赋值给栈内存的变量s
(7)栈内存的变量s指向堆内存地址
(8)当对象整个完毕之后,等待垃圾回收器空闲时候回收不用的对象
五.代码块的含义
1> 代码块概念
代码块:使用{}包起来的称为代码块.
2> 代码块分类
(1) 局部代码块: {}定义在局部位置(方法定义中定义);
作用:限定局部变量的生命周期
(2) 构造代码块: {} 定义在构造方法之前(类的成员位置);
特点:在执行构造方法之前,如果存在构造代码块,优先执行构造代码块,然后才是构造方法.
作用:将构造方法中初始化的过程,可以在构造代码块中使用(一般开发中很少,一些笔试题出现,考点:考的就是构造代码块在构造方法之前).
(3) 静态代码块:static{}
特点:随着类的加载而加载,优先于对象存在; 静态代码块只执行一次,因为类就加载一次.(考点)
3> 代码块优先级
静态代码块 > 构造代码块 > 构造方法
class Student{
static{
System.out.println("student的静态代码块1");
}
public Student(){
System.out.println("student的无参构造方法");
}
public Student(String name){
System.out.println("student的有参构造方法");
}
{
System.out.println("student的构造代码块1");
}
static{
System.out.println("student的静态代码块2");
}
{
System.out.println("student的构造代码块2");
}
}
public class StudentTest {
static{
System.out.println("静态代码块0");
}
public static void main(String[] args) {
System.out.println("mian方法被执行");
Student s = new Student() ;
System.out.println("-------------------");
Student s2 = new Student("张三") ;
}
}
6.面向对象特征---------继承
6.1继承的概念
将多个类的共性内容抽取出来,放在一个独立类中,让这个独立的类和这多个类产生一种关系叫做 "继承".
6.2语法格式
class 子类名 extends 父类名{}
6.3继承的好处
(1)提高了代码复用性
(2)提高了代码的维护性
(3)类与类产生的这种"继承"关系,是多态的前提条件
6.4继承的弊端
因为存在"继承"关系,类与类之间就存在耦合性,开发中做到低耦合,高内聚.
6.5继承的特点
(1)在Java语言中,类与类之间的继承关系只支持单继承
(2)虽然类与类之间只支持单继承,但是可以多层继承
6.6继承的注意事项
最基本注意事项
<1>子类继承父类,只能继承父类非私有的成员,私有的成员可以间接通过公共访问方法访问,因为私有成员,只能在本类访问,外界类不能访问.
<2>子类继承父类,不能继承父类的构造方法,但是可以通过super访问
6.7继承中成员变量访问问题
(1)情况1:子类继承父类,子类的成员变量名称和父类的成员变量名称不一致的情况:分别调用即可
(2)情况2:子类继承父类,子类的成员变量名称和父类的成员变量名称一致的情况: 遵循就近原则
<1>先在子类的局部位置中找,如果存在,就使用
<2>如果不存在,那么就在子类的成员位置中找,如果存在,就使用
<3>如果子类的成员位置中不存在,那么就在父类的成员位置中找,如果存在,就使用;
<4>如果父类的成员位置中不存在,那么就报错了,压根不存在这个变量
6.8继承中构造方法的访问问题
子类继承父类,不能继承父类的构造方法,但是可以通过super访问.
访问方式:子类的所有构造方法都要(默认)访问父类的无参构造方法.
因为存在继承关系,子类的构造方法可能会用到父类的数据,所以需要让父类先初始化(构造方法),
然后子类在进行初始化;在子类所有构造方法中第一句话:super() :访问父类的无参构造方法
6.9面试题:开发中什么时候使用继承?
如果B类是A类的一种,或者A类是B类一种,这个时候就可以使用继承,继承是一种"is a"的关系.
7.this与super的区别
super:代表父类对象的地址值引用
this:代表当前本类的对象的地址值引用
(1)访问成员变量区别
this.变量名 :访问当前类的成员变量
super.变量名:访问父类的成员变量
(2)访问构造方法区别
this(): 访问当前类的无参构造方法
super(): 访问的是父类的无参构造方法
this(xx): 访问的是当前类的有参构造方法
super(xx) :访问的是父类的有参构造方法
(3)访问成员方法区别
this.方法名(): 访问的是当前类的成员方法
super.方法名():访问的是父类的成员方法
8.方法重写(覆盖)
8.1方法重写概念
子类继承父类的时候,子类中出现了和父类一模一样的方法声明,子类的功能将父类的功能覆盖掉,使用自己的业务功能完成.
8.2方法覆盖原则
(1)方法名称,参数列表,返回值类型必须与父类相同.
(2)访问修饰符与父类相同或比父类更宽泛.
8.3方法重载与方法重写区别
(1)方法重载:overload:多个方法名称相同,形式参数列表不同,与返回值无关,目的:为了提高功能扩展性.
(2)方法重写:override:子类继承父类的时候,子类出现了 和父类一模一样的方法声明;目的:使用子类的功能将父类的功能覆盖掉.
9.final关键字
9.1概念
当父类中的功能不能让子类覆盖时,Java提供了一个关键字final:最终的,无法修改的.
9.2特点
(1)final修饰类,该类不能被继承,它不能在进行扩展了
(2)final修饰变量,此时这个变量是一个常量:自定义常量
(3)final修饰成员方法,此时这个方法不能被重写
9.3final修饰基本数据类型和修饰引用数据类型的区别
(1)修饰基本数据类型
修饰的基本数据类型:基本数据类型的值不能在改变,只能赋值一次,不能在赋值了;此时这种常量称
为"编译时期常量",Jvm只是检查语法,不需要加载.
(2)修饰引用数据类型
修饰的引用数据类型:引用数据类型的空间地址值不能在改变,但是里面的成员变量(没有加入final),
依然可以访问这种常量,Jvm加载引用数据类型,属于"运行时期常量"!