Java Basics Part 20/20 - Inner Classes
来源:互联网 发布:淘宝耳环好卖吗 编辑:程序博客网 时间:2024/05/16 14:34
Java Basics Part 20/20 - Inner Classes
目录
- Java Basics Part 2020 - Inner Classes
- 目录
- 嵌套类
- 语法
- 非静态内部类
- 内部类
- 访问私有成员
- 方法内部类
- 匿名内部类
- 使用匿名内部类作为参数
- 内部类
- 静态嵌套类
嵌套类
在 Java 中,在类中可以编写另外一个类。类中的类就叫做嵌套类(nested class),包含内部类的类就叫做外部类(outer class)。
语法
编写内部类的语法如下:
class Outer_Demo{ class Nested_Demo{ } }
嵌套类分成两种形式:
- 非静态内部类:这些是类的非静态成员
- 静态内部类:这些是类的静态成员。
非静态内部类
内部类是 Java 安全机制的一种。Java 的类不可以有 private 这种访问级别,但是如果一个类中存在内部类,那么内部类就可以使 private 的了。
根据内部类定义的位置,可以分为三类:
- 内部类
- 方法内部类
- 匿名内部类
内部类
创建一个内部类是很easy的,只需要在类中编写另外一个类即可,但是与普通的类不同,内部类可以是 private 的,一旦将内部类声明为 private,那么在外部类类外部就无法访问这个内部类了。
例如下面这个程序,将内部类定义成 private 的,通过方法访问这个 private 的内部类:
class Outer_Demo{ int num; //inner class private class Inner_Demo{ public void print(){ System.out.println("This is an inner class"); } } //Accessing he inner class from the method within void display_Inner(){ Inner_Demo inner = new Inner_Demo(); inner.print(); }}public class My_class{ public static void main(String args[]){ //Instantiating the outer class Outer_Demo outer = new Outer_Demo(); //Accessing the display_Inner() method. outer.display_Inner(); }}// output This is an inner class.
访问私有成员
内部类还可以用来访问外部类的私有成员。在内部类中,定义一个方法 getValue() 来返回外部类的私有成员,然后第三方的类就可以使用 内部类的 getValue() 方法来访问外部类的私有成员了。
为了实例化内部类,要先实例化外部类,然后使用外部类对象的引用来实例化内部类。
Outer_Demo outer=new Outer_Demo();Outer_Demo.Inner_Demo inner=outer.new Inner_Demo();
下面这个例子表明演示了怎样通过内部类来访问外部类的私有成员:
class Outer_Demo { //private variable of the outer class private int num= 175; //inner class public class Inner_Demo{ public int getNum(){ System.out.println("This is the getnum method of the inner class"); return num; } }}public class My_class2{ public static void main(String args[]){ //Instantiating the outer class Outer_Demo outer=new Outer_Demo(); //Instantiating the inner class Outer_Demo.Inner_Demo inner=outer.new Inner_Demo(); System.out.println(inner.getNum()); }}// outputThe value of num in the class Test is: 175
方法内部类
在 Java 中,我们甚至可以在方法中编写一个类,那么这个类就变成了一个局部类型,就像局部变量一样,这个类的作用范围就是在方法中。
一个方法内部类只能在定义它的方法中实例化。举例:
public class Outerclass{ //instance method of the outer class void my_Method(){ int num = 23; //method-local inner class class MethodInner_Demo{ public void print(){ System.out.println("This is method inner class "+num); } }//end of inner class //Accessing the inner class MethodInner_Demo inner = new MethodInner_Demo(); inner.print(); } public static void main(String args[]){ Outerclass outer = new Outerclass(); outer.my_Method(); }}// outputThis is method inner class 23
匿名内部类
顾名思义,没有名字的类就是匿名内部类,匿名内部类的声明和实例化是同时进行的。一般情况下,当需要重写一个类或者接口的方法时,需要用到匿名内部类。
AnonymousInner an_inner = new AnonymousInner(){ public void my_method(){ ........ ........ } };
下面的例子演示了怎样使用匿名内部类来重写一个类的方法:
abstract class AnonymousInner{ public abstract void mymethod();}public class Outer_class { public static void main(String args[]){ AnonymousInner inner = new AnonymousInner(){ public void mymethod(){ System.out.println("This is an example of anonymous inner class"); } }; inner.mymethod(); }}// outputThis is an example of anonymous inner class
同样,可以使用匿名内部类来重写一个接口实现类的方法。
使用匿名内部类作为参数
一般情况下,如果一个方法接收一个接口/抽象类/具体类的对象作为参数,那么我们就可以实现接口,继承抽象类,然后把对象传递给方法。但是如果它是一个类,那么我们可以直接传递给方法。
针对以上三种情况,均可以传递匿名内部类给方法。下面是语法:
obj.my_Method(new My_Class(){ public void Do(){ ..... ..... }});
使用如下:
//interfaceinterface Message{ String greet(); }public class My_class { //method which accepts the object of interface Message public void displayMessage(Message m){ System.out.println(m.greet() +", This is an example of anonymous inner class as an argument"); } public static void main(String args[]){ //Instantiating the class My_class obj = new My_class(); //Passing an anonymous inner class as an argument obj.displayMessage(new Message(){ public String greet(){ return "Hello"; } }); }}// outputHello This is an example of anonymous inner class as an argument
静态嵌套类
静态内部类就相当于外部类的静态成员。与使用一般静态成员一样,不用实例化外部类就可以访问。同样,静态嵌套类不可以访问外部类的实例变量和实例方法。静态嵌套类的语法如下:
class MyOuter { static class Nested_Demo{ }}
实例化一个静态嵌套类与实例化内部类有点不同,如下:
public class Outer{ static class Nested_Demo{ public void my_method(){ System.out.println("This is my nested class"); } } public static void main(String args[]){ Outer.Nested_Demo nested = new Outer.Nested_Demo(); nested.my_method(); } }// outputThis is my nested class
- Java Basics Part 20/20 - Inner Classes
- Java Basics Part 4/20 - Object & Classes
- Java Basics Part 1/20 - Overview
- Java Basics Part 2/20 - Environment Setup
- Java Basics Part 3/20 - Basic Syntax
- Java Basics Part 5/20 - Basic Datatypes
- Java Basics Part 6/20 - Variable Types
- Java Basics Part 7/20 - Modifier Types
- Java Basics Part 8/20 - Basic Operators
- Java Basics Part 9/20 - Loop Control
- Java Basics Part 10/20 - Decision Making
- Java Basics Part 11/20 - Numbers Class
- Java Basics Part 12/20 - Character Class
- Java Basics Part 13/20 - Strings Class
- Java Basics Part 14/20 - Arrays
- Java Basics Part 15/20 - Date & Time
- Java Basics Part 16/20 - Regular Expressions
- Java Basics Part 17/20 - Methods
- SDUTACM 图的深度遍历
- 多态练习(宠物类)
- 【bzoj 2521】 [Shoi2010] 最小生成树(网络流最小割)
- mysql基础知识
- Android应用中去掉标题栏方法总结
- Java Basics Part 20/20 - Inner Classes
- HTML <br>换行标签
- cocos2dx番外篇——init()和onEnter()方法的区别
- 剑指Offer_20_包含min函数的栈
- Live Archive 4256 Salesmen
- 模糊查询.php
- BZOJ1635 [Usaco2007 Jan]Tallest Cow 最高的牛
- 注册,登录.php
- html5-用css设置导航