Java基础之内部类

1.什么是内部类?

内部类是一个定义在另一个类中的类

public class Person{
    class student{//内部类
            
    }
}
class stu{//不是内部类,只是在同一个java文件中
    
}

 2.内部类的好处

可以把数据隐藏起来,从而增强面向对象的封装性

3.内部类的分类 

非静态成员内部类,局部内部类,匿名内部类,静态成员内部类

4.非静态成员内部类

        <1>非静态成员内部类可以访问的范围

非静态成员内部类可以访问的作用域中所有数据,方法,包括私有方法(可以当成非静态成员方法去理解)

        <2>不能定义静态属性的成员变量和方法

        <3>非静态成员内部类不能在该类类定义的作用域静态方法中直接使用,像下面这样

    private String[] sex={"男","女"};
    //非静态成员内部类,不在方法中定义的类
    class Student{//内部            
    }
    /*****非静态成员内部类不能直接使用在该类作用域的静态方法中***********/
    public static void eat(){
        Student xingming = new Stuent();
    }
    /**************/

        不过可以这样间接使用

public static void eat() {
    Person p = new Person( );
    p.sleep();
    XiaoMing xiaoming = p.new XiaoMing();
)

 <4>访问非静态成员内部类方法:

内部类名 变量 = new 外部类名().new 内部类名()---------通过这个可以更深刻的理解内部类的优势

<5>非静态成员内部类可以实现多继承 

public class XiaoHua {
    class HuaJiaA extends HuaJia{
            
    }
    class ZuoJiaA extends ZuoJia{
            
    }
    public void hua(){
       HuaJiaA huajiaA = new HuaJiaA();
       huajiaA.hua();    
    }
    public void xie(){
       ZuoJiaA zuojiaA = new ZuoJiaA();
       zuojiaA.xie();    
    }
}
class HuaJia{
    public void hua(){
        Syetem.out.println("画画")    
    }
}
class ZuoJia{
    public void xie(){
        Syetem.out.println("写作")    
    }

 5.局部内部类

        <1>什么局部内部类

局部内部类定义在代码块方法体中

public class Person {
        private static String Contry;
        private String[] sex= {"男","女"};
        public void sleep() {
            //局部内部类
            class People {
                private String name = "xiaoming";

                public void print() {
                    System.out.println("hello");
                }
            }

            People p = new People();
            p.print();
            public void eat () {
            }
        }

<2>局部内部类不能使用public private protect static等访问权修饰符来修饰(只有全局变量才能使用访问权修饰符修饰) 

<3>局部内部类,作用域仅限于当前方法

<4>局部内部类和非静态成员内部类一样,不能有静态成员

<5>局部内部类访问的局部变量必须使用final修饰,Java8之后自动加上

public class Person {
        private static String Contry;
        private String[] sex= {"男","女"};
        
        public void sleep() {
            final int a = 10;
            //局部内部类
            class People {
                private String name = "xiaoming";

                public void print() {
                    System.out.println(a);
                }
            }

            People p = new People();
            p.print();
            public void eat () {
            }
        }

6.匿名内部类 

         <1>匿名内部类.是局部内部类的一种,是没有名字的局部内部类

public static void main(String[] args){
    Person p = new Person{//Person可以是也可以不是抽象类
        public void sleep(){
            System.out.println("学生在睡觉")        
        }    
    };
}

这样写可以少写一个类

<2>匿名内部类使用前提

必须继承一个父类或者实现一个和接口

7.静态成员内部类

如果一个子类只想把了另一个类隐藏起来,而不不想引用外部类对象怎么办,于是出现了静态成员内部类

<1>使用方法

外部类名.内部类名 变量名 = new 外部类名.内部类名()

<2>静态成员内部类,创建实例的时候不必创建外部类对象

<3>静态成员内部类,可以直接访问外部类的静态成员,不能直接访问外部类的非静态方法

<4>在静态成员内部类中可以定义静态和非静态和非静态成员

<5>外部类可以通过完整的类名直接访问内部类的静态成员

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值