Java 内部类,成员类,局部类,匿名类等
根据内部类的位置不同,可将内部类分为 :成员内部类与局部内部类。
class outer{
class inner{//成员内部类
}
public void method() {
class local_inner{ //局部内部类
}
}
}
1、成员内部类
(1)访问格式:
外部类名.内部类名 对象名=外部类对象.内部类对象
//注意不要用中文全角空格,否则会出错!编译不通过!
class outer{
class inner{
public void show()
{
System.out.println("你好");
}
}
}
public class niming{
public static void main(String[]args) {
outer.inner b=new outer().new inner(); //创建对象访问对应内部类函数成员
b.show(); }
}
虽然内部类可以以上述方式访问,但实际开发中,常将内部设为私有成员,以保护数据的安全,不让外部直接使用
(2)将内部类设为私有成员
class outer{
//成员内部类,设为私有
private class inner{
public void show()
{
System.out.println("你好"); }
}
public void show1() {
inner b=new inner();
b.show(); }
}
public class niming{
public static void main(String[]args) {
//创建对象访问对应内部类函数成员
outer c=new outer();
c.show1();
}
}
(3)将内部类设为静态类
eg1:
class outer{
//静态成员变量
private static int num=20;
//静态成员方法
public static void show2() {
System.out.println("hello world");
}
//成员内部类,设为私有静态
private static class inner{
public void show() {
System.out.println(num); //静态内部类访问外部类成员时,只能访问外部类的静态成员
show2();
}
}
public void show1() {
inner b=new inner();
b.show();
}
}
public class niming {
public static void main(String[]args) {
outer c=new outer();
c.show1();
}
}
eg2:
eg3: Private 保证了数据的安全 ,Static 让数据访问更方便
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
//三个变量对应的变量名相同
//访问的是本方法中的num变量,满足就近原则
System.out.println(num);
//通过this变量,访问方法外,本类中的变量,this代表Inner类对象
System.out.println(this.num);
//通过外部类名加this,返回外部类对象,访问对象外部类的
13 System.out.println(Outer.this.num);
//通过创建对象的方式访问外部成员变量不推荐
//System.out.println(new Outer().num); }
}
}
}
public class niming{
public static void main(String[]args) {
Outer.Inner inner=new Outer().new Inner();
inner.show();
}
}
2、局部内部类
public class Outer{
int num1 = 1;
static int num2=2;
public void inner(){
System.out.println("局部内部类");
int num3 = 3;
// static int num4=4; //error,不能用static修饰
class InnerClass{ //局部内部类的类体中不可以声明类变量和类方法,局部内部类不能用static修饰。成员内部类不存在这个限制。
private int num5 = 5;
//private static int num6 = 6; //error
private final static int num7 = 7; //ok
private static final int num8 = 8; //ok
public void testNum()
{
System.out.println(num1);
System.out.println(num2);
System.out.println(num3);
System.out.println(this.num5);//ok
}
}
InnerClass a=new InnerClass();
a.testNum();
}
public static void main(String[]args) { Outer c= new Outer(); c.inner(); }
}
成员内部类的字节码文件会不一样。会变成外部类名$number内部类名
3、匿名内部类
匿名类,就是没有名称的类,其名称由Java编译器给出,一般是形如:外部类名称+$+匿名类顺序,没有名称也就是其他地方就不能引用,不能实例化,只用一次,当然也就不能有显式声明的构造函数.
- 匿名类就是利用父类的构造函数和自身类体构造成一个类。
- 匿名类可以继承父类的方法,也可以重写父类的方法。
- 匿名类可以访问外部类的成员变量和方法,匿名类的类体不可以声明称static成员变量和static方法。
- 匿名类由于是一个new的结果,所以其实可以赋值给一个父类对象。因此可以分为两种匿名类,成员匿名类和局部匿名类(作为函数参数)
- 匿名类永远不能是抽象的。
- 匿名类总是隐式的final.
- 匿名类总是一个内部类;并且不能是static的
编译时的命名规则:
- 内部类的class文件命名是:主类+$+内部类名
- 匿名类的class文件命名是:主类+$+(1,2,3….)
实际使用中我们只需注意这几点儿:
1. 使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
2. 匿名内部类中是不能定义构造函数的。
3. 匿名内部类中不能存在任何的静态成员变量和静态方法。
4. 匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
5. 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
访问权限
1. 访问外层Class里面的字段。
2. 不能访问外层方法中的本地变量。除非变量是final。
3. 如果内部类的名称和外面能访问的名称相同,则会把名称覆盖掉。
4. 不能定义静态初始化代码块
5. 不能在匿名类里面定义接口
6. 不能在匿名类中定义构造函数
实现接口方法的例子:
————————————————
版权声明:本文为CSDN博主「yin__ren」的原创文章,遵循undefined版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yin__ren/article/details/79177597
Java 内部类,成员类,局部类,匿名类等的更多相关文章
- Java内部类与外部类
错误提示: 没有任何类型 TestThread 的外层实例可访问.必须用类型 TestThread 的外层实例(例如,x.new A(),其中 x 是 TestThread 的实例)来限定分配. pu ...
- java 内部类、匿名内部类、嵌套类的使用
我们都知道java的类能够由public.default(缺省.不写)来修饰,分别表示的含义是同意公开訪问以及仅仅同意包内其他类訪问,而同一包内的类一般是为完毕同一个功能而协作. 除此之外, ...
- Java内部类与外部类的那些事
昨天去笔试的时候遇到了Java的内部类的创建方式与访问权限的问题,我不懂,没写,故今天起来特意去试验一下,就有了这篇总结性的文章. Java中的内部类又分为非静态内部类(匿名内部类也是非静态的内部类) ...
- java 内部类与外部类的区别
最近在看Java相关知识的时候发现Java中同时存在内部类以及非公有类概念,而且这两个类都可以不需要单独的文件编写,可以与其他类共用一个文件.现根据个人总结将两者的异同点总结如下,如有什么不当地方,欢 ...
- java内部类 和外部类的区别
java 内部类和静态内部类的区别 详细连接https://www.cnblogs.com/aademeng/articles/6192954.html 下面说一说内部类(Inner Class)和 ...
- java内部类和外部类
1.使用static可以声明一个内部类, 可以直接在外部调用 class Outer{ // 定义外部类 private static String info = "hello world& ...
- Java内部类和外部类的通信探索
1.内部类访问外部类的成员和方法 在内部类中,可以无障碍地访问外部类的所有成员和方法. 在下面的实验代码中,可以看到,内部类sl可以访问外部类的私有成员:sz 和 cur. 同时可以访问私有方法:pr ...
- 从字节码的角度看Java内部类与外部类的互相访问
Java中non-static内部类为何可以访问外部类的变量?Java中外部类又为何可以访问内部类的private变量?这两个问题困扰过我一段时间,查了一些网上的答案,大多从“闭包”概念入手,理解起来 ...
- Java内部类引用外部类中的局部变量为何必须是final问题解析
今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来想到应该是生命周期的原因,因为方法内定义的变量是局部变量,离开该方 ...
随机推荐
- 每天进步一点点-WPF-根据数据类型加载控件
目的,根据数据类型的不同,动态的加载适用于不同数据类型的控件(布局) 原理:为自定义的数据类型添加数据魔板,绑定的时候绑定这些数据类型的实例. 例子: 数据类型: 数据模板: <DataTemp ...
- 欧拉函数+反演——2019hdu多校6588
\[ 求\sum_{i=1}^{n}(\sqrt[3]i,i)\\ 首先转化一下这个式子,考虑对于i\in[j^3,(j+1)^3-1],\sqrt[3]i=j\\ 所以可以枚举所有j,然后对i\in ...
- Python 让文件代码支持汉字
默认使用ASCII编码,改成utf8 #!/usr/bin/env python # -*- coding:utf8 -*- #coding:utf-8
- LUOGU P4560 [IOI2014]Wall 砖墙 (线段树)
传送门 解题思路 线段树打标记,刚开始想复杂了,维护了四个标记.后来才知道只需要维护一个最大值最小值即可,然后更新的时候分类讨论一下. 代码 #include<iostream> #inc ...
- inobounce.js : 禁止IOS H5的滑动回弹
IOS的移动端/H5/webapp 页面如果滚动到底部或者在页面顶部再往上拉,都会出现一个回弹的效果. 想取消这个效果可以引入一个简单的库就行,不用再写繁琐的样式. github地址 直接引入就行 & ...
- hdu多校第七场 1011 (hdu6656) Kejin Player 概率dp
题意: 一个游戏,有许多关,到下一关要花费金钱,做出尝试,有概率成功,若成功则到达下一关,若失败则停在此关或退回到前面某关,询问第l关到第r关的期望费用 题解: 显然,第r关到第l关的费用是dp[r] ...
- Java-Class-I:com.alibaba.fastjson.JSONObject
ylbtech-Java-Class-I:com.alibaba.fastjson.JSONObject 1.返回顶部 1.1.import com.alibaba.fastjson.JSON;imp ...
- OAuth2.0的理解-转自阮一峰博客
一.应用场景 为了理解OAuth的适用场合,让我举一个假设的例子. 有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来.用户为了使用该服务,必须让"云冲 ...
- Spring AOP之注解实现
在自定义个注解之后,通过这个注解,标注需要切入的方法,同时把需要的参数传到切面去.那么我们怎么在切面使用这个注解.我们使用这个自定义注解一方面是为了传一些参数,另一方面也是为了省事.具体怎么省事,看我 ...
- HDU 5726 线段树+dp
题意:给出一个序列,后q次询问,求给定区间gcd及整个序列有多少个序列的gcd和这个值相同 首先线段树维护区间gcd建树,之后预处理出每个gcd有多少个子序列,这时需要dp, dp[i][tmp]表示 ...