一个类的修饰符
1.Java中源文件可以有多个类,但最多只能有一个public修改,如果有public类,就必须与源文件的名字完全相同.
2.如果源文件中没有public类,那么源文件的名字可以任意取。
3.main()方法不是必须放在public类中才能运行程序
一个类的修改符只能用public或者默认的修饰符
修饰符的作用范围
修饰符 | 所在类 | 同内其他类 | 其他包内子类 | 其他包内非子类 |
---|---|---|---|---|
private | Y | N | N | N |
缺省 | Y | Y | N | N |
protected | Y | Y | Y | N |
public | Y | Y | Y | Y |
内部类的定义
将一个类定义到类的内部,包括这四种:成员内部类,局部内部类,匿名内部类,静态内部类
作用:
1.内部类可以很好的实现隐藏(一般的非内部类,是不允许有private与protected权限的,但内部类可以)
2.内部类拥有外围类的所有元素的访问权限(内部类可以访问外部类的所有方法和属性,包括private)
3.可以实现多重继承(接口虽然可以实现多重继承,但是必须实现所有的方法)
4.可以避免修改接口而实现用一个类中两种同名方法的调用(同一个类中,如果需要定义的方法和实现接口的方法一样,就不行,但是内部类去实现可以避免这样的问题)
成员内部类
成员内部类可以无条件访问外部类的所有成员属性和方法。如果成员内部类拥有和外部类同名的成员变量或方法时,就会默认访问成员内部类的成员,如果要访问外部类的同名成员,就使用:
外部类.this.成员变量
外部类.this.成员方法
public class ClassTest {
private int i = 0;
class Test{
private void Test1(){
}
}
public static void main(String[] args){
System.out.println("这是main方法");
}
}
外部类访问成员内部类:
public class ClassTest {
private int i = 0;
private Test testDemo = null;
class Test{
private void Test1(){
System.out.println(i);
}
}
public Test getTestInstance(){
if(testDemo ==null){
testDemo = new Test();
}
return testDemo;
}
public static void main(String[] args){
System.out.println("这是main方法");
//第一种方法
ClassTest classTest = new ClassTest();
ClassTest.Test test = classTest.new Test();
// Test t1 = new Test(); 这样直接写是不行的
//第二种方法
ClassTest.Test test1 = classTest.getTestInstance();
}
}
因为成员内部类是依附与外围类,是外围类的一个成员,所以只有先创建外围类对象才能创建内部类对象,so 成员内部类不能还static的变量和方法,但是可以有static final 修饰的,也可以集成含static成员的类,如果一个成员内部类只希望被外部类操作,就可以使用private将其声明私有内部类。
局部内部类
局部内部类:他是嵌套在方法和作用域内的,对于这个类的使用主要是应用于解决比较复杂的问题,想创建一个类来辅助我们的方案,但是又不希望这个类的公共可以的,所以就产生了局部内部类。局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。
在方法内定义
public Map destionation(String s){
class Destionation extends HashMap {
private Destionation(String d){
}
}
return new Destionation("ekw");
}
在作用域内被定义
public boolean test2(boolean b){
if(b){
class InnerTest2{
private int d = 0;
}
InnerTest2 innerTest2 = new InnerTest2();
}
//InnerTest2 innerTest2 = new InnerTest2();会报错
return false;
}
匿名内部类
public void test3(){
new Runnable(){
@Override
public void run() {
}
};
}
静态类
静态内部类不能访问非静态的属性和方法
class Outter {
public Outter() {
}
static class Inner {
public Inner() {
}
}
}