面向对象(四)
this关键字
this关键字表示当前对象本身,一般用于类的内部,其内部存在一个地址,指向当前初始化的对象本身.
new 一个对象时,其实产生了两个引用,两个引用执行同一内存空间(对象) 所以类中用this来表示当前对象,因为不用this,我们是不知道在创建对象时具体的对象名的
用法
1.调用成员变量
用于解决成员变量与局部变量之间二义性
2.调用其他实例方法
同一类中非static方法互调
3.调用本类其他构造方法
可以调用本类的其他构造方法,但是必须写在第一句
public Person(String name, String gender) {
this.name = name;
this.age = 18;
this.gender =gender;
}
public Person(String name,int age ,String gender){
//this调用构造方法,要放在有效代码第一行
this(name,gender);
this.gender=gender;
super关键字
super表示父类 ,当子类需要访问父类成员时,可以使用super
super只是一个关键字 ,内部没有引用,不包含地址
用法
1.super访问父类非私有字段
2.super访问父类非私有方法
3.super访问父类构造方法
- super 调用构造方法必须写在子类构造方法的第一句
- 如果子类构造方法没有显示调用父类构造方法的话,JVM会默认调用父类的无参构造super()
static修饰符
static关键字表示静态,修饰变量称为静态变量,修饰方法构成静态方法.
- 静态变量:使用static修饰的变量,归类所有,也被称为类变量.类的所有实例/对象都可以访问,被类的所有实例或对象共享
语法:
static 数据类型 成员变量 [=初始值];
静态变量的访问
1.类名.静态变量名(推荐方法)
2.实例.静态变量名
- 静态方法:static修饰的方法,归类所有,也称类方法
[修饰符] static 返回值类型 方法名(形参){
}
静态方法的访问
1.类名.静态方法() (推荐方法)
2.对象.静态方法()
静态方法的特性
- 静态方法中可以访问静态变量和类的其他静态方法
- 实例方法中可以访问静态成员(静态变量和静态方法),静态方法不能访问实例成员
jvm加载static成员过程
1.当加载一个类时,会进行到静态区/方法区 ,jvm扫描类名.class字节码文件中的 静态成员并分配空间初始化
2.jvm加载完class
2.1.读取字节码,读取字段,计算字段未来需要申请的空间
2.2.读取字节码,读取方法,标记方法签名
2.3.读取字节码,判断是否有静态变量,有,立即分配内存空间
3.由于static成员是先加载的,所有静态方法不能访问实例成员,原因很简单,因为静态方法先加载,这时候实例方法还没没创建,所有也就无法访问了,返回来,对象的实例方法是可以访问静态成员的
final修饰符
- final修饰的类:表示最终的类, 该类不能再有子类
- final修饰的方法:最终的方法, 该方法不能被子类覆盖
- final修饰的变量:表示常量,该变量只能赋值一次,不能再重新赋值
- 基本数据类型:表示的值不能改变
- 引用数据类型:所引用的地址值不能改变
代码块
{} 标记的代码称为代码块
普通代码块
普通代码块{},一般存在于方法中,形成作用域
作用域:
作用域可以进行嵌套,内层作用域可以访问外层作用域,反之则不能
构造代码块
构造代码块在类中(类的内部,方法外),构造代码块,每new一个对象都会执行一次,在构造方法前执行
静态代码块
被static修饰的代码块
静态代码块位于类的内部、方法的外部。 静态代码块只执行一次,在构造代码块、构造方法前执行。
内部类
- 类与类存在平行关系
一个文件可以定义多个类,但是只能存在一个public类,有多少个类,就存在多少份字节码
public class Person{
}
class Student{
}
- 类与类存在包含关系
public class Outer {
public class Inner{
}
}
Outer和Inner是包含关系。Outer称为外部类,Inner称为内部类。
内部类Inner作为一个Outer的成员而存在。
成员(实例)内部类
内部类Inner作为外部类的一个成员而存在,Inner称为成员内部类。没有使用static修饰的内部类,访问内部类使用外部类的对象来访问
一般成员内部类的访问修饰符都是默认访问权限(包访问权限)
//定义内部类
public class Outer {
[修饰符] class Inner{
}
}
//创建对象
public static void main(String[] args) {
Outer outer = new Outer(); // 创建外部类对象
Outer.Inner inner = outer.new Inner();// 创建内部类对象
inner.showInfo(); //调用内部类的方法
}
- 成员内部类特性
成员内部类可以直接访问 外部类的 私有成员
静态内部类
成员内部类被static修饰,变成了静态内部类,作为外部类的一个静态成员存在
public class Outer {
static class Inner{
}
}
- 静态内部类特性
静态内部类可以访问 外部类的 静态私有成员
方法(局部)内部类
方法内部类只能存在于方法中,也只能在方法中创建对象
方法内部类特性
方法内部类可以读取 方法的局部变量,但不能修改。
匿名内部类
当一个类只使用一次,可以声明匿名内部类
但是匿名内部类必须要有 实现 存在
public class Test01 {
public static void main(String[] args) {
Animal animal = new Animal(){
@Override
public void showInfo() {
System.out.println("我是子类匿名内部类");
}
};
animal.showInfo();
new IUsb(){
@Override
public void showInfo() {
System.out.println("我是匿名内部类");
}
}.showInfo();