首先要知道什么是内部类?
就是在一个类中定义一个类,在一个A类中定义一个内部类B,类B就是内部类
代码示例:
public class A{
//类B为内部类
class B{
}
}
那么我们知道了什么是内部类,接下 来就要了解成员内部类的访问特点
在类的成员位置:成员内部类
在类的局部位置:局部内部类
1、内部类可以直接访问外部类的成员,包括私有
public class A {
private int age = 30;
// 类B就是内部类
public class B {
public void number() {
age = 40;
System.out.println(age);
}
}
}
2、外部类要访问内部类的成员,必须创建对象
public class A{
private int age = 30;
public class B{
public void number(){
age = 40;
System.out.println(age);
}
}
//外部内想要访问内部类 则必须创建对象 外部类中定义一个方法
public void numberDemo(){
//直接访问则会报错
number();
//则必须先创建对象
B b = new B();
b.number;
}
}
那么成员内部类,外界如何创建对象使用呢?(public)
public class A{
private int age = 30;
public class B{
public void number(){
age = 40;
System.out.println(age);
}
格式:外部类.内部类 对象名 = 外部类.内部类对象
//测试类
public class test {
public static void main(String[] args) {
//格式:外部类.内部类 对象名 = new 外部类.new内部类;
A.B ab = new A().new B();
ab.number();
}
}
以上格式是不能针对私有内部类的 ,那么私有内部类访问并调用的话我们需要在外部类中创建方法并创建私有内部类的对象并调用进行间接性调用 就并不需要上文那格式
public class A{
private int age = 30;
//私有内部类
private class B{
public void number(){
age = 40;
System.out.println(age);
}
}
//外部内想要访问内部类 则必须创建对象 外部类中定义一个方法
public void numberDemo(){
//则必须先创建对象
B b = new B();
b.number;
}
}
public class test {
public static void main(String[] args) {
//直接创建外部类进行调用
A a = new A();
a.number();
}
}
什么是局部内部类呢?以及局部内部类访问
局部类是在方法中定义的类,所以外界是无法直接使用的,需要在方法内部创建对象并使用,该内部类可以直接访问外部类的成员,也可以访问局部内的局部变量
代码案例:
public class A {
private int age = 30;
public void number() {
int age1 = 40;
class Inner {
public void show() {
System.out.println(age);
//可以访问局部变量
System.out.println(age1);
}
}
// 在方法里面创建对象并使用
Inner I = new Inner();
I.show();
}
}
public class test {
public static void main(String[] args) {
//直接创建外部类进行调用
A a = new A();
a.number();
}
}
什么是匿名内部类?
前提是:存在一个类或者是接口,这里的类可以是具体类也可以是抽象类
本质:是一个继承了该类或者实现了该接口的子类匿名对象
格式:new 类名或者接口名(){
重写方法:
}
范例:new helloword(){
public void run(){
System.out.println("方法");
}
}
我们以接口的形式进行示例
我们创建一个接口 定义一个show()方法
public interface interfaceTest {
void show();
}
我们再定义一个类 在类里面定义一个method方法,并重写show方法;
public class interfaceTestImpl {
public void method(){
new interfaceTest(){
@Override
public void show() {
System.out.println("你好阿,匿名内部类");
}
}.show();
}
}
编写测试类
public class test {
public static void main(String[] args) {
interfaceTestImpl i = new interfaceTestImpl();
i.method();
}