面向对象(四)
this关键字
this:表示当前对象,谁调用this所在的方法,this即使哪一个对象
this主要存在两个地方:1.方法中,2、构造器中
1.在构造器中:表示当前被创建的对象
2.在方法中:哪一个对象调用this所在的方法,此时this就表示哪一个对象
什么时候需要使用this关键字:
1.解决局部变量和成员变量直接的二义性
2.同一类中非static方法之间的互调
3.构造器重载的互调(必须写在第一句)
super关键字
【1】什么是super:
super:当前对象的父类对象在创建子类对象时,在子类构造器的第一行会先调用父类构造器
【2】什么时候使用super:
1.在子类方法中,当子类需要访问父类中的非私有成员的时候
2.在子类方法中,当子类需要访问父类中的非私有方法的时候
3.在构造方法中,当需要调用父类的构造方法的时候,此时super必须写在构造的第一行
static修饰符
【1】使用static修饰的成员与没有使用static修饰的成员之间的区别
使用static修饰的成员:属于类,可以直接使用类名调用即可
没有使用static修饰的成员:属于对象,必须先创建对象,再调用
【2】static方法不能使用super和this:
因为static是属于类的是类级别,super和this是属于对象的是对象级别,而存在类的时候不一定存在对象,也就说使用类名调用static方法时,可能是没有对象的
【3】内存分析:
static修饰的成员变量(字段),随着所在类被加载进了jvm,也同时存储在方法区中,被所有对象共享。
【4】实例成员和类成员访问规则
使用对象访问static方法或成员变量,底层依然使用类名访问的。
一般的,static方法访问的成员变量必须使用static修饰。
final修饰符
【1】final的含义
final的含义是最终的,不可改变的,可以修饰类、方法、变量、基础数据类型、引用数据类型
【2】final能用在哪些地方,各自的作用是什么?
1> 类:表示最终类,该类不能有子类
public class GG extends Dog{//final修饰的类不能有子类
}
2> 方法:表示最终方法,该方法不能被子类重写(覆盖)
public void say(){//final修饰的方法:不能被子类覆盖
3> 变量:表示为常量,只能赋值一次,不能再次赋值
final int a = 10;//final修饰的变量:表示常量,该变量只能赋值一次,不能再重新赋值。
a = 20;
4> 基础数据类型:表示值,不能改变
final String str = ".";//基本数据类型:表示的值不能改变
5> 引用数据类型:表示引用的地址值不能改变
final Dog dog = new Dog();
dog = new Dog();//引用数据类型:所引用的地址值不能改变
代码块
【1】什么是代码块?
直接使用 { } 括起来的一段代码区域,代码块里的变量属于局部变量,只能在自己所在的区域 { } 有效。
【2】 代码块有几种形式
代码块有3种形式,分别是局部代码块,静态代码块,初始化代码块(构造代码块)
**局部代码块:**直接定义在方法内部的代码块。
public static void main(String[] args) {
//局部代码块
{
int a = 10;
}
}
**初始化代码块(构造代码块):**直接定义在类中,每次创建对象的时候都会执行初始化代码块,开发中不使用初始化代码块,一般使用构造器
//初始化代码块
{
System.out.println("大狗");
}
静态代码块:使用static修饰的初始化代码块,当该代码块的类的字节码被加载进JVM,就执行static代码块代码。在开发中,用来做加载资源、加载配置文件等操作。
//静态代码块
static {
System.out.println("小狗");
}
内部类和匿名内部类
【1】什么是内部类?
把一个类定义在另一个类的内部,把里面的类称之为内部类,把外面的内称之为外部类
内部类可以看作和字段、方法一样,是外部类的成员,而成员可以有static修饰。
**静态内部类:**使用static修饰的内部类,那么访问内部类直接使用外部类名来访问
**实例内部类:**没有使用static修饰的内部类,访问内部类使用外部类的对象来访问
**局部内部类:**定义在方法中的内部类,一般不用
**匿名内部类:**特殊的局部内部类,适合于仅使用一次使用的类
对于每个内部类来说,Java编译器会生成独立.class文件。
静态和实例内部类:外部类名$内部类名字
局部内部类:外部类名$数字内部类名称
匿名内部类:外部类名$数字
【2】匿名内部类
什么时候可以使用匿名内部类?语法是什么?
如果一个类只需要用一次,就完全没有必要单独定义一个java文件,直接可以使用匿名内部类。
针对类:
new 父类构造器([实参列表]){
//匿名内部类的类体部分
}
针对接口:
new 接口名称(){
//匿名内部类的类体部分
}
//例如
public class Test {
public static void main(String[] args) {
//Animal的子类匿名内部类
Animal animal = new Animal("狗",20);
new Animal(){
@Override
public void say() {
System.out.println("会叫");
}
}.say();
//IUSB的实现类匿名内部类
new IUSB(){
@Override
public void usb() {
System.out.println("USB");
}
}.usb();
}
}
}.say();
//IUSB的实现类匿名内部类
new IUSB(){
@Override
public void usb() {
System.out.println("USB");
}
}.usb();
}
}