黑马程序员技术交流社区

标题: 【黑马程序员济南】小鲁哥哥白话笔记-内部类 [打印本页]

作者: 小鲁哥哥    时间: 2017-7-27 16:37
标题: 【黑马程序员济南】小鲁哥哥白话笔记-内部类
小鲁哥哥白话笔记-内部类
大家学完Static关键字后,马上又进入了另一项挑战,就是内部类。What??类里面还能定义类,这不是多此一举吗?很多同学第一次听到这个名词后都有这个反应,且听小鲁哥哥慢慢道来,听完后会让你有一种“原来这就是内部类啊”,没有啥啊。
何为内部类:将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类。这是官方说法,其实就是“大房子里边套了个小单间,房间虽少但是五脏俱全”。
举个栗子:
[Java] 纯文本查看 复制代码
public class 大房子{
//大房子的代码
class 小房子{
//小房子的代码
}
}
内部类有几个分支:成员内部类,局部内部类,匿名内部类。
通过和学生的了解,大家对成员内部类和局部内部类都没有问题,就是遇到匿名内部类就难住了,不知道怎么理解,也没有头绪。成员内部类和局部内部类就简单举个例子,重点讲一讲匿名内部类。
成员内部类:
[Java] 纯文本查看 复制代码
public class InnerDemo {
public static void main(String[] args) {
//Outer o = new Outer();
//o.method();
Outer.Inner i = new Outer().new Inner();
i.function();

}
}


class Outer {
private int num = 10;
public void method() {
Inner i = new Inner();
i.function();
}
class Inner {
public void function() {
System.out.println(num);
}
}
}
局部内部类:
[Java] 纯文本查看 复制代码
package com.itheima_02;
/*
* 局部内部类
* 在方法内,出了方法之后就无法使用
*
*
*/
public class InnerDemo3 {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}

class Outer {
public void method() {
int num = 10;
class Inner {
public void function() {
System.out.println("function");
}
}
Inner i = new Inner();
i.function();
}
public void test() {
//Inner i = new Inner();
//System.out.println(num);
}
}
好了,重点讲一下匿名内部类,这个同学学完了,脑子里第一反应就是,这怎么用??
匿名内部类
先给大家看一看匿名内部类的例子:
[Java] 纯文本查看 复制代码
package com.itheima_03;
/*
* 匿名内部类:
*                 可以把匿名内部类看成是一个没有名字的局部内部类
*                 定义在方法当中
*                 必须在定义匿名内部类的时候创建他的对象
* 格式:
*                 new 类/接口(){
*                         如果是创建了继承这个类的子类对象,我们可以重写父类的方法
*                         如果是创建了实现这个接口的子类对象,我们必须要实现该接口的所有方法
*                 };
* 原理:而是创建了继承这个类的子类对象或者是创建了实现这个接口的子类对象
*        
*/
public class InnerDemo4 {
        public static void main(String[] args) {
                Outer o = new Outer();
                o.method();
        }
}


interface Inner {
        public void function();
}

class Outer {
        public void method() {
               
                /*new Inner() {

                        @Override
                        public void function() {
                                System.out.println("function");
                        }
                       
                }.function();;*/
               
                Inner i = new Inner() {

                        @Override
                        public void function() {
                                System.out.println("function");
                        }
                       
                };
               
                i.function();
                i.function();
               
               
        }
}
其实很简单,匿名内部类一般应用于接口,为了不再写一个类去实现这个接口,直接在类里去通过new 接口+实体模块的方式去实现这个接口。很多同学比较困惑的地方是:接口不是不能实例化吗,为什么还能new呢?这里要说的是,这里去实例化不是实例化这个接口,而是实例化没有名字的接口实现类,用new 接口+实体内容来代替,这里我们可以理解为程序员很懒,不想为接口再单独创建一个类去实现它,就直接在当前类中去用这一种方式来代表这个实现类。
这我们以后的代码日子里,我们会经常遇到匿名内部类这种表达方式,随着我们知识的深入,我们肯定会越来越了解这一种代码格式。






作者: qidianlu    时间: 2017-7-27 17:14
老司机准时发车




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2