IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java复习总结(六) 类和对象3 -> 正文阅读

[Java知识库]Java复习总结(六) 类和对象3

目录

一、内部类定义

二、实例内部类

?(1)实例化内部类对象

?(2)在内部类中定义静态成员变量

?(3)成员变量重名问题

(4)注意事项

三、静态内部类?

(1)实例化静态内部类对象

(2)在静态内部类中访问外部类的成员

四、匿名内部类


一、内部类定义

一个类的内部,定义的类叫做内部类

1.实例内部类

2.静态内部类

3.匿名内部类

二、实例内部类

就是在外部类的内部在写一个类

这个例子的外部类是OuterClass,内部类是InnerClass

class OuterClass{
    public int data1 = 10;
    private int data2 = 20;
    public static int data3 = 30;
    class InnerClass{  //实例内部类
        public int data4 = 40;
        private int data5 = 50;
        public InnerClass(){
            System.out.println("InnerClass的构造方法!");
        }
        public void method(){
            System.out.println("InnerClass的一个普通方法!");
        }
    }
}

?(1)实例化内部类对象

外部类名.内部类 变量 = 外部类对象的引用

public class TestDemo {
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();//需要先实例化外部类对象
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        
        //或者一步到位
        OuterClass.InnerClass innerClass1 = new OuterClass().new InnerClass();

    }
}

?(2)在内部类中定义静态成员变量

实例内部类中不能定义静态的成员变量,但要定义 必须是编译的时候确定的值? ?(必须是static final的)因为加上final以后变成常量了 ,意味着编译的时候就确定这个值是几了

内部类中不能定义静态的成员方法,加上final也不行,final只能加在成员变量上


?(3)成员变量重名问题

<1>情况1:在实例内部类中,打印与外部类重名的成员变量

优先使用自己的(即内部类的)

class OuterClass{
    public int data1 = 10;
    class InnerClass{  //实例内部类
        public int data1 = 40;
        public void method(){
            System.out.println(data1);
        }
    }
}
public class TestDemo {
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.method();//结果为40
    }
}

?那如何拿到外部类的呢??

?<2>情况二:当在外部类中,打印与内部类重名的成员变量

优先使用自己的(即外部类的)

class OuterClass{
    public int data1 = 10;
    class InnerClass{  //实例内部类
        public int data1 = 40;
        public void method(){
            System.out.println("这是内部类的方法!!");
            System.out.println(OuterClass.this.data1);
        }
    }
    public void outMethod(){
        System.out.println("这是外部类的方法!!");
        System.out.println(data1);
    }
}
public class TestDemo {
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        outerClass.outMethod();//调用外部类的方法
    }
}

?那如何拿到内部类的呢??


(4)注意事项

1.外部类中的任何成员都可以被在普通内部类方法中直接访问

2. 普通内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束,比如:public InnerClass,private IneerClass

而外部类的修饰限定符只有两个:public和什么都不加


3.在内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this.同名成员来访问

4.普通内部类对象必须在先有外部类对象前提下才能创建

5.普通内部类的非静态方法中包含了一个指向外部类对象的引用


6.外部类中,不能直接访问内部类中的成员,如果要访问必须先要创建内部类的对象。

三、静态内部类?

这个例子中外部类是OuterClass,静态内部类是InnerClass

class OuterClass{
    public int data1 = 10;
    private int data2 = 20;
    public static int data3 = 30;
    public void outMethod(){
        System.out.println("这是外部类的方法!!");
    }
    static class InnerClass{ //静态内部类
        public int data4 = 40;
        private int data5 = 50;
        public static int data6 = 60;
        public void innerMethod(){
            System.out.println("这是静态内部类的方法!!");
        }
    }
}

(1)实例化静态内部类对象

把静态内部类当作静态成员,静态成员不依赖于对象,所以我们要实例化静态内部类对象不需要外部类对象

类名.静态内部类? ?这里的类名是OuterClass

public class TestDemo {
    public static void main(String[] args) {
        OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
        //这里的OuterClass后面没有加(),不是实例化外部对象,是类名的意思
    }
}

(2)在静态内部类中访问外部类的成员

在静态内部类类中,只能访问外部类静态的成员

那么我们如何访问非静态的成员呢??

需要外部类对象来调用它

方法一:

class OuterClass{
    public int data1 = 10;
    private int data2 = 20;
    public static int data3 = 30;
    static class InnerClass{
        OuterClass outer1 = new OuterClass();//此时相当于一个成员变量
        public void innerMethod(){
            System.out.println("这是静态内部类的方法!!");
            System.out.println(outer1.data1);
            System.out.println(outer1.data2);
        }
    }
}
public class TestDemo {
    public static void main(String[] args) {
        OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
        innerClass.innerMethod();
    }
}

方法二:写一个构造方法

class OuterClass{
    public int data1 = 10;
    private int data2 = 20;
    public static int data3 = 30;
    static class InnerClass{
        OuterClass outer;
        InnerClass(OuterClass outer){
            this.outer = outer;
        }
        public void innerMethod(){
            System.out.println(outer.data1);
            System.out.println(outer.data2);
        }
    }
}
public class TestDemo {
    public static void main(String[] args) {
        OuterClass.InnerClass innerClass = new OuterClass.InnerClass(new OuterClass());
        innerClass.innerMethod();
    }
}

四、匿名内部类

匿名内部类不需要详细掌握,掌握以下几点即可

(1)访问匿名内部类的成员变量

(2)调用匿名内部类的方法

(3)定义其他方法

(4)重写匿名内部类的方法

class Test{
    public int a;
    public void test(){
        System.out.println("test()!");
    }
}
public class TestDemo {
    public static void main(String[] args) {
      new Test(){
          
      }.a = 10;//访问a

      new Test(){
          
      }.test();//调用test()方法

      new Test(){
          public void test1(){
              System.out.println("hi");//定义其他方法
          }
      }.test1();

      new Test(){
          @Override
          public void test(){ //重写test()方法
              System.out.println("哈哈哈");
          }
      }.test();
    }
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:11:09  更:2022-04-27 11:14:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:30:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码