关于java中的各种内部类,包含匿名内部类
写在前面:在安卓开发过程中,对于某些刚入门安卓的小白非常不友好,我们经常会遇到代码理解的问题,即在安卓开发对于类的定义并不同于我们在上java课中学到的那样,实际上在安卓开发中,多数是以匿名内部类的方式来实现的,这种类的定义主要是用于我们在初始化某个对象的时候,由于其构造函数的参数是某个接口或者某个类,这时候我们就需要使用匿名内部类,即直接在传参的括号里面new一个相应的类,然后要么就是重写该类的方法(接口就是这样滴,实现接口里面定义的方法),要么就是增加一些新的功能函数。
内部类:内部类就是在一个类的内部定义了一个类,比如,A类中定义一个B类,那么B类相对于A类来说就称为内部类,而A类相对B类来说就是外部类了。
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类(安卓开发多数都是)
下面写代码作展示:
- 成员内部类和静态内部类
A类:
public class A {
private int id;
public void out(){
System.out.println("这是外部类的方法");
}
public (static) class B{ //此处一旦用static修饰,B就是静态内部类,但是会在getAId里面报错,因为静态类的实例化比id定义的早,所以相当于没定义id这个变量就去使用。要想去使用id,就需要把id也静态化。
public void in(){
System.out.println("这是内部类的方法");
}
public void getAId(){
System.out.println(id);
}
}
}
主函数:
public class Main {
public static void main(String[] args) {
A a = new A();
//通过外部类来实例化内部类
A.B b = a.new B();
//调用b中方法
b.in();
//内部类直接访问外部类的私有属性
b.getAId();
}
}
另一种内部类写法:在java文件下再定义一个类,值得注意的是该文件下只能有一个被修饰为public
A类:
public class A {
}
class C{
}
- 局部内部类
public class A {
public void method(){
class Inner{
public void in(){
}
}
}
}
- 匿名内部类(安卓开发多数都是)
public class A {
public static void main(String[] args) {
new Peak().eating();
}
}
class Peak{
public void eating(){
System.out.println("eat");
}
}
通过直接new的方式调用eating(),即省略了对象的传递。
同样的接口也可以这样玩(安卓开发多是这样的代码):
public class A {
public static void main(String[] args) {
UserService ueserService = new UserService() {
@Override(方法重写)
//方法重写就是函数的名字和参数都相同的情况下
//方法重载就是函数名相同但参数不同
public void hello() {
}
};
}
}
interface UserService{
void hello();
}