`

Java技术——内部类

阅读更多

内部类 (inner class)

定义:在一个类中定义另外一个类,这个类就叫做内部类。

优点:内部类可以让我们将逻辑上相关的一组类组织起来,并由外部类来控制内部类的可见性。

当我们建立一个内部类时,其对象 就拥有了与外部类对象 之间的一种关系,这是通过一个特殊的this reference形成的,使得内部类对象可以随意的访问外部类中所有的成员。

 

为什么要使用内部类?

1). 在内部类中,可以随意的访问外部类的成员,这可以让我们更好地组织管理我们的代码,增强代码的可读性。

2).内部类可以用于创建适配器类,适配器类是用于实现接口的类。使用内部类来实现接口,可以更好地定位与接口关联的方法在代码中的位置。

3).将内部类设置为私有的,可以隐藏实现的细节。

4).一个方法要继承另一个类且要实现一个接口,并且父类和接口中有一个相同签名的方法,此时,可以用内部类来解决这种问题

 

 

通过以下代码演示,可清楚地了解到如何进行内部类和外部类之间进行访问。

 

1. 在同一类中,从外部类中调用内部类的属性和方法

Outer.java

public class Outer {//外部类
	
	private int member=123; //外部类成员
	 
	private void outerMethod(){//外部类方法
		System.out.println("outer_Method:"+member);
	}
	 
	private class Inner {//内部类
		private int member = 789;//内部类成员
		 
		private void innerMethod(){//内部类方法
			System.out.println("inner_Method:"+member);
		}
	}
	
	public void print (){
		Inner inner = new Inner();
		System.out.println("inner_Member:"+inner.member);
		inner.innerMethod();

	}
	
}

 Test.java

public class Test {//测试类 
	public static void main(String[] args) { 
		Outer outer = new Outer();
		outer.print(); 
	}
}

 结果:

inner_Member:789
inner_Method:789

 

 

2. 在同一类中,从内部类中调用外部类的属性和方法

Outer.java

package main.java.sameclass2;
 
public class Outer {//外部类
	private int member=123; //外部类成员
	 
	private void outerMethod(){//外部类方法
		System.out.println("outer_Method:"+member);
	}
	 
	private class Inner {//内部类
		private int member = 789;//内部类成员
		 
		private void innerMethod(){//内部类方法
			System.out.println("inner_Method:"+member);
		}
		
		private void accessOuter(){//内部类访问外部类
			System.out.println("outer_Member:"+Outer.this.member);
			Outer.this.outerMethod();

		}
	}
	
	public void print (){
		Inner inner = new Inner();
		inner.accessOuter();
	}
}

 

Test.java

package main.java.sameclass2;

public class Test {//测试类 
	public static void main(String[] args) { 
		Outer outer = new Outer();
		outer.print(); 
	}
}

  结果:

outer_Member:123
outer_Method:123

 

3. 在一个类中,调用另一个类中的内部类对象的属性和方法

Outer.java

package main.java.nosameclass1;
 
public class Outer {//外部类
	private int member=123; //外部类成员
	 
	private void outerMethod(){//外部类方法
		System.out.println("outer_Method:"+member);
	}
	 
	public class Inner {//内部类
		private int member = 789;//内部类成员
		 
		private void innerMethod(){//内部类方法
			System.out.println("inner_Method:"+member);
		}
		
		public void accessOuter(){//内部类访问外部类
			System.out.println("outer_Member:"+Outer.this.member);
			Outer.this.outerMethod();
		}
	}
	
	public void print (){
		Inner inner = new Inner();
		inner.accessOuter();
	}
}

 

Test.java

package main.java.nosameclass1;

public class Test {//测试类 
	public static void main(String[] args) { 
		Outer outer = new Outer(); 
		Outer.Inner inner = outer.new Inner();
		inner.accessOuter();

	}
}

  结果:

outer_Member:123
outer_Method:123

 

4. 将一个内部类定义在一个方法中,定义在一个条件名句块中,定义在一个单独的语句块中均可以,但其对外使用的范围也受到相应的限制,不管内部类嵌套的层次有多深,均可以访问外部类的属性及方法。

5. 在方法中定义的内部类,如果要访问方法中定义的本地变量或方法的参数,则变量必须被声明为final.

6. 内部类可以声明为private 或protected;还可以声明为abstract或final.

7. 内部类可以声明为static的,但此时就不能再使用外部类的非static的属性和非静态的方法。

8. 非static的内部类中的属性不能声明为static的,只有最外层或static的内部类中才可以声明static成员。

 

9. 内部类的派生类

    Car.java[外部类和内部类]

package main.java.deriveInnerClass;

public class Car {//汽车类(外部类)
	
	class Driver{//司机类(内部类)
		
	}
	 
}

   CarDriver.java[ 内部类的派生类]

package main.java.deriveInnerClass;

import main.java.deriveInnerClass.Car.Driver;

public class CarDriver extends Driver
 {//派生自内部类(Driver)
	CarDriver(Car car){
		car.super(); //建立内部类与外部类的联系
	}
}

 

 

10. 用内部类实现一个接口

Car.java[接口]

package main.java.anonymous;

public interface Car {
	void run();
	void start();
}

 Audi.java

package main.java.anonymous;

public class Audi {
	class Q7 implements Car
{
		public void run() {
			System.out.println("Q7:run");
		}
		public void start() {
			System.out.println("Q7:start");
		}
	}
	Car getCar(){
		 return new Q7();
	}
}

 Test.java

package main.java.anonymous;

public class Test {
	public static void main(String[] args) {
		Audi audi = new Audi();
		audi.getCar().start();
		audi.getCar().run();
	}
}

 结果:

Q7:start
Q7:run

 

11. 匿名的内部类:

Car.java[接口]

package main.java.anonymous;

public interface Car {
	void run();
	void start();
}

 Audi.java

package main.java.anonymous;

public class Audi {
	class Q7 implements Car{
		public void run() {
			System.out.println("Q7:run");
		}
		public void start() {
			System.out.println("Q7:start");
		}
	}
	Car getCar(){
	    // return new Q7();
            return new Car(){//匿名的内部类
			public void run() {
				System.out.println("Q8:run");
			}

			public void start() {
				System.out.println("Q8:start");
			}
	     };

      }
}

 Test.java

package main.java.anonymous;

public class Test {
	public static void main(String[] args) {
		Audi audi = new Audi();
		audi.getCar().start();
		audi.getCar().run();
	}
}

 结果:

Q8:start
Q8:run

 

 

 

 

 

 

分享到:
评论

相关推荐

    Java之——类热加载

    Java之——类热加载 在Java编程中,类的加载是程序运行的重要环节。传统的Java应用程序在启动时,由JVM(Java虚拟机)通过类加载器将类加载到内存中,一旦加载完成,除非程序退出,否则这些类通常不会被重新加载。...

    IBM java培训内部资料——Java 常用类讲解.pptx

    IBM java培训内部资料——Java 常用类讲解.pptx

    精通JAVA——JDK(高清PDF文件)

    4. **JVM内部机制**:了解Java虚拟机(JVM)的工作原理,包括类加载、内存管理、垃圾回收以及性能优化策略,这有助于编写出更加高效和稳定的代码。 5. **Java开发工具**:讲解JDK自带的工具,如javac编译器、...

    详细分析Java内部类——局部内部类

    Java内部类之局部内部类 Java内部类是一种特殊的类,它可以嵌套在其他类中,今天我们主要介绍Java局部内部类的相关知识,了解局部内部类...局部内部类是一种非常有用的技术,可以使我们的代码更加简洁、易读和可维护。

    09_Java Web——Request&Response案例

    Java Web开发是构建Web应用程序的一种常见方式,它主要基于Java技术栈。在"09_Java Web——Request&Response案例"这个主题中,我们聚焦于HTTP请求和响应这两个核心概念,它们是Web应用中客户端与服务器交互的基础。...

    Java SE 静态内部类的使用(csdn)————程序.pdf

    Java SE中的静态内部类是一种特殊的内部类,它与非静态内部类(也称为成员内部类)有着显著的区别。静态内部类并不需要外部类的实例来创建它的对象,而是可以直接通过类名进行实例化,就像普通的类一样。在给定的...

    java面试——杭州-阿里云-Java中级.zip

    这个压缩包文件“java面试——杭州-阿里云-Java中级.zip”包含了一份详细的PDF文档,它可能涵盖了面试中常遇到的问题、技术要点以及解决策略。以下是基于Java中级工程师面试的一些关键知识点: 1. **基础语法**:...

    Java并发——无锁实现

    在Java并发编程中,无锁实现是一个高级技术,它可以让多个线程在没有使用传统锁机制(如synchronized关键字或显示锁Lock)的情况下,安全地执行对共享资源的操作。无锁机制主要依赖于硬件的原子指令,尤其是比较并...

    深入java虚拟机——applet 演示

    在深入Java虚拟机的光盘中,可能包含了一系列关于JVM内部机制的文档、示例代码和演示程序,这些内容有助于开发者理解JVM的工作方式以及如何优化Java代码。其中,"Inside JVM"可能是一个详细的指南,涵盖了类加载机制...

    java面试——深圳-商汤科技-Java高级.zip

    4. **JVM优化**:熟悉JVM内部结构,包括类加载机制、运行时数据区、字节码执行引擎等。理解并能运用JVM调优工具(如jconsole、VisualVM等),进行参数调整以提升系统性能。 5. **设计模式**:设计模式是软件开发的...

    java面试——SpringCloud面试专题.zip

    这份"java面试——SpringCloud面试专题.zip"资源很可能包含了关于Spring Cloud的深度面试指南,旨在帮助求职者准备Spring Cloud相关的技术问题。以下是对Spring Cloud关键知识点的详细解析: 1. **Spring Cloud概述...

    java面试——杭州-蚂蚁金服-Java高级.zip

    在Java高级面试中,杭州的蚂蚁金服公司通常会考察候选人的深度技术理解、实际问题解决能力和项目经验。这份"java面试——杭州-蚂蚁金服-Java高级.zip"压缩包包含了一份详细的PDF文档,旨在帮助求职者准备这些面试。...

    Java 开发--基于JSP技术的猎头公司管理软件的设计和实现——内部事务部分(源代码+论文).rar

    《基于JSP技术的猎头公司管理软件设计与实现——内部事务部分》是针对现代猎头公司的业务流程,采用Java开发技术,结合JSP(JavaServer Pages)进行的一次实践性项目开发。该项目旨在构建一个高效、易用的管理平台,...

    Java学习笔记——良葛格

    JDK5.0引入了一些重要的新特性,例如自动内存管理的垃圾回收机制、枚举类型、匿名内部类、泛型以及增强的for循环(也称为foreach循环)。这些特性极大地提升了Java的可读性和实用性。 此外,笔记可能还会涉及异常...

    基于JSP技术的猎头公司管理软件的设计和实现——内部事务部分(源代码+论文)_jsp_java源程序代码.rar

    《基于JSP技术的猎头公司管理软件设计与实现——内部事务部分》 在现代商业环境中,猎头公司扮演着连接企业与人才的关键角色。为了提高业务效率和管理水平,开发一款基于JSP技术的猎头公司管理软件显得尤为重要。本...

    基于JSP技术的猎头公司管理软件的设计和实现——内部事务部分(源代码+设计说明书).zip

    【标题】中的“基于JSP技术的猎头公司管理软件的设计和实现——内部事务部分”表明,这是一个关于使用JavaServer Pages (JSP) 技术开发的管理软件项目,主要关注的是猎头公司的内部事务处理。JSP是Java平台上的一个...

    Java知识——精华总结(1).doc

    ### Java知识精炼总结 #### 一、Java概述与基础知识 **1....** 编程是指通过编写计算机程序来实现特定...以上总结了Java的一些基础概念和技术要点。接下来的部分将深入探讨更多高级主题,如异常处理、线程、集合框架等。

    毕业设计基于JSP技术的猎头公司管理软件的设计和实现——内部事务部分(源代码+论文).zip

    《基于JSP技术的猎头公司管理软件设计与实现——内部事务部分》 本文将深入探讨一个毕业设计项目,即采用JavaServer Pages (JSP) 技术开发的猎头公司管理软件,主要关注其内部事务处理部分。JSP是一种在服务器端...

    Java案例——随机抽取幸运观众.zip

    Java提供了`java.util.Random`类,它能够生成0到最大值(包括0但不包括最大值)之间的伪随机数。我们可以通过构造函数传入种子值来初始化`Random`对象,或者直接使用默认种子。然后,我们可以调用`nextInt()`方法...

Global site tag (gtag.js) - Google Analytics