内部类

1.1内部类概述

内部类就是指在一个类中定义一个类。举例:在一个类A的内部定义了一个类B,类B就称为内部类。

1.1.1内部类的定义格式

格式:

​ public class 类名{

​ 修饰符 class 类名{

​ }

}

范例:

public class outer{

​ public class inner{

​ }

}

1.1.2内部类的访问特点

  • 内部类可以直接访问外部类的成员,包括私有成员
  • 外部类要访问内部类的成员必须创建对象
package com.itheima_05;
//外部类
public class Outer {
//外部类成员变量
private int age = 10; //内部类
public class Inner{
public void show(){
//内部类可以直接访问外部类的成员,包括私有成员
System.out.println(age);
} } public void method(){
//外部类要访问内部类的成员必须创建对象
//show();
Inner i = new Inner();
i.show();
} }

1.2成员内部类

按照内部类在类中定义的位置不同,可以分为如下两种方式:

  • 在类的成员位置:成员内部类
  • 在类的局部位置:局部内部类

成员内部类,外界如何访问创建对象使用呢?

格式:外部类名.内部类名 对象名 = new 外部类对象.内部类对象;

范例:Outer.Inner oi = new Outer().new Inner();

//外部类
public class Outer {
//外部类成员变量
private int age = 10; //public的成员内部类
public class Inner{
public void show(){
//内部类可以直接访问外部类的成员,包括私有成员
System.out.println(age);
} } public void method(){
//外部类要访问内部类的成员必须创建对象
//show();
Inner i = new Inner();
i.show();
} }
//测试类
public class InnerDemo {
public static void main(String[] args) {
//内部类是public权时创建内部类对象并调用方法
//错误写法 Inner i = new Inner();
Outer.Inner oi = new Outer().new Inner(); }
}
//外部类
public class Outer {
//外部类成员变量
private int age = 10; //private成员内部类
private class Inner{
public void show(){
//内部类可以直接访问外部类的成员,包括私有成员
System.out.println(age);
} } public void method(){
//外部类要访问内部类的成员必须创建对象
//show();
Inner i = new Inner();
i.show();
} } public class InnerDemo {
public static void main(String[] args) {
//内部类是private权时创建内部类对象并调用方法
Outer o = new Outer();
o.method(); }
}

虽然没法直接调用内部类的方法,但是可以通过外部类对外给出的接口来对内部类进行操作,类似于成员变量的get/set方法。

1.3局部内部类

局部内部类是在方法中定义的类,所以外界是无法直接使用的,需要在方法内部创建对象并使用,该类可以直接访问外部类的成员,也可以访问方法内的局部变量。

public class Outer {
//外部类成员变量
private int age = 10; public void method(){
int age2 = 20; //局部内部类
class Inner{ public void show(){
System.out.println(age);
System.out.println(age2);
}
} Inner i = new Inner();
i.show();
} }
//测试类
public class InnerDemo {
public static void main(String[] args) {
Outer o = new Outer();
o.method(); }
}

1.4匿名内部类

是局部内部类的一种特殊形式

前提:存在一个类或者接口,这里的类可以是具体类也可以是抽象类

格式:

new 类名或者接口名(){

​ 重写方法;

}

范例:

new Inter(){

​ public void show(){

}

}

匿名内部类本质上是一个继承了该类或者实现了该接口的子类匿名对象

public class Outer {
public void method(){
/*
new Inter(){
@Override
public void show() {
System.out.println("匿名内部类");
}
};
这么写仅仅是new了一个对象
*/ /*
//这么写是对象调用方法
new Inter(){
@Override
public void show() {
System.out.println("匿名内部类");
}
}.show();
*/ Inter i = new Inter(){
@Override
public void show() {
System.out.println("匿名内部类");
}
};
i.show(); }
} public interface Inter {
void show();
} public class OuterDemo {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}

1.5匿名内部类在开发中的使用

public class JumppingDemo {
public static void main(String[] args) {
JumppingOperator jo = new JumppingOperator();
Cat c = new Cat();
//原来的方式,每次调用一次跳高操作类都要定义一个新对象并传入一个新对象
jo.method(c); System.out.println("=============");
//匿名内部类
jo.method(new Jumpping() {
@Override
public void jumpping() {
System.out.println("猫会跳高");
}
});
jo.method(new Jumpping() {
@Override
public void jumpping() {
System.out.println("狗会跳高");
}
}); }
}

Java中内部类相关知识的更多相关文章

  1. JAVA中HashMap相关知识的总结(一)

    Java中HashMap在jdk1.7和jdk1.8中的区别点: 在jdk1.7中是用数组+链表形式存储,1.8采用数组+链表/红黑树形式 Jdk1.8中由链表转为红黑树是长度大于8,由红黑树转为链表 ...

  2. 【Socket编程】Java中网络相关API的应用

    Java中网络相关API的应用 一.InetAddress类 InetAddress类用于标识网络上的硬件资源,表示互联网协议(IP)地址. InetAddress类没有构造方法,所以不能直接new出 ...

  3. 第76节:Java中的基础知识

    第76节:Java中的基础知识 设置环境,安装操作系统,安装备份,就是镜像,jdk配置环境,eclipse下载解压即可使用,下载tomcat 折佣动态代理解决网站的字符集编码问题 使用request. ...

  4. java中内部类的讲解

    java中有一个内部类的概念,由于之前一直比较忙,没有单独拿出时间总结一下,今天我就把内部类的相关知识进行一下汇总,如果有不足之处,欢迎批评指正. 1)java内部类的概念.       在一个类的的 ...

  5. Python中元组相关知识

    下面给大家介绍以下元组的相关知识: ·元组可以看成是一个不可更改的list 1.元组的创建 # 创建空元祖 t = () print(type(t)) # 创建只有一个值的元组 # 观察可知元组中如果 ...

  6. Java中内部类的骚操作

      10.1 如何定义内部类 如代码10.1-1 所示 public class Parcel1 { public class Contents{ private int value = 0;​ pu ...

  7. JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?

    本文主要记录:在JAVA中,(局部)内部类访问某个局部变量,为什么这个局部变量一定需要用final 关键字修饰? 首先,什么是局部变量?这里的局部是:在方法里面定义的变量. 因此,内部类能够访问某局部 ...

  8. java中关于锁知识的整理

    1.1什么是锁? 在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限制.锁旨在强制实施互斥排他.并发控制策略. 锁通常需要硬件支持才能有效 ...

  9. java中内部类的积累

    放在一个类的内部的类我们就叫内部类. 二. 作用 1.内部类可以很好的实现隐藏 一般的非内部类,是不允许有 private 与protected权限的,但内部类可以 2.内部类拥有外围类的所有元素的访 ...

  10. Java 网络编程相关知识

    网络的一些基础知识 IP地址分类 IP地址根据网络ID的不同分为5种类型,A类地址.B类地址.C类地址.D类地址和E类地址.A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用 ...

随机推荐

  1. office2016word打开总是提示安全模式

    突然打开word和Excel提示是否使用安全模式,如果选择否就自动退出office,选择是进入后,编辑一下也会自己退出,非常郁闷. 之后上网查看,尝试了许多: 1.win+R 运行%appdata%\ ...

  2. VS编译运行报错:找不到ucrtbased.dll文件

    VS编译运行报错:找不到ucrtbased.dll文件 在VS2019中配置OpenCV编译,报如下错误: 解决方法:下载缺少的ucrtbased.dll文件,在免费的dll下载网站搜索下载,对应的有 ...

  3. k8s_namespace

    namespace 可以认为namespaces是kubernetes集群中的虚拟化集群.在Kubernetes集群可以拥有多个命名空间,它们在逻辑上彼此隔离. 多数的Kubernetes中的集群默认 ...

  4. mysql数据增量及备份操作

    注:当数据库出现异常的时候,我们可以先恢复最近一次的全量备份,接着将增量备份的文件一个一个按顺序恢复即可实现原来数据库的恢复. 还可以使用innobackupex 备份工具. 备份 # 1,开启 bi ...

  5. Win10使用打印机0x0000011b错误 如何处理(没有KB5005565补丁如何解决??)

    1.排查问题 win10连接打印机共享错误显示0x0000011b怎么解决?很多用户在更新了windows系统的最新补丁后,突然发现自己打开打印机的时候提示"无法连接到打印机,错误为0x00 ...

  6. dynamics 365 复制(克隆)现有组织

    很多时候需要复制现有的开发环境作为新的开发环境,以保留原有测试数据,旧的开发环境作为问题修复环境,以下是复制步骤: 1. 登录数据库服务器,备份现有数据库 2. 还原数据库为新的数据库名称 3. 在前 ...

  7. Joseph Problem With Passwords In Java

    问题描述: 编号为1,2,......,n的n个人(每个人的信息有编号.姓名和密码三项)按照顺时针方向围坐一圈, 每个人有且只有一个密码(正整数,密码用随机方式赋值,范围1-15).一开始任选一个正整 ...

  8. 敌兵布阵 HDU - 1166 - 单点修改,区间查询:树状数组/线段树

    C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...

  9. css实现文字多余显示省略号

    只显示一行文字 overflow: hidden; text-overflow:ellipsis; white-space: nowrap; 显示多行文字 word-break:break-all; ...

  10. DDD(三)DDD实战、贫血模型与充血模型

    DDD(三)DDD实战.贫血模型与充血模型 如果觉得样式不好:跳转即可 http://www.lifengying.site/(md文件复制过来有些样式会不一样) 贫血模型与充血模型 1.贫血模型:一 ...