Javase之内部类概述
内部类概述
- 把类定义在其他类的内部就称为内部类
class A{
class B{
}
}
B就称为内部类,A称为外部类。
内部类的访问特点
- 内部类直接访问外部类成员,包括私有。
- 外部类要访问内部类要创建对象。
- 内部类可用static修饰,它可以看作外部类的成员。
内部类的位置
成员位置:在成员位置定义的类,称为成员内部类。
局部位置:在局部位置定义的类,称为局部内部类。
class Outer{ private int num = 10; //成员内部类 class Inner1{ } public void method(){ //局部内部类 class Inner2{ } } }
成员内部类
访问方式:外部类名.内部类名 对象名 = 外部类对象.内部类对象 (因为一般非静态成员可只能通过对象访问)
Outer.Inner obj = new Outer().new Inner();
修饰符
private :保证数据的安全行。
static :为了方便访问数据。
注意:静态内部类访问外部成员时,只能访问外部的静态成员。
此时访问内部类的方式为:外部类名.内部类名 对象名 = new 外部类名.内部类名(); (因为静态成员可直接通过类名访问)
eg: Outer.Inner obj = new Outer.Inner();
注意:
1.内部类与外部类没有继承关系。
2.内部类若要访问外部类的非静态成员,要通过外部类名限定this对象。(Outer.this)
class Outer{ public int num = 10; class Inner1{ public int num = 20; public void show(){ int num = 30; System.out println(num); System.out println(this.num); System.out println(outer.this.num); } } }
out:
30
20
10
局部内部类
1.可直接访问外部类的成员。
2.在局部位置,可创建内部类对象,通过对象调用内部类的方法,来使用局部内部类的功能。
局部内部类访问局部变量的注意事项:
1.局部内部类访问的局部变量必须要被final修饰。
2.原因:局部变量随着方法的调用而调用,方法调用完毕就消失。而堆内存的内容不会立即消失,所以,要用final修饰局部变量。加入final修饰后,所有调用这个变量的地方就变成常量数据,常量在内存中存在是固定的,故即使局部变量随着方法调用而消失,数据依旧存在。
class Outer{ private int num1 = 10; public void method(){ //局部内部类 final int num2 = 20; class Inner{ public void show(){ System.out.println(num1); //从内部类访问本地变量num2;num2需要被申明为最终类型。 System.out.println(num2); } } } }
匿名内部类
内部类的简化写法
前提:存在一个类(抽象类)或接口。
格式:
new 类名(抽象类名)或接口名(){
重写方法;
}
本质:是一个继承该类或实现改接口的子类的匿名对象。
interface Inter {
public abstract void show();
public abstract void show2();
} class Outer {
public void method() {
new Inter(){
public void show() {
System.out.println("show");
}
//只调用一个匿名内部类的方法时直接在new出的对象后面加要调用的方法名。
}.show();
//若要调用匿名内部类的多个方法则把匿名内部类变成有名的。(通过多态)
Inter i = new Inter(){
public void show() {
System.out.println("show");
}
public void show2() {
System.out.println("show2");
}
}
i.show();
i.show2();
}
}
class Main {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
- 匿名内部类的应用
interface Inter {
public abstract void show();
} class InterTest {
//接口作为形参,要的不是接口而是接口的实现类
public void method(Inter p) {
p.show();
}
} class InterImp implement Inter {
public void show() {
System.out.println("show");
}
} class Outer {
public static void main(String[] args) {
InterTest it = new InterTest();
Inter i = new InterImp();
it.show(); //匿名内部类在开发中的使用
//匿名内部类的本质是继承该类或实现改接口的子类的匿名对象。
//作用:方法结束匿名内部类就被回收节省资源。
it.show(new Inter() {
public void show() {
System.out.println("show");
}
});
}
}
- 匿名内部类的案例
补齐代码:
interface Inter { void show();}class Outer {
//补齐代码
}class Main {
public static void main(String[] args){
Outer.method().show();
}
}//要求输出“hello world”
interface Inter { void show();}
class Outer {
//补齐代码
public static Inter method(){
return new Inter(){
public static void show(){
System.out.println("hello world");
}
};
}
}
class Main {
public static void main(String[] args){
Outer.method().show();
//由Outer.method()可以看出method()为静态方法,而Outer.method().show();
//则说明method()方法的返回值类型为Inter所以
}
}
Javase之内部类概述的更多相关文章
- JAVA基础之内部类
JAVA基础之内部类 2017-01-13 1.java中的内部类都有什么?! 成员内部类 局部内部类 匿名内部类 静态内部类 2.内部类详解 •成员内部类 在一个类的内部再创建一个类,成为内部类 1 ...
- JavaSE(七)之内部类
上一篇我们学习了接口还有访问控制,在以后的工作中接口是我们经常要碰到的,所以一定要多去回顾.接下来介绍一下内部类.很多时候我们创建类的对象的时候并不需要使用很多次,每次只使用一次 这个时候我们就可以使 ...
- JavaSE 学习笔记之内部类(九)
内部类:如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象.这时,为了方便设计和访问,直接将A类定义在B类中.就可以了.A类就称为内部类.内部类可以直接访问外部类中的成员.而外部类想要访问内 ...
- Java 之内部类
概述 内部类修饰符 内部类的细节 局部内部类 匿名内部类及其应用 匿名内部类细节 内部类概述 将一个类定义在另一个类的里面, 里面的那个类就称为内部类(内置类, 嵌套类). class Outer { ...
- java之内部类(InnerClass)----非静态内部类、静态内部类、局部内部类、匿名内部类
提起java内裤类(innerClass)很多人不太熟悉,实际上类似的概念在c++里面也有,那就是嵌套类(Nested Class),关于这俩者的区别,在下文中会有对比.内部类从表面上看,就是在类中定 ...
- ThinkInJava之内部类
一:内部类概述 将一个类的定义放在另一个类的内部,这就是内部类.内部类是Java一种非常有用的特征,因为他允许你把一些逻辑相关的数据组织在一起,并控制它的可见性. 二:内部类的创建 我们都知道类的创建 ...
- Java类成员之内部类
内部类含义: 在Java中允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类. Inner class 一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称. Inner ...
- Java系列之内部类
今天温习一下 Java 中的内部类,内部类一般有如下几种:静态内部类.成员内部类.匿名内部类和方法内部类,下文中将主要介绍静态内部类和成员内部类,主要内容如下: 概述 静态内部类 成员内部类 匿名内部 ...
- JavaSE(一) 语言概述
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 目录 1 基础常识 2 Java语言版本迭代概述 3 Java语言应用的领域 4 Java语言的特点 5 ...
随机推荐
- Python 爬虫从入门到进阶之路(四)
之前的文章我们做了一个简单的例子爬取了百度首页的 html,我们用到的是 urlopen 来打开请求,它是一个特殊的opener(也就是模块帮我们构建好的).但是基本的 urlopen() 方法不支持 ...
- 前端深入之js篇丨Array数组操作从入门到成神Up Up Up,持续更新中
写在前面 随着前端深入的不断学习,发现数组这个数据结构在前端中有着相当大的存在感,由于我初学前端的时候并没有系统性的学习数组,所以我将通过这篇文章同你一起学习数组,希望我们能一起进步,学会熟练操作数组 ...
- PHP+jQuery开发简单的翻牌抽奖实例
PHP+jQuery开发简单的翻牌抽奖实例,实现流程:页面放置6个方块作为奖项,当抽奖者点击某一块时,方块翻转到背面,显示中奖信息,这个奖品是随机的,不是固定的. 在页面上放置6个奖项: <ul ...
- socket经典案例-发送数据
一:客户端向服务端发送数据. 服务端: package com.company.s; import java.io.*; import java.net.ServerSocket; import ja ...
- textarea中文本高亮选中
最近在实现原文/译文句段高亮对比显示,和有道翻译类似,如下图所示: 最初的解决方案是采用富文本编辑器,把所有句段信息都用HTML标签包裹,操作空间比较大,页面上需要的功能几乎都可以实现,但是由此带来了 ...
- Python3 进程、线程和协程
Infi-chu: http://www.cnblogs.com/Infi-chu/ 进程.线程和协程的对比 1.定义对比 进程:是系统进行资源分配的基本单位,每启动一个进程,操作系统都需要为其分配运 ...
- String类型中 "=="和"equals"比较的差别
String类型中 "=="和"equals"比较的差别 先说明一下String类型的变量的创建方式 在创建新的String类型的变量时,首先会在缓冲区查找是否 ...
- Python语法速查: 2. 列表、元组、字典、集合操作
返回目录 (1)通用序列操作 “序列”表示索引为非负整数的有序对象集合,列表.元组.字符串都属于序列.区别在于:列表是可变的,而元组和字符串是不可变的.序列的通用操作他们都可以用. 操作或方法 简述 ...
- 渗透测试学习 二十九、kali安装,信息搜集,服务器扫描
kali安装,信息搜集,服务器扫描 kali介绍 Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统.由Offensive Security Ltd维护和资助.最先由 ...
- 有static的方法和没有static的调用
package com.yh.test02; public class Test { public static void main(String[] args) { Test.method1(); ...