第二阶段-面向对象(四)

本文详细解析了this关键字在方法和构造器中的作用,如何解决变量歧义和方法间调用;介绍了super在子类中的使用场景,以及static修饰的成员与非static的区别,包括内存分析。同时涵盖了final修饰符的含义及其在不同场合的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面向对象(四)

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();
}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值