1.static关键字
两个作用
第一,为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。
第二,实现某个方法或属性与类而不是对象关联在一起
具体而言,在Java语言中,static主要有4中使用情况:成员变量、成员方法、代码块和内部类
static关键字用法总结
1. 修饰成员变量: 将其变为类的成员,从而实现所有对象对于该成员的共享静态变量属于类,在内存中只有一个复制,只要静态变量所在的类被加载,这个静态变量就会被分配空间,因此就可以被使用了。对静态变量的引用有两种方式,分别是“类.静态变量”和”对象.静态变量”
2. 修饰成员方法: 将其变为类方法,可以直接使用”类名.方法名”的方式调用.常用于工具类
Java中提供了static方法和非static方法。static方法是类的方法,不需要创建对象就可以被调用,而非static方法是对象的方法,只有对象被创建出来后才可以被使用
static方法中不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和成员方法,因为当static方法被调用时,这个类的对象可能还没被创建,即使已经被创建了,也无法确定调用哪个对象的方法。同理,static方法也不能访问非static类型的变量。
3. 静态代码块:将多个类成员放在一起初始化,使得程序更加规范,其中理解对象的初始化过程非常关键
static代码块在类中是独立于成员变量和成员函数的代码块的。注意:这些static代码块只会被执行一次
构造块:类中直接用{}定义,每一次创建对象时执行
执行顺序优先级:静态块>main()>构造块>构造方法
静态代码块的应用场景:
通常用于一次性初始化的动作;例如:框架中加载配置文件;
4.静态导包用法: 将类的方法直接导入到当前类中,从而直接使用”方法名”即可调用类方法,更加方便
参考:
https://m.jb51.net/article/158507.htm
//**
特点总结:
1:静态的内容,会随着类的加载而加载;(静态的内容优先于对象的存在)
2:静态的内容,只会初始化一次,且存在与方法区的静态区之中;(静态代码块只会在初始化的时候执行一次,后面就不再执行了);
为什么java工具类方法为静态类
静态方法不需要new,速度快,节省时间,但是占内存。公用方法会大量使用,所以用静态方法,
基础:每个线程都有自己的线程栈,栈与线程同时创建,每一个虚拟机线程都有自己的程序计数器PC,在任何时刻,一个虚拟机线程只会执行一个方法的代码,这个方法称为该线程的当前方法,如果这个方法不是native的,程序计数器就保存虚拟机正在执行的字节码指令的地址。线程调用方法的时候会创建栈帧,用于保存局部变量表和操作数栈以及指向该类常量池的引用
静态方法虽然是同一个方法,但是不同线程在调用,程序计数器的值是不一样的,操作这两个线程不会相互影响(假设不存在访问共享变量的情况)
1.保证不依靠其他类、属性、方法等
2.不需要考虑方法同步
3. 如果使用单例类,需要考虑线程同步的情况,这是工具类不使用单例的原因(我认为是这样的)
这里还有一点需要补充:在写工具类时,最好是将其构造方法私有化,避免意外的初始化类,做无意义的工作
2.final关键字
关键字final表示这个变量只能被赋值一次,一旦被赋值之后,就不能够再修改.就变成了常量,
final关键字主要用在三个地方:变量、方法、类。
修饰变量
如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
修饰类
表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。
修饰方法
使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的Java版本已经不需要使用final方法进行这些优化了)。类中所有的private方法都隐式地指定为final。Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,具体参见Java运行期优化。此举能够使性能平均提高50%。
字符类中成员变量重名问题
在java中使用super关键字可以解决子父类中成员变量重名的问题;
this关键字:
当前对象引用,正在调用方法的对象就是当前对象;(就是这个对象)
this关键字:代表本类对象的引用,哪个对象调用了方法,方法中的this就是哪个对象(地址)
this的作用:
当我们的成员变量和局部变量同名时,使用this可以区分成员变量和局部变量
this.变量名 —>是成员变量
super关键字:
当前对象的父类对象引用;(父类对象)
super关键字只能出现在子类的类中;
使用格式:
super.父类成员变量名;
super.父类的方法名(实际参数);
成员变量查找的规则:
什么关键字都不写的时候,采用就近原则;
如果使用this关键字,从当前类的成员变量位置开始查找,找到为止;如果一直到Object都没找到,则语法报错;
如果使用super关键字,从当前类的父类成员变量位置开始查找,找到为止;如果一直到Object都没找到,则语法报错;
成员变量查找的时候,只能向上找,不能向下找;
子父类中成员方法重名问题
方法的重载:
在同一个类中,方法名相同,参数列表不同;
列表不同:
1:参数个数不同;
2:参数类型不同;
3:如果类型不同的时候,顺序不同;
方法的重写(复写,覆盖):
在子父类体系中,子类拥有了与父类一模一样(只要子类的方法权限大于或等于父类的方法权限即可)的方法;就是方法的重写;
方法重写的意义:
当子类认为父类的方法不够强大时,子类可以对父类的方法进行增强,那么此时可以方法重写的技术;(为后面学习多态做铺垫);
方法重写的注意事项
1:如果父类的方法是私有的,那么子类不能重写,因为子类看不到这个方法;
2:当子类需要对父类已经存在的方法,进行增强的时候,可以重写;只要子类的方法权限大于或等于父类的方法权限即可;参数列表和返回值类型保持一致;
子父类中内存结构示意图
构造方法的作用:
1:用于创建对象;(没有构造方法,就不能创建对象)
2:给成员变量初始化;(对成员变量赋值)
this与super关键字调用其他构造方法
在一个类的构造方法中,可以通过this(实际参数);的形式调用自己类中的其他构造方法;
在一个类的构造方法中,可以通过super(实际参数);的形式调用自己类父类中的构造方法;
构造方法调用的注意事项:
1:构造方法的调用必须写在构造方法内的第一行;
2:this调用与super调用不能在同一个构造方法中同时出现;
3:构造方法之间的调用不能形成递归;(简单记:调用不能形成闭环)
4:如果构造方法中没有明确调用哪个构造方法,那么默认调用父类的空参数的构造方法;
this与super调用普通成员与构造方法的格式总结
l 调用普通成员:
this.成员变量 可以访问本类对象的成员变量
super.成员变量 可以访问父类对象的成员变量
this.成员方法() 可以访问本类对象的成员方法
super.成员方法() 可以访问父类对象的成员方法
使用this找本类,如果本类没有,找父类
使用super找父类,如果父类没有不会去找子类
l 调用构造方法:
this(其他参数) 可以访问本类其他的构造方法
super(其他参数) 可以访问父类其他的构造方法
l 默认子类调用父类构造方法
子类的每个构造方法中均有默认的super(),调用父类的空参构造。手动调用父类构造会覆盖默认的super();