关于Java内部类的理解

最近通过复习面向对象的三大特征,对于一些细节加深了理解,并且希望记录下来,在以后学习复习上能够翻一翻。
面向对象三大特征分别是:封装,继承与多态,在学习封装的时候我习惯把知识点进行分类,分别是:

1.什么是分装
2.访问修饰符
3.this关键字
4.内部类

首先提出几个疑问:
1.那么内部类是什么呢?究竟有什么用呢?
在讲内部类的时候就必须讲到封装跟访问修饰符,那么封装是什么呢?跟访问修饰符又有什么关系呢?在类中所定义的一些变量,我们可以将它进行隐藏,封装到类中的一个方法中,在其他类中就无法直接调用该变量了。如果要进行调用属性的话,只需要通过创建对象调用方法来获取、传入变量。当我们需要封装该变量的时候,我们就需要讲该变量定义一个访问修饰符,访问修饰符就是指该变量,该方法,该类的访问范围,有四种访问修饰符:public,protected,默认,private。这四种访问修饰符分别所可以访问的访问范围不同,在我们要对属性进行封装的时候我们需要对其进行定义一个private的访问修饰符。(关于四种访问修饰符的不同本文章不提及)
2.那么内部类有什么作用呢?
刚才讲了内部类跟封装有很大的联系,因为:
(1)内部类将会提供更好的封装,我们可以将属性与方法封装到类中,将内部类隐藏到外部类中,这样在同一包中的不同类中就不可以进行调用了。
(2)当内部类封装到外部类中,内部类可以调用外部类的所有属性与方法,并且包括私有的属性。

内部类的作用就讲到这里,接下来我们讲一讲内部类的类型
内部类主要有四大内部类,分别是:

1.成员内部类
2.静态内部类
3.方法内部类
4.匿名内部类

关于第四个匿名内部类我们先不讲,主要是前三种内部类

1.成员内部类

我们还是通过代码进行理解吧

    package com.xun;
/**
 * 創造一個成員內部類
 * @author XunselF
 *
 */
public class MemberIc {
    private String name = "xun";
    int age = 20;
    public class Inner{
        String name = "xunself";
        public void show(){
                System.out.println("調用外部類的name變量:"+MemberIc.this.name);
                System.out.println("調用外部類的age變量"+age);
                System.out.println("調用內部類的name變量"+name);
            }
        }
    public static void main(String[] args){
            MemberIc I = new MemberIc();
            Inner C = I.new Inner();
            C.show();
        }
    }

在这个代码我们发现,在MemberIc类中定义了一个Inner类
那么这个MemberIc类就是外部类,Inner类就是内部类
成员内部类的特点:

1.在MemberIc类中定义了一个普通的Inner类,如果我们要进行调用Inner内部类方法时,我们就必须要先创建一个MemberIc的外部类对象,再通过外部类对象进行初始化Inner类的内部类对象,最后通过内部类对象进行调用方法
2.如果在MemberIc外部类中定义了一个name变量,在Inner内部类也定义了一个name变量,如果要在Inner内部类方法中使用,就要用外部类名.this.属性名才能进行调用外部类同名属性

2.静态内部类

代码如下:

package com.xun;

public class StaticIc {
    private static int score = 58;
    private int age = 10;
    public static class SInner{
        int score = 20;
        public void show(){
            System.out.println("調用非靜態的age變量:"+new StaticIc().age);
            System.out.println("調用外部類中的score靜態變量:"+StaticIc.score);
            System.out.println("調用靜態內部類中的score變量:"+score);
        }
    }
    public static void main(String[] args){
        SInner S = new SInner();
        S.show();
    }
}

静态内部类的特点:(可以与成员内部类进行对比)

1.StaticIc类是一个外部类,SInner是一个静态内部类,与成员内部类相比,静态内部类无需通过外部类对象进行初始化内部类对象,只需直接创建内部类对象即可
2.在外部类与内部类同名属性问题上,相比成员内部类,静态内部类只需通过外部类名.属性名即可
3.静态内部类有着与其他内部类不一样的特点是:在静态内部类中无法直接使用非静态成员,如果要使用非静态成员,我们需要通过new 外部类名().属性名进行调用

3.方法内部类
代码如下:

package com.xun;

public class WayIc {
    public void print(){
        int score1 = 1;
        class MInner{
            int score = 12;
            public void show(){
                System.out.println(score);
            }
        }
        MInner I = new MInner();
        I.show();
    }
    public static void main(String[] args){
        WayIc C = new WayIc();
        C.print();
    }
}

方法内部类其实很容易理解,它与其他内部类都有所不同
方法内部类的特点主要有:

1.将MInner内部类封装到WayIc外部类中的print()方法中,因为封装在方法里,所以不需要给MInner内部类定义访问修饰符(在方法中不允许定义访问修饰符跟static关键字,因为在方法中定义的变量属于局部变量,在方法外其他地方都无法使用,所以定义了访问修饰符也没有什么意义,但是在eclipse当中这是一个错误)
2.因为MInner内部类定义在方法中,所以除了方法内其他地方都无法调用,所以在方法内要将MInner内部类进行初始化对象,通过对象调用方法,这样在创建WayIc外部类对象时,通过对象调用方法即可

以上就是我关于内部类的理解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值