• 【java学习—九】内部类(7)



    1. 概念

        (1)在 Java 中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。
        (2)Inner class 一般用在定义它的类或语句块,在外部引用它时必须给出完整的名称

    注:Inner class 的名字不能与包含它的类名相同。

        (3)Inner class 可以使用外部类私有数据,因为它是外部类的成员,同一个类的成员之间可相互访问。而外部类要访问内部类中的成员需要 : new 内部类.成员或者new 内部类对象.成员

    下面举个例子来说明:

    package day09;
    
    public class Test3 {
    	int i;
    	public int z;
    	private int k;
    	
    	class A {//内部类
    	
    		int i;//内部类可以有自己的属性
    		
    		public void setTest3Fileds() {
    			Test3.this.i = 1;//设置外部类的属性
    			Test3.this.z = 2;
    			Test3.this.k = 3;
    		}
    		
    		public void set() {//内部类可以有自己的方法
    			this.i = 10;
    			}
    	}
    	
    	public void setInfo() {//通过内部类设置外部属性
    		new A().setTest3Fileds();//外部的类要想使用自己的内部类的方法,得先new内部类的对象
    	}
    	
    	public void showInfo() {//显示属性
    		System.out.println(this.i);
    		System.out.println(this.z);
    		System.out.println(this.k);
    	}
    	
    	public static void main(String[] args) {
    		Test3 t = new Test3();
    		t.setInfo();
    		t.showInfo();
    	}
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    2. 内部类特性

    Inner class 作为类的成员:
    (1)可以声明为 final 的
    (2)和外部类不同, Inner class 可声明为 private 或 protected ;
    (3)Inner class 可以声明为 static 的,但此时就不能再使用外层类的非 static 的成员变量;
    Inner class 作为类:
    (1)可以声明为 abstract 类 ,因此可以被其它的内部类继承
    【注意】非 static 的内部类中的成员不能声明为 static 的,只有在外部类或 static 的内部类中才可声明 static 成员。

    核心作用:内部类最大的作用是实现多重继承

    package day09;
    
    public class Test3 {
    	int i;
    	public int z;
    	private int k;
    	
    	//声明内部类:A、B、C、D、E
    	
    	class A {//内部类
    		int i;
    		public void setTest3Fileds() {
    			Test3.this.i = 1;
    			Test3.this.z = 2;
    			Test3.this.k = 3;
    		}
    		
    		public void set() {
    			this.i = 10;
    		}
    	}
    	
    	
    	final class B {//除了声明为final。与外部类不同,内部类还可以声明为private、protected类
    		
    	}
    	
    	
    	static class C {//如果内部类是static的,就不能使用外部类的非static的成员
    		
    	}
    	
    	abstract class D {//可以声明为 abstract 类,被其它的内部类继承
    		
    	}
    	
    	class E extends D {//E类继承D抽象类
    		
    	}	
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    3. 内部类实现多重继承的应用

    内部类主要是解决java不能多重继承的问题

    举例:
    代码如下

    package day09;
    
    public class Test4 {
    	public static void main(String[] args) {
    		A a = new A();
    		a.testB();
    		a.testC();
    	}
    
    }
    /**
     * 现在类A想同时获得类B和类C的方法(java无法进行多继承),并且重写
     * 可以使用内部类来变相的实现类的多重继承,可以继承多个类
     * @author 14532
     *
     */
    
    class A {
    	
    	public void testB() {
    		new InnerB().testB();
    	}
    	
    	
    	public void testC() {
    		new InnerC().testC();
    	}
    	
    	private class InnerB extends B{
    		@Override
    		public void testB() {
    			System.out.println("这是重写之后的testB方法");
    		}
    	}
    	
    	
    	private class InnerC extends C{
    		@Override
    		public void testC() {
    			System.out.println("这是重写之后的testC方法");
    		}
    	}
    
    }
    
    class B {
    	public void testB() {
    		
    	}
    }
    
    class C {
    	public void testC() {
    		
    	}
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    运行结果:

    在这里插入图片描述

  • 相关阅读:
    11 编译2022年最新的Linux kernel 6.1源码,并用QEMU模拟器运行
    一起Talk Android吧(第三百六十四回:多线程之同步块)
    折腾LINUX复古终端
    基于ASP.net的服装商城设计
    【自动化测试】基于Selenium + Python的web自动化框架
    Flink学习笔记(2)——Flink快速上手
    Uniapp 图片编辑插件 Ba-ImageEditor
    自动驾驶行业观察之2023上海车展-----车企发展趋势(3)
    Yolov8小目标检测(26):多尺度空洞注意力(MSDA) | 中科院一区顶刊 DilateFormer 2023.9
    PDE的数值解法(有限元,有限差分法)综合介绍
  • 原文地址:https://blog.csdn.net/weixin_44883789/article/details/134084059