最近通过复习面向对象的三大特征,对于一些细节加深了理解,并且希望记录下来,在以后学习复习上能够翻一翻。
面向对象三大特征分别是:封装,继承与多态,在学习封装的时候我习惯把知识点进行分类,分别是:
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外部类对象时,通过对象调用方法即可
以上就是我关于内部类的理解