Java中的内部类介绍(1)

栗子1:
package campu;
//外部类
class Out{
private int age =12;
//内部类
class In{
public void print(){
System.out.println(age);
}
}
}
public class YoYo {
public static void main(String[] args) {
Out.In in=new Out().new In();
in.print();
//或
/*
Out out=new Out();
Out.In in2=out.new In();
in.print();
*/ }
}
内部类:一个类中包含着另外一个类;
内部类可以随意使用外部类的成员变量(包括私有)而不用生成外部类的对象,这也是内部类的唯一优点;
程序编译过后会产生两个.class文件,分别是Out.class和Out$In.class 其中$代表了上面程序中Out.In中的那个 . Out.In in = new Out().new In()可以用来生成内部类的对象,这种方法存在两个小知识点需要注意 1.开头的Out是为了标明需要生成的内部类对象在哪个外部类当中 2.必须先有外部类的对象才能生成内部类的对象,因为内部类的作用就是为了访问外部类中的成员变量
栗子2:
package campu;
//外部类
class Out{
private int age =12;
//内部类
class In{
private int age=13;
public void print(){
int age=14;
System.out.println("局部变量:"+age);
System.out.println("内部类变量:"+this.age);
System.out.println("外部类变量:"+Out.this.age);
}
}
}
public class YoYo {
public static void main(String[] args) {
Out.In in=new Out().new In();
in.print();
//或
/*
Out out=new Out();
Out.In in2=out.new In();
in.print();
*/ }
}
从栗子2中可以发现,内部类在没有同名成员变量和局部变量的情况下,内部类会直接访问外部类的成员变量,而无需指定Out.this.属性名
否则,内部类中的局部变量会覆盖外部类的成员变量
而访问内部类本身的成员变量可用this.属性名,访问外部类的成员变量需要使用Out.this.属性名
静态内部类:
栗子:
package campu;
//外部类
class Out{
private static int age =12;
//内部类
static class In{
public void print(){
System.out.println(age); }
}
}
public class YoYo {
public static void main(String[] args) {
Out.In in=new Out.In();
in.print();
}
}
可以看到,如果用static 将内部内静态化,那么内部类就只能访问外部类的静态成员变量,具有局限性
其次,因为内部类被静态化,因此Out.In可以当做一个整体看,可以直接new 出内部类的对象(通过类名访问static,生不生成外部类对象都没关系)
私有内部类:
栗子:
package campu;
//外部类
class Out{
private int age =12;
//内部类
private class In{
public void print(){
System.out.println(age); }
}
public void outPrint(){
new In().print();
}
}
public class YoYo {
public static void main(String[] args) {
Out out=new Out();
out.outPrint();
}
}
如果一个内部类只希望被外部类中的方法操作,那么可以使用private声明内部类
上面的代码中,我们必须在Out类里面生成In类的对象进行操作,而无法再使用Out.In in = new Out().new In() 生成内部类的对象
也就是说,此时的内部类只有外部类可控制
如同是,我的心脏只能由我的身体控制,其他人无法直接访问它
方法内部类:
栗子:
package campu;
//外部类
class Out{
private int age =12;
public void Print(final int x){
//内部类
class In{
public void print(){
System.out.println(x);
System.out.println(age);
}
}
new In().print();
}
}
public class YoYo {
public static void main(String[] args) {
Out out=new Out();
out.Print(6);
}
}
在上面的代码中,我们将内部类移到了外部类的方法中,然后在外部类的方法中再生成一个内部类对象去调用内部类方法
如果此时我们需要往外部类的方法中传入参数,那么外部类的方法形参必须使用final定义
至于final在这里并没有特殊含义,只是一种表示形式而已。
Java中的内部类介绍(1)的更多相关文章
- 15、java中的内部类介绍
内部类顾名思义就是定义在类中的类,下面做一个简单介绍: 内部类的访问规则:1,内部类可以直接访问外部类中的成员,包括私有. 之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式 ...
- 【转】Java中的内部类和匿名类
Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的 ...
- Java中的内部类怎么用
一.为什么需要内部类?java内部类有什么好处?为什么需要内部类? 首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时 ...
- Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)
Java中的内部类(成员内部类.静态内部类.局部内部类.匿名内部类) 神话丿小王子的博客主页 我们先看这样一段话:人是由大脑.肢体.器官等身体结果组成.而组成我们人体的心脏它也有自己的属性和行为(血液 ...
- Java 中的内部类
前言 在第一次把Java 编程思想中的内部类这一章撸完后,有点印象.大概知道了什么时内部类,局部内部类,匿名内部类,嵌套内部类.随着时间的推移,自己慢慢的就忘记了,总感觉自己思考的东西不多,于是 看了 ...
- Java中的 内部类(吐血总结)
1. 内部类的作用 内部类是一个独立的实体,可以用来实现闭包:能与外部类通信:内部类与接口使得多继承更完整 2. 内部类的分类 1)普通内部类 类的实例相关,可以看成是一个实例变量.内部类的类名由 “ ...
- Java学习笔记二十:Java中的内部类
Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...
- 【转】java中Thread类方法介绍
原文: java中Thread类方法介绍 http://blog.csdn.net/seapeak007/article/details/53395609 这篇文章找时间分析一下!!!:http:// ...
- java中ThreadPool的介绍和使用
文章目录 Thread Pool简介 Executors, Executor 和 ExecutorService ThreadPoolExecutor ScheduledThreadPoolExecu ...
随机推荐
- erlang的token值加解密
对于加解密,需客户端和服务器制定好对应的规则(如:加密算法(aes,des等).加密模式(cbc,cfb)),去加密,再按逆序列解密.这里的key是根据数字.大小写字母.符合组合的,每次请求获取一个动 ...
- attr/attrs模块
attr简介 开源库,提供了为函数或类提供更直接的创建属性的方法. Github or PyPi 用法 from attr import attrs, attrib @attrs class Foo: ...
- UIWebView使用中的内存相关问题
本文转载至: http://blog.csdn.net/musou_ldns/article/details/7675589 applicationios5webkit测试cacheios 在iO ...
- [转]C#中的结构体与类的区别
C#中的结构体与类的区别 经常听到有朋友在讨论C#中的结构与类有什么区别.正好这几日闲来无事,自己总结一下,希望大家指点. 1. 首先是语法定义上的区别啦,这个就不用多说了.定义类使用关键字cla ...
- 九度OJ 1010:A + B (字符串处理)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7166 解决:3646 题目描述: 读入两个小于100的正整数A和B,计算A+B. 需要注意的是:A和B的每一位数字由对应的英文单词给出. ...
- html乱码怎问题
大家会不会常常遇到中文乱码的情况?html中文乱码问题该怎么调? <标签名 lang=lang> - 指定语言种类 lang 属性能够指定标签范围内的元素的语言种类. 英语lang=&qu ...
- PHP获取 当前页面名称、主机名、URL完整地址、URL参数、获取IP
$URL['PHP_SELF'] = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : (isset($_SERVER['SCRIPT_NAME ...
- gradle 与 gradlew
配置好gradle环境变量后(配置环境变量这里就不说了,可以自行百度),我们就可以在cmd中使用gradle命令了 在cmd中输入: gradle -v 输出如下: 这时说明gradle的环境变量配置 ...
- 小米系列手机调试Installation failed with message Failed to establish session
用Android studio 2.3调度程序时提示"Installation failed with message Failed to establish session"错误 ...
- JS继承的实现方式
JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一.那么如何在JS中实现继承呢?让我们拭目以待. JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如下: // 定义一个动物类 ...