java基础 -内部类-成员内部类-静态内部类

在 Java 中,内部类(Inner Class) 是定义在另一个类内部的类,用于为外部类提供特定服务。

一、成员内部类

成员内部类无static修饰,属于外部类的对象。

特点:成员内部类可以访问外部类的所有成员,包括私有的。成员内部类可以用外部类名.this拿到当前寄生的外部类的对象。

创建成员内部类

外部类名.内部类名 对象名 = new 外部类名(...).new 内部类名(...)

示例

package InnerclassDemo1;
//外部类
public class Outer {
    //无static修饰,属于外部类的对象
    public static void run(){}
    public void run1(){}
    public class Inner{
        private String name;
        public Inner(){ }       //无参构造器
        //有参构造器
        public Inner(String name){
            this.name = name;
        }
        public void show(){
            System.out.println("外部类调用内部类方法");
            run1();
            run();
            //内部类访问外部类成员,无论是静态方法还是实例方法都可以访问,成员变量同理
            System.out.println(this);        //内部类对象this
            System.out.println(Outer.this);  //外部类对象this
        }

        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
}
package InnerclassDemo1;

public class InnerclassDemo {
    //成员内部类创建对象的格式
    public static void main(String[] args) {
        Outer.Inner oi = new Outer().new Inner();
        oi.show();
        oi.setName("小明");
        //成员内部类访问外部类成员的特点
        //1.成员内部类可以访问外部类的所有成员,包括私有的
        //2、成员内部类的实例方法中,可以拿到当前寄生的外部类对象,外部类名.this

    }
}


class People{
    private int HeartBeat=60;
    public class Heart{
        int HeartBeat=80;
        public void beat(){
            int HeartBeat=90;
            System.out.println("心脏一分钟跳动次数"+HeartBeat);              //访问当前方法的变量
            System.out.println("心脏一分钟跳动次数"+this.HeartBeat);         //访问当前内部类的成员变量
            System.out.println("心脏一分钟跳动次数"+People.this.HeartBeat);  //访问外部类的成员变量
        }
    }
}

上述代码定义了一个Outer类,Inner是其的内部类。内部类可以调用Outer外部类的所有成员(实例成员,静态成员,实例方法,静态方法)。内部类若是有一个与外部类名称与类型相同的成员变量,可以用外部类名.this.变量名在内部类中访问外部类对应的成员变量(如上述代码中的People.this.HeartBeat)。

二、静态内部类

静态内部类有static修饰,属于外部类,因此无法调用外部类的实例方法与实例成员,因为他们属于对象。但静态内部类可以直接访问外部类的静态成员与静态方法。

创建静态内部类

外部类名.内部类名 对象名 = new 外部类名.内部类名(...)

示例

package StaticInnerClassDemo;
//外部类
public class Outter {
    private String id;
    private static String name="CodeBlossom";
    public static void run(){
        System.out.println("外部类run方法");
    }
    public void run1(){
        System.out.println("外部类run1方法");
    }
    //静态内部类
    public static class Inner{
        //静态内部类不能访问外部类的实例成员变量和方法
        private String age;
        public void show(){
            run();
            //run1();
            //System.out.println(id);   //报错,静态内部类不能访问外部类的实例成员变量和方法
            System.out.println("外部类name:"+name);

        }
        public String getAge() {
            return age;
        }

        public void setAge(String age) {
            this.age = age;
        }
    }
}
package StaticInnerClassDemo;

public class StaticInnerClassDemo1 {

    public static void main(String[] args) {
        //认识静态内部类
        Outter.Inner oi = new Outter.Inner();
        oi.show();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值