JAVA web基础-内部类

1内部类分类

1.成员内部类
2.局部内部类
3.匿名内部类
共性:-内部类仍然是一个独立的类,在编译之后会,内部类会被编译成独立的.Class文件,但是前面冠以外部类的类名和$符号。
-内部类不能用普通的方式访问,内部类是外部类的一个成员,因此内部类可以自由的访问外部类的成员变量,无论是否是private。

2.成员内部类

/*
 * 成员内部类:
 *      在类的成员位置,和成员变量个方法位置一样。
 *      在内部类中,可以直接访问外部成员,包括私有方法。
 * */

import org.junit.Test;

public class InnerDemo {
    @Test
    public void test(){
    //调用方法一:
//      Outer outer = new Outer();
//      outer.method();
    //调用方法二:
        Outer.Inner io = new Outer().new Inner();
        io.function();

    }
}

class Outer{
    private int num = 10;

    public void method(){
        Inner inner = new Inner();
        inner.function();
    }

    class Inner{
        public void function(){
            System.out.println("function" + num);
        }
    }
}

3.成员内部类的修饰符

/*
 * 成员内部类的修饰符:
 *      权限修饰符:public、protected。不能加private,则无法在其他类中访问。
 *      
 *      可以使用static修饰成员内部类,不用在创建外部类的对象了。
 *      我们可以使用abstract、finally修饰内部类。
 * 
 * */
public class InnerClassdemo02 {
    public static void main(String[] args) {
        Outer2.Inner2 io = new Outer2.Inner2();
        io.function();

        Outer2.Inner2.function();

    }
}

class Outer2{
    private int num = 10;
    public void mehod(){

    }

     static class Inner2{
        public static void function(){
            System.out.println("function");
        }
    }
}

4 局部内部类


/*
 *局部内部类:
 *      在方法内,出了方法之后就无法使用。
 * 
 * */
public class InnerClassdemo02 {
    public static void main(String[] args) {

        Outer2 outer2 = new Outer2();
        outer2.mehod();
    }
}

class Outer2{
    private int num = 10;
    public void mehod(){
        class Inner2{
            public void function(){
                System.out.println("function");
            }
        }

        Inner2 inner2 = new Inner2();
        inner2.function();

    }

}

5.匿名内部类

/*
 *匿名内部类:
 *      可以把匿名内部类看成是一个没有名字的局部内部类。
 *      定义在方法中,
 *      必须在定义匿名内部类的时候创建对象
 * 格式:
 *      new classname/interface(){
 *          如果是创建了继承这个类的子类对象,我们可以重写父类的方法。
 *          如果是创建了实现这个接口的子类对象,我们必须要实现该接口的所有方法。
 *      };
 * 
 * 原理:而是创建了继承这个类的子类对象,创建了实现这个接口的子类对象。
 * */
public class InnerClassdemo02 {
    public static void main(String[] args) {

        Outer2 outer2 = new Outer2();
        outer2.method();
    }
}


interface Inner{
    public void function();//接口中默认的方法是abstract。
}


class Outer2{

    public void method(){
        new Inner(){

            @Override
            public void function() {
                // TODO Auto-generated method stub
                System.out.println("function");
            }

        }.function();


//      多态,向上转型;第二种,变量接受。
        Inner inner = new Inner(){

            @Override
            public void function() {
                // TODO Auto-generated method stub
                System.out.println("function");
            }

        };

        inner.function();
        inner.function();

    }
}

6.匿名内部类作为参数进传递

/*
 * 匿名内部类的应用场景
 *      作为参数进行传递
 * 
 * */
public class InnerClassdemos {
    public static void main(String[] args) {
        method(new Dog());
        method(new Cat());

//      如果cat或者dog只执行一次,可以作为参数进行传递。
    method(new Animals() {

        @Override
        public void eat() {
            // TODO Auto-generated method stub
            System.out.println("cat eat fish");
            }
        }
    );


    }

    public static void method(Animals animals) {
        animals.eat();
    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值