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 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
随机推荐
- 日志时间格式有s,ms,us,如何排序最大10行
这个比较繁琐,谁有更好方法?告诉我 [root@module tmp]# cat oldboy.txt 12s120001ms12000000us13s[root@module tmp] ...
- 【原创】linux 批量清空文本内容
清空所有PHP文件 find . -name '*.php'|xargs sed -i '1,$d' 清空所有文件 find . -type f|xargs sed -i '1,$d'
- Android targetSdkVersion 对生命周期的影响
一直都认为当手机进入休眠时,Activity的生命周期会进入onPause()-->onStop()状态,但是今天偶然遇到了一个百思不得其解的问题,如果在AndroidMainfest.xml文 ...
- paper 115:常见的概率分布(matlab作图)
一.常见的概率分布 表1.1 概率分布分类表 连续随机变量分布 连续统计量分布 离散随机变量分布 分布 分布 二项分布 连续均匀分布 非中心 分布 离散均匀分布 (Gamma)分布 分布 几何分布 指 ...
- Ubuntu14.04运行行roscore错误
错误提示: 网络配置有问题,ping不同自己(ping localhost). vim ~/.bashrc 在底部加入: export ROS_HOSTNAME=localhostexport ROS ...
- Java IO设计模式彻底分析 (转载)
一.引子(概括地介绍Java的IO) 无论是哪种编程语言,输入跟输出都是重要的一部分,Java也不例外,而且Java将输入/输出的功能和使用范畴做了很大的扩充.它采用了流的 机制来实现输入/输出,所谓 ...
- WCF 、Web API 、 WCF REST 和 Web Service 的区别
WCF .Web API . WCF REST 和 Web Service 的区别 The .Net framework has a number of technologies that allow ...
- 日常总结——JSP篇(补)
序—— 初次接触JSP,写一个登录注册界面 正文—— JSP介绍:JSP通过在标准的HTML页面中插入java代码,其静态的部分无须java程序控制.每个JSP页面就是一个servlet实例, WEB ...
- HttpEntity转换Inputstream(红色)加XmlPull解析
package com.bawei.xml; import java.io.IOException; import java.io.InputStream; import java.util.Arra ...
- 横向不间断滚动DIV
横向不间断滚动DIV,5个一组,js控制,自动生成任意组显示 <!DOCTYPE html> <html> <head> <meta http-equiv=& ...