一.内部类学习导图

1>.静态内部类:

使用static修饰符来修饰内部类,则这个内部类就属于外部类本身,而不属于外部类的某个对象。因此使用static修饰的内部类被称为静态内部类。

public class StaticInclass {
private static int num;
private int num1;
private static int num2;
/*
* 创建一个静态内部类
* 静态内部类可以包含静态成员,也可以包含非静态成员。
* 根据静态成员不能访问非静态成员的规则,静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。
* 即使是静态内部类的实例方法也不能访问外部类的实例成员,只能访问外部类的静态成员。
*/
static class InClass{//静态内部类访问权限为包访问权限
private int num;//静态内部类中出现了非静态变量,必须将静态内部类实例化后才能获得
private static int num1;//静态变量
public void f() {
System.out.println(num2);
System.out.println(this.num);//获取了内部类的num符合就近原则
System.out.println(StaticInclass.num);//可以获取静态变量
// System.out.println(StaticInclass.num1);非静态方法无法获取外部类的非静态变量
}
public static void f1() {
System.out.println(StaticInclass.num);//可以获取静态变量
// System.out.println(StaticInclass.num1);静态方法同样无法获取外部类的非静态变量
}
public int getNum() {
return num;
}
}
public void f() {
System.out.println(InClass.num1);//内部类的静态成员变量
System.out.println(new InClass().num);//将静态内部类实例化
}
public static void main(String[] args) {
/*
* 外部类对静态内部类调用方式
*/
StaticInclass s=new StaticInclass(); }
}

注意点:

1.静态内部类允许拥有非静态变量,但是在获得静态内部类的非静态变量,必须将静态内部类实例化。

System.out.println(new InClass().num);//将静态内部类实例化获得其非静态变量

2.静态内部类只能外部类的静态变量,无法获得非静态变量。

//            System.out.println(StaticInclass.num1);静态方法同样无法获取外部类的非静态变量
//            System.out.println(StaticInclass.num1);非静态方法无法获取外部类的非静态变量

2>.非静态内部类

非静态内部类注意一点:内部类获取外部类的变量:“外部类.this.变量名”

代码:

package com.cjm.inclass;

public class InClassText {
int num; public InClassText(int num) {
this.num = num;
} public class InClass {
int num; public InClass(int num) {
this.num = num;
System.out.println(InClassText.this.num);//获取了外部类的变量
} @Override
public String toString() {
return "内部类的num:" + this.num;
}
} @Override
public String toString() {
return "外部类的num:" + this.num ;
} public static void main(String[] args) {
InClassText inclasstext = new InClassText(0);//外部类的初始化
InClassText.InClass inclass = inclasstext.new InClass(10);//内部类的初始化
}
}

3>.局部内部类

创建在方法或者代码块中的内部类为局部内部类

4>.匿名内部类

个人认为匿名内部类存在着打乱Java代码整体规则,使得代码混乱的问题,强烈推荐使用lambda表达式来代替匿名内部类。

匿名内部类的语法有些特别,创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失,匿名内部类不能重复使用。因此匿名内部类适合创建那种只需要一次使用的类。

匿名内部类的格式如下:

new 父类构造器|实现接口(){

//匿名内部类的类体部分

}

匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,实现一个接口。

  • 匿名内部类不能是抽象类,因为系统在创建匿名内部类时,会立即创建匿名内部类的对象。
  • 匿名内部类不能定义构造器,因为匿名内部类没有类名,也就无法定义构造器,但是匿名内部类可以定义实例初始化块,通过初始化块来完成初始化操作。
package com.cjm.inclass;

/**
* 匿名内部类
*
* @author 小明
*
*/
public class NoInClass { public Myinterface getOne() {//创建一个匿名内部类,匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,实现一个接口。
return new A() {
/*
* 在A类中进行添加的方法无法实现
*/
private int num = 10;
public void f3() {
System.out.println("f3()");
}
};
} public static void main(String[] args) {
NoInClass a=new NoInClass();
Myinterface ain=a.getOne();
ain.f();
Myinterface.f2();
}
}
interface Myinterface {
void f();
int num=0;
static void f2(){//匿名内部类无法使用静态方法,对象无法调用静态方法
System.out.println("hello");
}
}
class A implements Myinterface{
@Override
public void f() {
// TODO Auto-generated method stub
System.out.println("重写了f方法!");
} }

Java中的内部类————以及jdk1.8的lambda表达式的更多相关文章

  1. Java中的函数式编程(三)lambda表达式

    写在前面 lambda表达式是一个匿名函数.在Java 8中,它和函数式接口一起,共同构建了函数式编程的框架.   lambda表达式乍看像是匿名内部类的一种语法糖,但实际上,它们是两种本质不同的事物 ...

  2. Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

    Java中的内部类(成员内部类.静态内部类.局部内部类.匿名内部类) 神话丿小王子的博客主页 我们先看这样一段话:人是由大脑.肢体.器官等身体结果组成.而组成我们人体的心脏它也有自己的属性和行为(血液 ...

  3. Java 中的内部类

    前言 在第一次把Java 编程思想中的内部类这一章撸完后,有点印象.大概知道了什么时内部类,局部内部类,匿名内部类,嵌套内部类.随着时间的推移,自己慢慢的就忘记了,总感觉自己思考的东西不多,于是 看了 ...

  4. Java中的 内部类(吐血总结)

    1. 内部类的作用 内部类是一个独立的实体,可以用来实现闭包:能与外部类通信:内部类与接口使得多继承更完整 2. 内部类的分类 1)普通内部类 类的实例相关,可以看成是一个实例变量.内部类的类名由 “ ...

  5. 【转】Java中的内部类和匿名类

       Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的 ...

  6. Java学习笔记二十:Java中的内部类

    Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...

  7. Java中的内部类怎么用

    一.为什么需要内部类?java内部类有什么好处?为什么需要内部类? 首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时 ...

  8. Java 8新特性(一):Lambda表达式

    2014年3月发布的Java 8,有可能是Java版本更新中变化最大的一次.新的Java 8为开发者带来了许多重量级的新特性,包括Lambda表达式,流式数据处理,新的Optional类,新的日期和时 ...

  9. 泛型委托及委托中所涉及到匿名方法、Lambda表达式

    泛型委托及委托中所涉及到匿名方法.Lambda表达式 引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到 ...

随机推荐

  1. spring xml的配置

                    Spring xml文档头得配置 spring文档头一般是可以复制过来得,刚学习得时候一直看网上有没有配置,然后也没有找到,希望以下过程得学习可以给大家带来帮助!! 1 ...

  2. Xshell中文乱码怎么处理?

    改成如下图:

  3. #pragma 处理警告 clang diagnostic 的使用

    首先#pragma在本质上是声明,常用的功能就是注释,尤其是给Code分段注释:而且它还有另一个强大的功能是处理编译器警告,但却没有上一个功能用的那么多. clang diagnostic 是#pra ...

  4. POJ 2373 Dividing the Path(DP + 单调队列)

    POJ 2373 Dividing the Path 描述 农夫约翰的牛发现,在他的田里沿着山脊生长的三叶草是特别好的.为了给三叶草浇水,农夫约翰在山脊上安装了喷水器. 为了使安装更容易,每个喷头必须 ...

  5. LY.JAVA面向对象编程.修饰符

    2018-07-18 09:20:25 /* 修饰符: 权限修饰符:private,默认的,protected,public 状态修饰符:static,final 抽象修饰符:abstract 类: ...

  6. 逆袭之旅DAY16.东软实训.Oracle.修改用户

    2018-07-12 15:49:51

  7. MAVEN 创建项目

    使用archetype生成项目骨架 MAVEN 创建项目JAR 和 MAVEN创建项目WAR中是使用特定的acrchetype来进行创建项目,如果使用其他的archetype来创建项目或是使用 mvn ...

  8. SQLServer中sql for xml path 的用法

    我们通常需要获取一个多行的某个字段拼出的字符串,我们可以使用for xml path进行处理:下面将介绍for xml path的具体用法: 创建测试表&插入测试数据 在数据库中新增测试表 C ...

  9. 登录验证码实现(Captcha)

    登录验证码 登录验证是一般系统都会有的功能,验证的方式也多种多样,比如输入式验证码,拖动式验证条,拖动式验证拼图等等. 我们这里先实现常规的输入验证码的方式,右边显示验证码图片,点击可刷新,左边输入验 ...

  10. XML(二)

    XML XML介绍 1.什么是xml? 概念:XML(EXtensible Markup Language)XML 指可扩展标记语言(EXtensible Markup Language) 可扩展:我 ...