final,权限,内部类
1.final
- final: 不可改变。可以用于修饰类、方法和变量。
- 类:被修饰的类,类的内容不能被更改,不能被继承,不能被子类覆盖重写。
- 方法:被修饰的方法,不能被重写。
注意:abstract和final不能同时存在,因为一个必须被覆盖重写,一个不能被覆盖重写,不能共存。
- 变量:被修饰的变量,不能被重新赋值。
局部变量:没有默认值,可以分两部赋值,但只能被赋值一次。
注意:对于基础型变量,数值不可改变
对于应用型变量,地址不可改变
//第一种赋值方法 final int num; num = 5; //第二种赋值方法 final int num = 5;
成员变量:含有默认值0,但是使用final后就不再拥有默认值,只能一次手动赋值或者构造方法赋值,且必须所有重载的构造方法都必须进行赋值。
//手动赋值 final int num = 0; //构造方法赋值 final int num; public 类名(){ this.num= num; }
2.权限
public | protected | default | private | |
---|---|---|---|---|
同类(自己) | YES | YES | YES | YES |
同包(邻居) | YES | YES | YES | NO |
子类,不同包(儿子) | YES | YES | NO | NO |
不同包,不同类(陌生人) | YES | NO | NO | NO |
总结:
- 只能自己使用,private
- 只能同包使用,默认不写
- 只能子类使用,protected
- 公共使用,public
3.内部类
3.1成员内部类
定义格式:
修饰词 class 外部类名称{
修饰词 class 内部类名称{
}
}
注意事项:
- 内用外,直接用
- 外用内,必须创造对象,使用方法调用
3.1.1 成员内部类的使用
-
间接使用:通过外部类方法,间接调用内部类
-
直接使用:创建内部类对象
外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称()
3.1.2内部类变量重名的使用
- 局部变量:直接使用变量名
- 成员变量:this.变量名
- 外部变量:外部类名称.this.变量名
3.2局部内部类
- 在类的方法中创建类
定义格式:
内部类名称{
}
}
}
3.2.1局部内部类的调用
- 由于局部内部类在方法内定义,只能在方法内部调用
- 需要在方法内创建对象,然后在方法内由对象调用
3.3外部,内部类的权限使用
- 外部类:public/不写(default)
- 成员内部类:public>protected>default>private
- 局部内部类:不写
3.3.1局部内部类访问局部变量
- 局部内部类访问局部变量,必须保证局部变量是final类型,不可改变,在jdk8中,final可以省略
原因:由于局部变量在栈中,局部内部类在堆中,当方法执行完毕,局部变量出栈,但是栈中的局部变量需要等到垃圾回收才会消失,为了保证局部内部类得到的局部变量准确,局部变量不可以改变。.
3.4匿名内部类
-
必须有一个父类(接口)
-
当父类(接口)的实现类只需要使用一次时,可以使用匿名内部类对父类(接口)进行重写创建)
定义格式:
接口名称 对象名=new 接口名称(){ //覆盖重写的抽象方法 }
对代码进行解析:
- new代表创建对象的动作
- 接口名称就是匿名内部类需要实现哪个接口
- {…}这才是匿名内部类的内容
注意事项:
- 匿名内部类,在【创建对象】的时候,只能使用唯一一次。如果希望多次创建对象,而且类的内容一样的话,那么就必须使用单独定义的实现类了
- 匿名对象,在【调用方法】的时候,只能调用唯一一次.如果希望同一个对象,调用多次方法,那么必须给对象起个名字。
- 匿名内部类是省略了【实现类/子类名称】,但是匿名对象是省略了【对象名称】,匿名内部类和匿名对象不是一回事!
4.使用类作为成员变量类型
- 类也可以作为成员变量,例如String
- 类作为成员变量传参时必须创建对象传入
- 类作为成员变量传出参数是必须调用类的方法
5.使用接口作为成员变量类型
- 接口也可以作为成员变量,需要先创建一个接口
- 参数的传入可以使用实现类,也可以使用匿名对象