首页 > 技术文章 > java 权限修饰符 内部类 匿名内部类

shangjinshuai 2020-11-26 19:10 原文

权限修饰符:
    概述:
        在Java当中官方提供了四种权限修饰符,使用不同的访问权限修饰符修饰时,
        被修饰的内容会有不同的访问权限
        
        1.public:公共的
        2.prodected:受保护的
        3.(default):默认不写
        4.private:私有的
        不同的权限修饰符有不同的访问能力
                        public        protected        (default)        private
        同一类中        √            √                √                √
        同一包不同类    √            √                √                x
        不同包子类        √            √                x                x
        不同的非子类中    √            x                x                x
        可见,private是最小权限,public时最大的权限
        
        编写代码建议使用:
            成员变量:使用private,隐藏细节
            构造方法:使用public,方便创建对象
            成员方法:建议使用public,方便调用    
            备注:【默认级别】,是不写的
            
            
            
内部类:
    概述:
        什么是内部类?
        将一个类A定义在另一个类B里面,里面的类A就称为【内部类】,反之类B则称为【外部类】
    成员内部类:
        成员内部类:定义在类中方法外的类
    
    格式:
        修饰符 class 外部类名称{
            修饰符 class 内部类名称{
                //...
            }
            //...
        }
    在描述事物时,如果一个事物内部包含了另外的其他事物,就可以使用内部类这种结构.定义在成员位置
    比如:心脏和身体的关系,此时就需要使用内部类的结构来描述这类事物
    
    访问特点:
        1.内部类可以直接访问外部类的成员包括私有成员
        2.外部类要访问内部类的成员 必须建立内部类的对象
        
    创建内部类的格式:
        外部类类名.内部类类名 对象名 = new 外部类类名().new 内部类类名();
    
    备注:内部类仍然是一个独立的类,编译之后依然会生成一个独立的.class文件
        该类文件名称:外部类类名$内部类类名.class
        
        
匿名内部类:【重点】
    匿名内部类:是内部类的简写.它的本质其实是一个
        【带着具体实现的】【父类或者是父接口】【匿名的】子类对象
        开发中最常用到的内部类是【匿名内部类】
        
    前提:
        匿名内部类必须【继承一个父类】或者是【实现一个接口】,伴随着重写父类或者是父接口当中的抽象方法
        
    格式:
        new 父类名或者是父接口名{
            //方法的重写
            @Override
            public void method{
                //重写的方法体内容
            };
        }
        
    通常在方法的形式参数是接口或者抽象类时,一般将匿名内部类作为实参进行参数传递
    举例:
        public interface Animal{
            //吃
            public abstract void eat();
        }
        //定义一个启动类
        public class DemoAnonymous{
            //定义一个成员方法
            public static void showEat(Animal animl){
                animl.eat;
            }
            public static void main(String[] args){
                //采用匿名内部类的方式来写,
                //多态写法
                //等号左边:接口
                //等号右边:本质是Animal接口的子类对象
                Animal animl = new Animal(){
                    @Override
                    public void eat(){
                        System.out.println("猫吃鱼");
                    }
                };
                showEat(animl);//猫吃鱼
                showEat(new Animal(){
                    @Override
                    public void eat(){
                        System.out.println("猫吃鱼");
                    }                
                });
            }
        }

推荐阅读