关于内部类的面试题

这篇具有很好参考价值的文章主要介绍了关于内部类的面试题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、看下面代码求值

 1 /要求:使用已知的变量,在控制台输出30,20,10。
 2       class Outer {
 3             public int num = 10;
 4             class Inner {
 5                 public int num = 20;
 6                 public void show() {
 7                     int num = 30;
 8                     System.out.println(?);
 9                     System.out.println(??);
10                     System.out.println(???);
11                 }
12             }
13         }
14 
15         class InnerClassTest {
16             public static void main(String[] args) {
17                 Outer.Inner oi = new Outer().new Inner();
18                 oi.show();
19             }    
20         }        

复制

答案:num、this.num、Outer.this.num

    解析:这题你如何明白了上面总结中的第二点,那么非常简单,考察的就是1、局部变量 2、this,和3、Outer.this,也就是内部类访问外部类属性方法的原理。这考察三个东西,

       1、在一个方法中,使用直接使用变量名,肯定使用的是局部变量,因为会把大的成员变量给隐藏掉,这题中,也就是说show方法中的num会将内部类中的成员变量num隐藏掉,而内部类中的成员变量num又会把外部类中的成员变量num隐藏掉,所以通过直接输出num,会是show方法中的          局部变量的值30.   

       2、使用this.num调用,其this代表的是调用该方法的对象,调用show方法的是oi,oi也就是内部类对象,所以oi.num也就标识内部类的成员变量num的值20

       3、Outer.this.num,调用的外部类中的成员变量num的值也就是10,这个如果不清楚就看上面总结中的第二点,就是那个原理。

二、按照要求补齐代码

1   按照要求,补齐代码
2         interface Inter { void show(); }
3         class Outer { //补齐代码 }
4         class OuterDemo {
5             public static void main(String[] args) {
6                   Outer.method().show();
7               }
8         }
9         要求在控制台输出”HelloWorld”

复制

 答案:

interface Inter { void show(); }
        class Outer {
      //补齐代码
      public static Inter method(){
        return new Inter(){
          void show(){
            System.out.println("HelloWorld");
          }
        };
      }
     }
        class OuterDemo {
            public static void main(String[] args) {
                  Outer.method().show();
              }
        }

复制

解析:这个题目挺有趣的,考了很多东西,一开始只能说我自己度懵逼了,是一个局部匿名内部类。  通过看主方法中的调用,Outer.method(),能直接用类名调用方法,

那么肯定该方法就是一个static方法,然后又直接调用了show()方法,说明这个method方法有一个返回值,其返回值类型就是实现该接口类的类型,因为只有接口中有show()这个方法。所以在method中就是一个匿名内部类。

三、以下代码运行结果是什么?

 1 public class BwfOuterClass {
 2 
 3       private int x = 1;
 4 
 5       private int y = 2;
 6 
 7       private class BwfInnerClass{
 8 
 9            private int x = 3;
10 
11            public void print(){
12 
13                  System.out.println("x+y="+(x+y) );
14 
15            }
16 
17       }
18 
19       public static void main(String[] args) {
20 
21            new BwfOuterClass().new BwfInnerClass().print();
22 
23       }
24 
25 }

复制

答案:

x+y=5

[面试技术点]

Java中内部类的使用。

[解读]

在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这三种:成员内部类、局部内部类、匿名内部类,如下图所示:

本题考的是成员内部类。成员内部类是最普通的内部类,它的定义为位于另一个类的内部,类似于一个成员属性。可以使用修饰符private、default、protected、public。

本题中BwfInnerClass是BwfOuterClass的成员内部类,成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。但是值得注意的是,当成员内部类拥有和外部类同名的成员变量或者方法时,默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:

外部类.this.成员变量

外部类.this.成员方法

本题中,如果把print方法做如下修改:

public void print(){

      System.out.println("x+y=" + (BwfOuterClass.this.x+y));

}

则输出结果为:x+y=3 四、Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?

可以继承其他类或实现其他接口,在Swing编程和Android开发中常用此方式来实现事件监听和回调。 五、为什么内部类调用的外部变量必须是final修饰的?

因为生命周期的原因。方法中的局部变量,方法结束后这个变量就要释放掉,final保证这个变量始终指向一个对象。首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。 为了解决:局部变量的生命周期与局部内部类的对象的生命周期的不一致性问题

 文章来源地址https://www.toymoban.com/news/detail-474707.html

到了这里,关于关于内部类的面试题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 聚类的外部指标(Purity, ARI, NMI, ACC) 和内部指标(NCC,Entropy,Compactness,Silhouette Index),附代码 (Python 和 Matlab)

    众所周知,聚类有效性指标,包括外部指标和内部指标,对于评价聚类结果的质量非常有用。 1.1 Purity 原理解释 先给出Purity的计算公式: 首先解释一下,为什么需要引入纯度计算,因为聚类中总是会出现此类与标签对应的类不一致,虽然他们表示的数字都是1,但是实质内容

    2024年02月04日
    浏览(48)
  • 关于ubuntu下面安装cuda不对应版本的pyTorch

    最近换了台新的linux的ubuntu的服务器,发现其实际安装的cuda版本为11.4,但是pytorch官方给出的针对cuda 11.4并没有具体的pytorch的安装指令,于是采用不指定pytorch版本直接安装让其自动搜索得到即可  直接通过:

    2024年02月11日
    浏览(52)
  • 使用反射调用类的私有内部类的私有方法

    在进行单元测试时,我们往往需要直接访问某个类的内部类或者某个类的私有方法,此时正常的调用就无能为力了,因此我们可以使用反射进行调用。 类 实现方法 获取类的Class对象 Class class = Class.forName(\\\"类名\\\") 或 Class class = 类实例.getClass() new一个实例 Object object = class.newIn

    2024年02月07日
    浏览(42)
  • 内部类的学习2

    静态内部类 静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象。 创建静态内部类对象的格式: 外部类名.内部类名 对象名=new 外部类名.内部类名(); 局部内部类:将内部类定义在方法里面就叫局部内部类,类似于方法里面的局部变量

    2024年01月25日
    浏览(35)
  • java内部类的创建

    创建内部类非常简单,就是在类中定义另外一个类。 内部类,实际上就是类的嵌套。 2.1 创建 内部类如何访问外部类成员? 可以通过 外部类名称.this 的形式来获得外部类对象的引用; 上例中的 System.out.println(Outer.this.index)等价于System.out.println(index) ; 一般情况下,无需这么麻

    2023年04月19日
    浏览(32)
  • Java语言------四种内部类的详细讲解

    目录 一.内部类的介绍 二.内部类的种类 2.1实例内部类       2.2.静态内部类 2.3局部内部类 2.4匿名内部类 总结        内部类: 一个类定义在  另一个类  的  内部。        内部类分为 四种 : 实例内部类、静态内部类、局部内部类、匿名内部类。 使用时机:当一个事

    2023年04月25日
    浏览(43)
  • 静态内部类的访问方法(static/无static)

    笔记汇总: 《Java面向对象程序设计》学习笔记 用static修饰内部类,可以直接通过内部类类名访问静态内部类。 没有用static修饰内部类,则需要new一个外部类实例,再通过外部实例创建内部类。 外部类之外创建内部类对象_new通过外部类创建内部类对象_Dingwensheng1222的

    2024年02月14日
    浏览(46)
  • Lambda表达式和匿名内部类的区别

    匿名内部类:可以是接口,也可以是抽象类,还可以是具体类 Lambda表达式:只能是接口 如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式 匿名内部类:编译之后,产

    2024年02月10日
    浏览(49)
  • 【Java入门】final关键字、static关键字、内部类的认识

    前言 : final是Java中的一个修饰符,用于表示某个变量、方法或者类不能被修改。final可以用于修饰类、方法和变量(局部变量,成员变量)。被final所修饰的类不能被继承,被final所修饰的方法不能被重写,被final所修饰的变量,不能被重新赋值 。 static是Java中的一

    2024年02月11日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包