java接口和内部类

本文详细介绍了Java中的接口和内部类。接口作为特殊的抽象类,其所有成员默认为静态和抽象,用于多继承。类可以实现接口,并且必须实现接口中的所有抽象方法。内部类作为类的成员,可以访问外部类的成员,分为静态和非静态,非静态内部类可以访问外部类的非静态成员。匿名内部类则是在没有名称的情况下创建的,常用于快速实现特定功能。
摘要由CSDN通过智能技术生成
java接口和内部类

活动地址:CSDN21天学习挑战赛

接口
接口定义

特殊的抽象类

  • 接口的所有数据成员都是静态的且必须初始化
  • 所有的方法必须都是抽象方法,不能有一般方法
权限修饰符 interface 接口名称 [extends 父接口名列表]{
 	public static 数据类型 成员变量名 = 常量;
    publict abstract 函数标签;
}

接口定义中的修饰符可以省略,默认为以上访问权限

接口实现

接口和抽象类都不能用来实例化对象

class 类名 implements 接口名表{
}

如果实现某接口的类不是抽象类,则必须实现指定接口的所有抽象方法。

任何实现该接口的类实例化的对象,都可以存储在该接口类型的变量中,通过这些变量访问类所实现你的接口中的方法。

接口的继承

接口可以使用继承派生出新的类,extends

一个接口可以同时有多个直接父接口(多继承), 之间使用逗号分隔,子接口继承父接口的所有变量和方法。

如果子接口中定义了和父接口同名的常量,父接口中的常量被隐藏,如果是方法,则被覆盖.

interface B extends A{
    
}

一个类只能有一个直接父类,但是可以同时实现多个接口

public class Cylinder implements Face1,Face2{
    
}
内部类
定义

定义在类中的类

可以把内部类看作外部类的一个成员,拥有自己的成员变量和方法.

把类的定义放在一个用于封装它的类的内部.

  • 内部类不能与外部类同名
  • 在封装它的类内部使用内部类与普通类相同.在外部使用要在内部类前面加上它所属的外部类的名字.
  • 在用new 创建内部类时也要在new前面加上对象变量
public class Group{
    public class Student{
        ....
    }
    
    public void show(){
        Student stu = new Student(...);
    }
}
内部类和外部类的访问规则
  • 在外部类中通过一个内部类对象引用内部类中的成员.

    在内部类中可以直接访问它的外部类的成员

    内部类也可以通过创建对象从外部类之外被调用,但必须在内部声明为public

  • 在内部类对象中保存了一个对外部类对象的引用,当在内部类的成员方法中访问某一个变量时,如果在该方法和内部类中都没有定义这个变量,调用就会被传递给内部类保存的哪个对外部类的引用,通过这个外部类对象的引用调用变量.

  • 内部类编译完成后,产生的文件名为: 外部类名$内部类名.class

  • 内部类定义为抽象类,需要有其他内部类来继承或者实现

  • 内部类可以声明为protected, private

  • 内部类不能与包含它的外部类名相同

  • 内部类既可以使用外部类的成员变量,也可以使用内部类所在方法的局部变量

  • 内部类不光可以在类中定义,也可以在程序块中定义

    在方法中定义内部类,但是只能访问方法中final 类型的局部变量

  • 内部类可以声明为static, 静态内部类自动转换为顶层类,即它没有父类,而且不能引用外部类成员或者其他内部类中的成员,非静态内部类不能声明静态成员,只有静态内部类才能声明静态成员.

匿名内部类

可以利用内部类创建没有名字的内部类,进一步声明内部类和创建一个该类的对象

  • 创建匿名类的用意: 补充内部类中没有定义到的方法
  • 匿名内部类直接使用父类的名字或者实现接口的名字
  • 匿名类的定义和实例化对象同时进行
  • 匿名内部类没有名字,所以它前面不能有访问权限修饰符,也没有构造方法. 因为默认构造方法没有参数,所以创建对象时不能带参数.
( //创建匿名内部类,并执行定义的方法
    new 类名(){
        方法名(参数列表){
        	// ...
        }
    }
).方法名(参数1, 参数2, ...)
public class Test{
    public static void main(String[] args){
     ( // 匿名类,对Inner内部类的补充
         new Inner(){
          void setName(String n){
               name=n;
               System.out.print("姓名:"+name);
           }
          }
      ).setName("张 三");
 }
 static class Inner{
     String name;
 }
}

匿名内部类编译完成后,所产生的文件名: 外部类类名$编号.class, 编号为1,2,3… 代表第几个匿名内部类

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴风雨中的白杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值