我是靠谱客的博主 快乐果汁,最近开发中收集的这篇文章主要介绍java基础——————内部类 静态内部类、成员内部类、匿名内部类,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

内部类包括四种类型:静态内部类,实例(成员)内部类,匿名内部类,本地内部类(不多用)
主要分析前三种内部类的创建以及对象的创建和方法的如何调用

一、静态内部类

1)访问内部类的数据成员和方法

访问内部类数据成员方法: 内部类对象直接调用
内部类对象调用外部类非静态数据成员和方法内部类对象 . 外部类对象. 方法或者变量
在内部类调用外部类静态数据成员或方法: 外部类名直接调用

1)) 通过在内部类中写入一个传入外部类对象的构造函数,以此建立内部类的对象,通过内部类对象调用内部类的数据成员和方法

//
此代码处于内部类中
OuterClass outer;
// 创建一个外部类类型的成员变量
public InnerClass(OuterClass outer) {
//
静态内部类构造方法(传入的是外部类的对象)
this.outer = outer;
}
2))
**创建内部类对象,
内部类对象可以调用内部类对象,此外也可以调用外部类对象和方法**;
public static void
main{
//
创建静态内部类的对象,首先要创建一个外部类对象,把外部类对象传给静态内部类
OuterClass outer=new OuterClass();
OuterClass.InnerClass inner =new OuterClass.InnerClass(outer);
//
>>>>>创建了静态内部类对象 inner
inner.fun();
// 通过静态内部类对象调用内部类的成员方法
inner.outer.eat();//
**通过静态内部类对象调用外部类的成员方法**
}

二、实例内部类(成员内部类)

1:实例内部类中可以可以定义静态变量,但是必须由final 修饰
2:实例内部类不可以定义静态方法;
3: 实例内部类的对象创建方法:
外部类名 .实例内部类名 对象名 =new 外部类名(). new 内部类名();
如果已经有外部对象,则可以写成:
外部类名 .实例内部类名 对象名 =外部类对象 . new 内部类名();

4:在外部类中调用内部类的方法: !!!!外部类不能调用内部类封装的数据或者方法
定义一个内部类类型的变量,然后在外部类中构造方法,new出一个实例,


InnerClass2 in;
//
在外部类定义一个内部类类型的变量
public
OuterClass() {
in= new InnerClass2();
//在外部类中构造方法,new出一个实例,
}
void fun() {
System.out.println(in.data5);
// 调用实例内部类的数据
!!!注意,外部类不能调用内部类封装的数据或者方法
}

4: 在内部类中调用外部类的方法: 使用this关键字: 外部类名.this.外部类变量或方法

 System.out.println(OuterClass.this.data1); //
内部类调用外部类的数据成员或方法要使用this关键字

三、 匿名内部类

1:使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一 个接口。
2:匿名内部类中不能存在任何的静态成员变量和静态方法。
3:当所在的方法的形参需要被内部类里面使用时,该形参必须为final。
格式:
new 外部类名 ( ) {
… 里面可以写方法
} . 外部类里面的方法;

class outer{
void fly() {
System.out.println(" fly ");
}
}
public class testDemo9 {
static void fun(outer chicken){
chicken.fly();
}
public
static void main(String [] args){
new outer(){
void fly() {
//重写了父类的方法
此处可不写代码
System.out.println("fly!!!")
}
}.fly();
}
}

测试代码:(成员内部类和静态内部类)

public class OuterClass {
public int data1;
private int data2;
private static int data3;
{
data1 = 999;
data2 = 888;
data3 = 777;
}
// 外部类调用实例内部类的数据成员需要有实例
InnerClass2 in;
public
OuterClass() {
in= new InnerClass2();
}
void fun() {
System.out.println(in.data5);
// 调用实例内部类的数据
!!!注意,外部类不能调用内部类封装的数据或者方法
}
public void eat() {
System.out.println("
eatting
");
}
//*****************************************静态内部类***********************************************
static class InnerClass {
public int data4;
public int data5;
OuterClass outer;
// 创建一个外部类类型的成员变量
public InnerClass(OuterClass outer) {
//
静态内部类构造方法(传入的是外部类的对象)
this.outer = outer;
}
public void fun() {
// 静态内部类的方法
System.out.println("this is innerclass");
System.out.println(outer.data1); //使用静态内部类调用外部类的非静态数据成员或者方法
outer.eat();
//必须使用传入进来的外部类对象来调用
System.out.println(OuterClass.data3);
//
直接用外部类名调用外部类的静态变量
}
}
// ***********************************实例内部类**************************************************************
public class InnerClass2 {
private int data3 = 100;
public int data5 = 10;
//private static
int DATA4 = 1000;error
private static final int DATA4 = 1000;
// 静态变量必须要拿final修饰
//private static final int DATA5 = data5; error,静态变量必须给实体数据值;
public void InnerClass2() {
//
实例内部类的方法
System.out.println("InnerClass2().init");
System.out.println(OuterClass.this.data1); //
内部类调用外部类的数据成员或方法要使用this关键字
}
}
public static void main(String[] args) {
//*************静态内部类相关***************************************
//
创建静态内部类的对象,首先要创建一个外部类对象,把外部类对象传给静态内部类
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = new OuterClass.InnerClass(outer);
//
>>>>>创建了静态内部类对象 inner
inner.fun();
// 通过静态内部类对象调用内部类的成员方法
inner.outer.eat();//
通过静态内部类对象调用外部类的成员方法
//***************实例内部类相关*********************************************
// 创建实例内部类的对象
//
外部类名 .实例内部类名 对象名 =new 外部类名(). new
内部类名();
// 如果已经有外部对象,可以直接
//
外部类名 .实例内部类名 对象名 =外部对象. new
内部类名();
OuterClass.InnerClass2 inner2 = outer.new InnerClass2();
}
}

测试代码: 匿名内部类

class brid{
void fly() {
System.out.println(" fly ");
}
}
public class testDemo9 {
static void fun(brid chicken){
chicken.fly();
}
public
static void main(String [] args){
new brid(){
void fly() {
//重写了父类的方法
System.out.println("fly!!!");
}
}.fly();
}
}

最后

以上就是快乐果汁为你收集整理的java基础——————内部类 静态内部类、成员内部类、匿名内部类的全部内容,希望文章能够帮你解决java基础——————内部类 静态内部类、成员内部类、匿名内部类所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部