什么是面向对象内部类呢?所谓的内部类,即从字面意义上来理解的话,就是把类放到类当中。

那么内部类都有什么特点呢?

1、内部类可以访问包裹他的类的成员。

2、如果包裹他的类想访问被其包裹的类的话就得实例化,才可以访问。

代码示例:

 class Outer
{ int num = ; void show()
{ System.out.println("Outer Show method!!"); } void method()
{ Inner a = new Inner();
a.innerShow(); } static class Inner
{ static final int num = ; void innerShow()
{ System.out.println("The num is "+num);
//show();
staticShow(); } static void staticShow()
{ System.out.println("Static Inner Show"); } } } class Inner
{ void innerShow()
{ System.out.println("The num is "); } } class InnerClassDemo1
{ public static void main(String[] args) { Outer.Inner out = new Outer.Inner();
out.innerShow(); } }

内部类的作用:

  一般用来作为类的设计。

  当我们描述事物的时候,发现其中还有事物,并且这个事物还在访问被描述事物的内容。这个时候就用到了内部类。

内部类还有哪些特点呢?

1、内部类中有静态变量的话,内部类必须是静态的。也就是说内部类可以被修饰符修饰,因为他本身也是类内部的成员。

2、如果想从外部直接调用内部类,必须按照这种方式来调用:

 class InnerClassDemo1
{ public static void main(String[] args) { Outer.Inner inner = new Outer().new Inner();
inner.showInner(); } }

内部类细节注意:

1、this变量,我们知道一个类对象被new之后肯定有一个this与之相关联,那么类当中有内部类的时候,如果单凭一个this的话可能就会造成混淆。我们来写段代码来测试一下:

 class Outer
{ private int num = ; class Inner
{
int num = ;
void showInner()
{ System.out.println("The Outer num is " + this.num);
System.out.println("The Inner num is " + Inner.this.num);
system.out.println("The Oute num is "+Outer.this.num); } } void method()
{ Inner inner = new Inner();
inner.showInner(); } } class InnerClassDemo1
{ public static void main(String[] args) { Outer.Inner inner = new Outer().new Inner();
inner.showInner(); } }

2、为什么内部类能够直接访问外部类的成员呢,因为内部类持有外部类的引用,书写格式就是外部类.this.

内部类的另外一个特点就是,可以放在局部位置上,什么是局部位置呢,形象一点来说的话,就是可以放到函数当中。示例:

 class Outer
{ private int num = ; void method()
{
     int num = 9;//必须用final关键字修饰之后,在Inner但中才可以访问这个值。
class Inner
{
//int x = ;
void show()
{ System.out.println("the num is :"+num); } } Inner inner = new Inner();
inner.show(); } } class InnerClassDemo1
{ public static void main(String[] args) { Outer out = new Outer();
out.method(); } }

内部类在局部位置上只能,访问局部但中由final关键字修饰的局部变量。为什么呢?因为当类在局部的时候,当局部方法进栈之后,变量生成,出栈之后变量消失,如果在方法外调用局部作用域的话,因为方法已经出栈了,那么局部变量已经消失了,释放了。此时若要保证外部能够访问局部位置上的内部类中的调用了局部位置的变量的方法,只能够把局部位置上的局部变量用final修饰成常量,这样才可以供外部访问。java是一门严谨性的语言。

java学习面向对象之内部类的更多相关文章

  1. Java学习---面向对象的远程方法调用[RMI]

    基础知识 分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果. 常见的分 ...

  2. java学习笔记9--内部类总结

    java学习笔记系列: java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对 ...

  3. java学习面向对象之异常之一

    一.异常的概述: 什么是异常?在我们编写java程序的时候,会出现一些问题,比如内存溢出啊或者数组索引超出最大索引啊,这些编程当中出现的这些个问题就是异常.但是异常也分为可以处理的和不可以处理的.比如 ...

  4. Java面向对象之内部类(访问格式)

    一.基础概念 1.内部类是定义在类中的类.A类需要直接访问B类中的成员时,可以将A类定义到B类中,作为B类的内部类存在. 2.内部类可以相当于外部类中的一个成员,可以被成员修饰符所修饰.(如:publ ...

  5. Java面向对象之内部类(匿名内部类)

    一.基础概念 匿名内部类:简化书写的内部类.其实匿名内部类就是一个子类对象. 前提:内部类需要继承或者实现外部的类或者接口. 格式:new 父类或者接口(){定义子类的内容} 二.将内部类定义到局部的 ...

  6. Java学习 面向对象(下)——Java疯狂讲义th4

    面向对象(下) [TOC] 包装类 通过包装类可以把8个基本类型的值包装成对象使用. 自动拆箱.自动装箱 把字符串类型值转换成基本类型的值: 包装类的 parseXxx(String s)静态方法 包 ...

  7. java学习面向对象之匿名内部类

    之前我们提到“匿名”这个字眼的时候,是在学习new对象的时候,创建匿名对象的时候用到的,之所以说是匿名,是因为直接创建对象,而没有把这个对象赋值给某个值,才称之为匿名. 匿名对象回顾: class N ...

  8. Java类成员之内部类

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

  9. Java核心技术点之内部类

    1. 为什么要使用内部类     内部类就是定义在一个类内部的类,那么为什么要使用内部类呢?主要原因有以下几点:第一,内部类中定义的方法能访问到它所在外部类的私有属性及方法:第二,外部类无法实现对同一 ...

随机推荐

  1. linux sed使用

    原文引用:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html [root@www ~]# sed [-nefr] [动作] ...

  2. 关于ASP.Net中路径的问题

    比如你的工程是Webapplication1(url是:http://localhost/webapplication1/webform1.aspx) Request.ApplicationPath ...

  3. dispatchkeyevent的调用机制

    http://blog.csdn.net/look85/article/details/23740761 dispatchKeyEvent和onKeyDown关系: 当键盘按下时 首先触发dispat ...

  4. 如何下载到最新的版本的Oracle Database

    其实这不是一个很困难的事情,但是发现好多同学都不知道,其实只需直接访问Oracle的官网就可以找到,鉴于Oracle经常改到下载面也我这里直接粘贴下载地址 http://www.oracle.com/ ...

  5. .NET下的加密解密大全(3):非对称加密

    本博文列出了.NET下常用的非对称加密算法,并将它们制作成小DEMO,希望能对大家有所帮助. RSA[csharp]static string EnRSA(string data,string pub ...

  6. Eclipse 经验之谈(一):快速打war包

    如何快速打一个war包: 具体步骤:  单击右键[在项目名称上]——>Export -->War File . 完成war包的导出了.嘻嘻

  7. C#中检查网络是否连通的二种方法

    using System;  2 using System.Collections.Generic;  3 using System.Text;  4 //方法一  5 using System.Ru ...

  8. 对有状态bean和无状态bean的理解(转)

    现实中,很多朋友对两种session bean存在误解,认为有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用,而认为无状态是每次调用实例化一次,不保留用户信息.仔细分析并用实践检验后, ...

  9. PHP Ajax简单实例

    最近学习Jquery Ajax部分,通过简单例子,比较了下post,get方法的不同 HTML部分 <html> <head> <title>jQuery Ajax ...

  10. cmd 进入不同的驱动盘及上下级目录

    “开始”=>“运行”,输入”cmd“,此时进入的是系统管理员的等待命令 如果想进入相应的盘符,如 d 盘,则输入 cd d:\,然后再次输入 d: 即可进入 d: 盘,输入两次相当于第二在是询问 ...