Notes9 day09-JAVAOOP

本文详细介绍了Java中的内部类,包括成员内部类、局部内部类和匿名内部类的定义、访问特点以及创建对象的格式。同时,讨论了final关键字和static关键字的作用,如final用于防止变量和方法被修改,static用于修饰类变量和方法,使其成为类成员。此外,还涵盖了静态方法和静态变量的使用注意事项,以及代码块(静态代码块、构造代码块)的调用和使用规则。

内部类

内部类分类

成员内部类

局部内部类

匿名内部类

成员内部类

定义格式:

class 外部类 {
    class 内部类{ 
    }
}
成员内部类访问特点
  • 内部类可以直接访问外部类的成员,包括私有成员。

  • 注意:要内部类访问的外部类成员变量名与内部类的成员变量名一样时,则采用就近原则

  • 可以通过 this.变量名 外部类变量名.this.变量名 来访问外部类变量

  • 外部类要访问内部类的成员,必须要建立内部类的对象。

  • 注意:第一种可以在测试类中创建内部类,在调用内部类中的成员

  • 第二种:可以在外部类中创建内部类,把创建的内部类对象当成外部类的属性,在测试类中创建的外部类对象

  • 通过外部类对象调用内部类对象的方法调用内部类的属性

创建内部类对象格式
外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
// 或者
外部类 对象名1 = new 外部类();
外部类.内部类  对象名2 = 对象名1.new 内部类();

局部内部类

什么是局部内部类

将一个类定义在一个方法中,该类就称之为是局部内部类

想要调用局部内部类的成员只有一种方法:

在包含局部内部类的外部类的成员方法中创建局部内部类的对象 通过该对象来调用局部内部类的成员属性

代码演示

public class Person {
​
    public void in() {
​
       class Student{
           public void show(){
               System.out.println("哈哈哈");
           }
       }
        Student student = new Student();
       student.show();
    }
    
}

匿名内部类

是内部类的简化写法。它的本质是一个 带具体实现的 父类或者父接口的 匿名的 子类对象

使用匿名内部类的前提

匿名内部类必须==继承一个父类==或者==实现一个父接口==。

匿名内部类的三种写法

第一种写法

public class Test {
    public static void main(String[] args) {
       new Person(){
           public void show(){
               System.out.println("你好");
           }
       }.show();//带 .show() 这个表示的是方法  不带则表示的是对象
    }
}

第二种写法

public class Test {
    public static void main(String[] args) {
      Person person =  new Person(){
           public void show(){
               System.out.println("你好");
           }
       };
​
      person.show();
​
    }
}

第三种写法

public class Test {
    public static void main(String[] args) {
        Tu tu = new Tu();
           tu.in(new Person() {
               @Override
               public void show() {
                   
               }
           });
    }
}

匿名内部类好处:就是可以不用再写一个实现类来实现接口,可以直接使用

关键字final

final:不可改变。可以用于修饰类、方法和变量。

  • 类:被修饰的类,不能被继承。

  • 方法:被修饰的方法,不能被重写。

  • 变量:被修饰的变量,不能被重新赋值,变成了常量

关键字 static

什么是static关键字

它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属 于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了。

static的定义和使用格式

    static的特点:(它可以修饰成员变量,还可以修饰成员方法)
        A:随着类的加载而加载
            回想main方法。
        B:优先于对象存在
        C:被类的所有对象共享
            举例:咱们班级的学生应该共用同一个班级编号。
            其实这个特点也是在告诉我们什么时候使用静态?
                如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
            举例:
                饮水机(用静态修饰)
                水杯(不能用静态修饰)
        D:可以通过类名调用
            其实它本身也可以通过对象名调用。
            推荐使用类名调用。
            
            静态修饰的内容一般我们称其为:与类相关的,类成员
​
​

静态方法和静态变量的注意

  • 静态方法可以直接访问类变量和静态方法。

  • 静态方法不能直接访问普通成员变量或成员方法。反之,成员方法可以直接访问类变量或静态方法。

  • 静态方法中,不能使用this关键字,但是可以在该类中创建一个对象,用static修饰该对象,使他成为该类中的一个属性,可以在静态方法中通过该对象调用调用该对象的属性

静态属性调用格式

类名.静态属性 、对象名.静态属性(不推荐使用)

static总结

  • 被static修饰的内容
    • 是随着类的加载而加载的,且只加载一次。
    • 存储于一块固定的内存区域(静态区),所以,可以直接被类名调用。
    • 它优先于对象存在,所以,可以被所有对象共享。

     

静态变量和成员变量的区别

所属不同
    静态变量属于类,所以也称为类变量
    成员变量属于对象,所以也称之为实例变量(对象变量)
内存中位置不同
    静态变量存储于方法区的静态区
    成员变量存储于堆内存中
生命周期不同
    静态变量随着类的加载而加载,随着类的消失而消失
    成员变量随着对象的创建而创建,随着对象的消失而消失
调用不同
    静态变量可以通过类名调用,也可以通过对象来调用
    成员变量只能通过对象名调用

代码块

分类:静态代码块、构造代码块

注意

对代码块的调用注意:

当调用静态属性或者创建对象时,静态代码块被调用,且只能调用一次

使用通过静态属性调用静态代码块,只能调用静态的代码块,不能调用构造代码块

通过对象调用代码块时,静态构造代码块都能被调用,静态的也是只能调用一次,而构造代码块随着每次对象创建,都要调用

静态代码块使用事项:

静态代码只能调用静态属性,也不能使用this

构造代码块的使用事项:

静态属性动太属性都能调用

下面是子类和父类中各个成员的加载顺序:

  1. 父类的静态代码块和静态属性按照定义的顺序依次加载。

  2. 子类的静态代码块和静态属性按照定义的顺序依次加载。

  3. 父类的普通代码块和普通属性按照定义的顺序依次加载。

  4. 父类的构造方法被调用。

  5. 子类的普通代码块和普通属性按照定义的顺序依次加载。

  6. 子类的构造方法被调用。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值