以下只讨论用public,private,protected,friend修饰的类的public,private,protected,friend方法,不涉及静态类等情况.
一,classB要调用classinnerA的方法,首先要在classB处创建classinnerA的实例,classinnerA是classA的内部类,区别对待classB和classA属于同一程序集和不属于同一程序集的情况.
(一),classA和classB属于同一程序集
(1)如果在classA里classinnerA这样定义:
public class classinnerA
那么,可创建.
(2)如果在classA里classinnerA这样定义
friend class classinnerA
那么,可创建.
(3)如果在classA里classinnerA这样定义
protected class classinnerA
那么,如果classB 是classA的子类,那么可创建,否则,不可创建.
(4)如果在classA里classinnerA这样定义
private class classinnerA
那么,不可建立
(二),classA和classB不属于同一程序集
(1)如果在classA里classinnerA这样定义:
public class classinnerA
那么,可创建.
(2)如果在classA里classinnerA这样定义
friend class classinnerA
那么,不可创建.
(3)如果在classA里classinnerA这样定义
protected class classinnerA
那么,如果classB 是classA的子类,那么可创建,否则,不可创建.
(4)如果在classA里classinnerA这样定义
private class classinnerA
那么,不可建立
二,如果已经建立了classinnerA的实例,假设定义为classinnera,接下来可以根据classinnerA中方法前的访问修饰符,来判断哪些方法可以调用了.同样区分classA和classB是否属于同一程序集.
(一)classA和classB属于同一程序集
(1)如果classinnerA中的方法这样定义:
public sub aaa()
那么,可调用,即classinnera.aaa()
(2)如果classinnerA中的方法这样定义:
friend sub aaa()
那么,可调用
(3)如果classinnerA中的方法这样定义:
protected sub aaa()
那么,如果classB 是classinnerA的子类,那么可调用,否则,不可调用.
(4)如果classinnerA中的方法这样定义:
private sub aaa()
那么,不可调用
(一)classA和classB不属于同一程序集
(1)如果classinnerA中的方法这样定义:
public sub aaa()
那么,可调用,即classinnera.aaa()
(2)如果classinnerA中的方法这样定义:
friend sub aaa()
那么,不可调用
(3)如果classinnerA中的方法这样定义:
protected sub aaa()
那么,如果classB 是classinnerA的子类,那么可调用,否则,不可调用.
(4)如果classinnerA中的方法这样定义:
private sub aaa()
那么,不可调用
结论:
以上红色和兰色字代表不同的地方.
1,只有内部类才能用protected和private来定义.
2,分清类的访问修饰符和方法的访问修饰符的区别.
3,内部类(classinnerA)的访问修饰符的理解成外部类(classA)的一个方法的访问修饰符.
4,classinnerA的访问由使用classinnerA的类(classB)和classA的关系确定.
5,aaa()的访问由使用aaa()的类(classB)和classinnerA的关系确定.