java基础学习——内部类、抽象类、接口

时间:2023-02-24 20:36:48

一、内部类

内部类是静态(static)的,可以使用public、private、protected访问控制符,外部类只能使用public和默认。

内部类分为:成员内部类,局部内部类,匿名内部类。

使用内部类的主要原因有:

内部类可以访问外部类中的数据,包括私有的数据。

内部类可以对同一个包中的其他类隐藏起来。

当想要一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。

减少类的命名冲突。


1、成员内部类:

在外部类内部直接定义(不在方法内部或代码块内部)的类就是成员内部类,它可以直接使用外部类的所有变量和方法,即使是private的。外部类想要访问内部类的成员变量和方法,则需要通过内部类的对象来获取。

public class outer{

private class inner{

}

}

成员内部类可以使用各种修饰符,包括public、protected、private、static、final和abstract,也可以不写。

若有static修饰符,就为类级,否则为对象级。类级可以通过外部类直接访问,对象级需要先生成外部的对象后才能访问。

非静态内部类中不能声明任何static成员。

内部类间可以相互调用,例如:

class a{

class b{}

class c{}    //b、c间可以互相调用

}

成员式内部类的访问

实例化内部类对象,要先实例化外部类对象(outObjectName.new).如下所示:

Outer outer=new Outer();

Outer.Inner inner=outer.new Inner();

static 内部类相当于外部类的static成员,可以直接创建,如下:

Outer.Inner inner=new Outer.Inner();

由于内部类可以直接访问外部类的成分,因此当内部类与其外部类中存在同名属性或方法时,也将导致命名冲突。所以在多层调用时要指明,如下所示

public class Outer{

private int size;

public class Inner{

private int size;

public void dostuff(int size){

size;  //局部变量 size

this.size;  //内部类的 size

Outer.this.size++

}

}

}

2、局部内部类

局部内部类是定义在代码块中的类。它们只在定义它们的代码块中是可见的。

局部内种类有几个重要特性:

1)仅在定义了它们的代码块中是可见的;

2)可以使用定义它们的代码块中的任何局部final变量;

3)局部类不可以是static的,里面也不能定义static成员;

4)局部类不可以用public 、private、protected修饰,只能使用缺省的;

5)局部类可以是abstract的。


3、匿名内部类

只给出方法定义而不具体实现的方法被称为抽象方法,抽象方法是没有方法体的,在代码的表达上九是没有“{}”。包含一个或多个抽象方法的类也必须被声明为抽象类。


使用abstract修饰符来表示抽象方法和抽象类。


抽象类不能被实例化,抽象方法必须在子类中实现。


一个有抽象方法的类必定是抽象类,一个抽象类中不一定有抽象方法


在下列情况下,一个类将成为抽象类:

1)当一个类的一个或多个方法是抽象方法时;

2)当类是一个抽象类的子类,并且不能成为任何抽象方法提供任何实现细节或方法主题时;

3)当一个类实现一个借口,并不能为任何抽象方法提供实现细节或方法主体时;


二、接口

在抽象类中,可以包含一个或多个抽象方法;但在接口中(interface)中所有的方法必须都是抽象的,不能有方法体。

接口中声明的变量默认都是public static final的,必须显示的初始化。在常量声明时可以省略这些修饰符。


接口有其自身的一些特性,如下:

1)接口中只能定义抽象方法,这些方法默认为public abstract的,在声明方法时可以省略这些修饰符。试图在接口中定义实例变量、非抽象的实例方法及静态方法,都是非法的。

public interface demo{

public int a ;//编译出错,a被看做静态常量,必须显示初始化。

protected void write();//编译出错,必须是public类型。

public static String read (){//编译出错,接口中不能包含静态方法。

return “数据”;//编译出错,接口中只能包含抽象方法。

}

}

2)接口中没有构造方法,不能被实例化。

3)一个接口不能实现另一个接口,但可以继承多个其他接口。接口的多继承弥补了类的单继承。



接口的使用

接口不能直接使用new关键字来构建实例。


接口必须通过类来实现(implements)它的抽象方法,然后再实例化类。类实现接口的关键字为implements.


如果一个类不能实现该接口的所有抽象方法,那么这个类必须被定义为抽象类。


不允许创建接口的实例,但允许定义接口类型的引用变量,该变量指向了实现接口的类的实例。


一个类只能继承一个父类,但却可以实现多个接口。