java中的内部类内部接口的使用方法说明

发布时间:2020-11-03 18:59:44 作者:Leah
来源:亿速云 阅读:438

这期内容当中小编将会给大家带来有关java中的内部类内部接口的使用方法说明,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

内部类

先讲内部类,内部类就是在类中定义的类。类中的类可以看做是类的一个属性,一个属性可以是static也可以是非static的。而内部类也可以定义在类的方法中,再加上匿名类,总共有5种内部类。

静态内部类

我们在class内部定义一个static的class,如下所示:

@Slf4j
public class StaticInnerClass {

 static class Inner {
  void print() {
   log.info("Inner class is: " + this);
  }
 }

 public static void main(String[] args) {
  StaticInnerClass.Inner inner = new StaticInnerClass.Inner();
  inner.print();
 }
}

因为static变量可以直接根据类名来存取,所以我们使用new StaticInnerClass.Inner()来实例化内部类。

非静态内部类

class中定义的类也可以是非静态的,如下所示:

@Slf4j
public class InnerClass {

  class Inner {
  void print() {
   log.info("Inner class is: " + this);
  }
 }

 public static void main(String[] args) {
  InnerClass.Inner inner = new InnerClass().new Inner();
  inner.print();
 }
}

要访问到类的变量,需要实例化外部内,然后再实例化内部类:new InnerClass().new Inner()。

注意这里我们需要使用到两个new。

静态方法内部类

我们可以在静态方法中定义一个类,这个类其实就相当于方法中的变量,这个变量当然不能是static的。我们看下面的例子:

@Slf4j
public class StaticMethodInnerClass {

 private static String x = "static x";

 public static void print() {
  class MyInner {
   public void printOuter() {
    log.info("x is " + x);
   }
  }
  MyInner i = new MyInner();
  i.printOuter();
 }

 public static void main(String[] args) {
  StaticMethodInnerClass.print();
 }
}

方法中的类,我们是无法在外部实例化的。

非静态方法的内部类

同样的非静态方法也可以定义内部类:

@Slf4j
public class MethodInnerClass {

 private String x = "non static x";

 public void print() {
  class MyInner {
   public void printOuter() {
    log.info("x is " + x);
   }
  }
  MyInner i = new MyInner();
  i.printOuter();
 }

 public static void main(String[] args) {
  new MethodInnerClass().print();
 }
}

注意,这里需要先实例化外部类才可以继续调用。

匿名类

最后一个,匿名类,直接在需要的时候实例化的类。匿名类我们遇到了很多次了,比如在构建SortedSet的时候,可以传入自定义的Comparator,我们可以用匿名类来实现,也可以直接使用lambda表达式。

public class AnonymousClass {

 public static void main(String[] args) {
  SortedSet sortedSet1 = new ConcurrentSkipListSet(new Comparator(){
   @Override
   public int compare(Object o1, Object o2) {
    return 0;
   }
  });

  SortedSet sortedSet2 = new ConcurrentSkipListSet((o1, o2) -> 0);
 }
}

内部接口

Inner Interface是指在接口中定义的接口。最常见的就是Map中的Entry了:

public interface Map<K, V> {
 interface Entry<K, V> {
  K getKey();
 }

这里的内部接口一定是static的,因为接口是不能实例化的,所以为了访问到接口中的接口,必须定义为static。如果不指定,则默认就是static。

我们看一个该内部接口的实现:

public class MapImpl implements Map.Entry{
 @Override
 public Object getKey() {
  return 0;
 }

 @Override
 public Object getValue() {
  return null;
 }

 @Override
 public Object setValue(Object value) {
  return null;
 }
}

总结

本文讲解了5个内部类的实现和一个内部接口的应用。大家只要把内部的类或者接口看成一个变量,就可以很好的理解上面的内容了。

本文的例子https://github.com/ddean2009/learn-java-base-9-to-20

补充知识:内部类(成员内部类、静态内部类、方法内部类)

一:成员内部类:

最常见的内部类就是成员内部类,也称作普通内部类;

java中的内部类内部接口的使用方法说明

1、Inner类定义在Outer类的内部,相当于Outer类的成员变量的位置,Inner类可以使用任意访问修饰符,如:public、private、protected等。

2、Inner类中定义的test()方法可以访问Outer类中的数据,不受访问控制符的影响。

3、 定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:内部类 对象名 = 外部类对象.new 内部类( );如创建Inner的内部类对象:要先创建外部类对象:Outer o = new outer(); 创建内部类:Inner i = o.new Inner();访问Inner中的test()方法:i.test();

例如:

java中的内部类内部接口的使用方法说明

4、如果外部类和内部类具有相同的成员变量或方法,内部类可以直接访问内部类的成员变量或方法,但如果内部类访问外部类的成员变量或者方法时,需要使用this关键字;如下:

java中的内部类内部接口的使用方法说明

二:静态内部类

静态内部类就是用static修饰的内部类,这种内部类的特点是:

1、静态内部类不能直接访问外部类的非静态成员,但,可以通过new 外部类().成员的方式访问;

java中的内部类内部接口的使用方法说明

2、如果外部类的静态成员与内部类的静态成员相同, 可以通过"类名.静态成员"来访问外部类的静态成员;如果不同,可以直接调用外部类的静态成员名。

java中的内部类内部接口的使用方法说明

java中的内部类内部接口的使用方法说明

3、创建静态内部类的对象时,不需要外部类的对象,可以直接创建;

三:方法内部类:

1、方法内部类就是定义在外部类的方法中,方法内部类只在该方法内可以用;

java中的内部类内部接口的使用方法说明

2、由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。

上述就是小编为大家分享的java中的内部类内部接口的使用方法说明了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. Java的内部类怎么用
  2. java 中匿名内部类的使用方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java 内部类 ava

上一篇:Python logging日志库空间不足怎么解决

下一篇:使用python实现一个简单网页服务器

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》