Java学习--内部类(一)
Java学习--内部类(一)
一. 内部类的定义和特点
class Outer{
privite int num = 5;
class Inner{
public void Display(){
System.out.println(num);
}
}
public void method(){
Inner i = new Inner();
i.Display();
}
}
这里写了一个类Outer,它有一个私有变量,一个成员方法method(),和一个内部类Inner。在内部类Inner中访问了外部类Outer的私有变量。内部类是这样定义的:
把类定义在其他类的内部,这个类就被称为内部类,比如上例中的Inner。
内部类的访问特点是:
内部类可以直接访问外部类的成员,比如上例中的num,包括私有;外部类要访问内部类的成员,必须创建内部类对象。
内部类的分类:
* 成员内部类
* 局部内部类
二. 成员内部类
首先说一下成员内部类和局部内部类的区别。
class Outer{
privite int num = 5;
// 成员位置
class Inner{
}
public void method(){
//局部位置
class Inner2{
}
}
成员位置:在成员位置定义的类,被称为成员内部类,如 class Inner。
局部位置:在局部位置定义的类,被称为局部内部类,如class Inner2。
如何访问成员内部类的成员呢?这里直接给出答案: 外部类名.内部类名 对象名 = 外部类对象.内部类对象
class Outer{
privite int num = 5;
class Inner {
public void Display() {
System.out.println(num);
}
}
}
class InnerDemo{
public static void main(String[] args) {
// 需要访问Inner类Display方法
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
对于成员内部类,必须通过一级一级的类进行访问。
成员内部类的修饰符private和static。
private是为了数据的安全性。当内部类里的成员变量和方法不想让外部类或者其他人访问时,将内部类声明为private即可。这时的就要将内部类的实例化放在外部类中。
class Computer {
private class Cpu {
public void operator() {
System.out.println("更改CPU");
}
}
public void method() {
if(管理者) {
Cpu c = new Cpu();
c.operator();
}
}
}
这样当我们要访问内部类Cpu中的operator方法时,因为不是任何一个人都可以更改cpu,就将内部类声明为私有的,我们也不能通过上面讲的外部类名.内部类名 对象名 = 外部类对象.内部类对象来访问,因为这个成员内部类是private,私有的,不允许外部类的对象来访问这个private的Cpu类。这时就可以通过在Computer内部声明一个成员方法来实现内部类的实例化,在Computer类的内部来访问这个私有的内部类。
static是为了方便访问数据。这里需要注意的是静态内部类访问的外部类数据必须是静态类型的。
class Outer {
private static int num = 10;
public static class Inner {
public void show() {
System.out.println(num);
}
}
public static void show2() {
System.out.println(num2);
}
}
这里要访问内部类里的show方法就外部类名.内部类名 对象名 = new 外部类名.内部类名(),即Outer.Inner o = new Outer.Inner(),因为内部类就是相当于一个成员方法,所以这里外部类Outer不需要实例化就可以直接调用.Inner(),即new Outer.Inner();当我们要访问show2()方法时,直接Outer.Inner.show2(),因为都是静态的。
三. 局部内部类
局部内部类的定义在上面已经说过。
class Outer {
private int num = 10;
public void method() {
class Inner {
public void show() {
System.out.println(num);
}
}
Inner i = new Inner();
i.show();
}
}
class InnerDemo {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
在上例中可以看出:
* 局部内部类可以直接访问外部类的成员
* 在局部位置,可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能
局部内部类还有一个重要的特点需要知道。那就是局部内部类访问局部变量时,局部变量需要用final关键字修饰。
class Outer{
private int num = 10;
Object method() {
final int num2 = 20;
class Inner {
public void show() {
System.out.println(num);
System.out.println(num2);
}
}
Inner i = new Inner();
return i;
}
}
final关键字表示最终类型。如果不加final关键字,当函数执行完毕后,局部变量就消失了,但类产生的对象i是在堆上,这样对象就访问了一个不存在的变量。这是编译不通过的。这种矛盾是由局部内部类可以访问局部变量但是局部内部类对象和局部变量的生命周期不同而引起的。
Java学习--内部类(一)的更多相关文章
- java学习——内部类(一)
内部类 把一个类放在另一个类中定义,这个定义在其他内部的类被称为内部类,包含内部类 的类被成为外部类,Java从JDK1.1开始引入了内部类的定义. 内部类的作用: 内部类提供了更好的封装,可以把内部 ...
- Java学习——内部类
内部类的访问规则:1,内部类可以直接访问外部类中的成员,包括私有. 之所以可以直接访问外部类中的成员,是因为内部类中持有了 一个外部类的引用,格式 外部类名.this2,外部类要访问内部类,必须建立内 ...
- java学习——内部类(二)
使用内部类 内部类一共有三种使用方法: 1.在外部类中使用内部类 在外部类中使用内部类,与平常使用内部类没有区别,可以直接通过内部类的类名来定义变量,通过new调用内部类的构造方法来创建实例. 唯一的 ...
- Java学习笔记之---内部类
Java学习笔记之---内部类 (一)成员内部类 内部类在外部使用时,无法直接实例化,需要借助外部类信息才能实例化 内部类的访问修饰符可以任意,但是访问范围会受到影响 内部类可以直接访问外部类的成员, ...
- 【Java学习笔记之二十五】初步认知Java内部类
可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 深入理解Java:内部类
什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
随机推荐
- 拼接LINQ动态表达式
using System; using System.Linq; using System.Linq.Expressions; public static class LinqBuilder { // ...
- js 复选框 全选都选 如果某一个子复选框没选中 则全选按钮不选中
<!DOCTYPE HTML> <html> <head> <meta charset=UTF-8> <title>js 复选框 全选都选 ...
- ORACLE工作原理小结
ORACLE工作原理1-连接 我们从一个用户请求开始讲,ORACLE的完整的工作机制是怎样的,首先一个用户进程发出一个连接请求,如果使用的是主机命名或者是本地服务命中的主机名使用的是机器名(非IP地址 ...
- Unity 性能
Unity 5.0 AMD 7650k 自带核显 Unity自建立方体2000正方体 50帧 但每个立方体多达60面 多个三角形 每秒100万面绘制 可能每个都要单独计算光照? 导入3ds模型相当于 ...
- winform、C# 自动更新
用IIS或者是Tomcat搭建一个Web服务器,因为没有涉及到动态页面,所以用什么服务器无所谓,网上有太多资料,这里不再赘述. 废话不多说,直接上代码. HttpHelper, 访问网页,下载文件等 ...
- Swift设置textView的行间距
let textview = UITextView(frame: CGRect(x: 100, y: 100, width: 100, height: 200)) let paraph = NSMut ...
- 设置myeclipse新建jsp文件默认编码为UTF-8
有三个地方需要改编码设置: 1. window-->preference-->general-->contenttype 然后在content types中展开每一个子项,并在Def ...
- 【转】如何配置android的adb环境变量
转载地址:http://jingyan.baidu.com/article/17bd8e52f514d985ab2bb800.html 对于android的开发人员来说,首先要做的就是环境变量的配置. ...
- 什么是setTimeout函数和setInterval函数?
我们一般在浏览网页的时候,一般都会有图片轮播等,一些比较好玩的特效,接下来我就给大家讲讲这俩个函数! 一setTimeout函数和setInterval函数的语法以及应用 1.setTimeout函数 ...
- Python 学习随笔1
在一个列表中,找出重复数组的位置. 比如在列表name = [1, 5, 8, 22, 56, 2, 8, 45, 7, 2, 35, 2, 486, 2, 152, 111, 265, 2, 2]中 ...