Java内部类手机专卖店_Java(20)内部类
内部类
一个定义在另一个类里面的类称为内部类。内部类可以分为四种形式:成员内部类,
成员内部类
内部调用外部的属性和方法
成员内部类可以无条件访问外部类的所有成员属性和方法。
其他类(例子中的RunC类)访问一个内部类的形式有三种:
Outter.Inner outin=new Outter().new Inner();
Outter out=new Outter();
Outter.Inner in=out.new Inner();
public Inner getInnerInstance(){return Inner};
Outter out=new Outter();
Outter.Inner in=out.getInnerInstance();
public class Outter {
private String name = "Krystal";
private int age = 20;
private Inner innerInit=null;
public void outterFun(){
System.out.println("外部类的方法");
}
public Inner getInnerInstance(){
if(innerInit==null){
innerInit=new Inner();
return innerInit;
}else{
return innerInit;
}
}
class Inner {
void fun() {
//内部类无条件访问外部类的所有成员属性和方法,不需要声明
outterFun();
System.out.println(name);
System.out.println(age);
}
}
}
class RunC {
public static void main(String[] args) {
//第一种方式:
Outter.Inner outin=new Outter().new Inner();
outin.fun();
// //第二种方式:
// Outter out=new Outter();
// Outter.Inner in=out.new Inner();
// in.fun();
// //第三种方式:
// Outter out=new Outter();
// Outter.Inner in=out.getInnerInstance();
// in.fun();
}
}
/*运行结果为:
外部类的方法
Krystal
20
*/
外部调用内部的属性和方法
成员内部类可以无条件访问外部类的所有成员属性和方法,但是外部想访问内部就没那么简单了。首先要创建一个成员内部类的对象,然后通过该对象访问。
其他类(例子中的RunC类)访问一个外部类的方式跟平时一样,正常调用即可。
public class Outter {
Inner in=new Inner();
void outterFun(){
System.out.println(in.salary);
in.innerFun();
}
class Inner {
public void innerFun() {
System.out.println("内部类的方法");
}
private long salary=25000;
}
}
class RunC {
public static void main(String[] args) {
Outter ot=new Outter();
ot.outterFun();
}
}
/*运行结果为:
25000
内部类的方法
*/
局部内部类
局部内部类是定义在一个方法内或者一个作用域内的类。局部内部类的访问权限仅限于方法内或者作用域内。
class Outter{
private String name="krystal";
public void outterFun(){
class Woman{
int age=18;
}
//方法内定义的局部内部类的成员属性和方法只能在该方法内使用
System.out.println(new Woman().age);
}
//Woman w=new Woman();--->编译报错
}
class RunC{
public static void main(String[] args) {
Outter out=new Outter();
out.outterFun();
}
}
//运行结果: 18
匿名内部类(常用)
首先来了解以下什么叫做匿名类,匿名类就是没有名称的类,匿名类的名称由java的编译器给出,格式形如:外部类名称+$匿名类顺序。
既然匿名类没有名称,没有名称就不能被其它地方引用,不能被实例化,所以匿名类只能用一次,也不能由构造器。
匿名类可以继承父类的方法,也可以重写父类的方法。
匿名类必须继承一个父类或者实现一个接口。创建语法格式如下:
new 父类构造器(实参列表) | 实现接口()
{
//匿名内部类的类体部分
}
匿名类可以访问外部类的成员属性和方法,匿名类的类体不可以声明static变量或static方法。
了解了匿名类之后,那么放在一个类内部的匿名类就是匿名内部类。
案例1:通过继承实体类创建匿名内部类
class Outter{
public String name="krystal";
void show(){
System.out.println("我叫"+name);
}
}
class RunC{
public static void main(String[] args) {
//通过实体类创建匿名内部类,相当于创建一个该类的子对象
Outter out=new Outter(){
//匿名内部类可以重写父类的方法:
@Override
void show() {
System.out.println("我叫Jimmy");
}
};
out.show();
//匿名内部类可以继承父类的属性和方法:
System.out.println(out.name);
//查看编译器分配给匿名内部类的名称
System.out.println(out.getClass());
}
}
/*运行结果为:
我叫Jimmy
krystal
class RunC$1
*/
案例2:通过实现接口创建匿名内部类
interface OutF{
public double getPrice();
public String getName();
}
class RunC{
public static void main(String[] args) {
OutF oF=new OutF() {
@Override
public double getPrice() {
return 153.45;
}
@Override
public String getName() {
return "shit";
}
};
System.out.println(oF.getName());
System.out.println(oF.getPrice());
System.out.println(oF.getClass());
}
}
/*运行结果为:
shit
153.45
class RunC$1
*/
静态内部类
静态内部类是定义在一个类内且加了static关键字的类。静态内部类不能访问外部类的非静态成员变量和方法,因为外部类的非static成员必须通过具体的对象来访问,如果静态内部类可以访问非static的外部类成员,就破坏了这一原则。
class staClass{
private String cls_id;
static class Innersta{
void fun(){
// System.out.println(cls_id);
// 报错Non-static field 'cls_id' cannot be referenced from a static context
}
}
}
Java内部类手机专卖店_Java(20)内部类相关推荐
- Java内部类手机专卖店_Java:内部类
看Thinking in Java中内部类的一章,有内部类和静态内部类,书中把后者叫做嵌套类.常见用法实例: 一般内部类(非静态) 1 public classInnerClassTest {2 pu ...
- Java内部类手机专卖店_JAVA——内部类的那些事儿
obj3.func(); //3.2 访问静态内部类的静态方法(通过类名访问) Outer.StaInner.staFunc(); //4 局部内部类访问局部变量 Outer obj4 = new O ...
- java学习2018年_Java 20年
java学习2018年 二十年前,在苏黎世的一间公寓里发生了两件事. 我的女儿迈出了第一步,一位年轻的博士后研究员(她的父亲)迈出了使用Java的第一步. 很难完全了解当时的Java. 在这些时代,T ...
- java内部类的定义_java定义内部类
package test.jdk; public class InnerTest { private String instAtt = "实例变量"; private static ...
- java中保护类型_java – 当内部类访问受保护的外部类超级时,如何避免“IllegalAccessError”...
我创建了以下类: public class BaseController { protected String field; protected void method() { System.out. ...
- java 随机手机验证码_Java实现随机生成手机短信验证码的简单代码
这篇文章主要介绍了Java随机生成手机短信验证码的方法,涉及Java数学运算计算随机数及字符串操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了Java随机生成手机短信验证码的 ...
- java web 手机验证_Java 手机Web开发 身份验证
Java web和手机端开发 遇到比较麻烦的就是身份验证 目前为止觉得最好的解决方案是 Java 中使用jwt 为什么要使用jwt,让网络数据更加安全,以防其他一些人无意恶搞 在这里简单说下:jwt是 ...
- java虚拟机手机下载_java虚拟机下载
java虚拟机是一款可以运行Java代码的虚拟计算机软件.java虚拟机是根据规格描述将java解释器移植到指定计算机上,就能保证经过用户编译的任何Java代码能够在虚拟系统上完美运行. java虚拟 ...
- java实现手机充电_java – 如何知道手机是否正在充电
我发现的一件事是,如果您的手机具有100%的电池电量,您将无法收到充电通知.有些人意味着充电,而其他人则意味着有外部能力,无论是100%.我把它们混为一体,如果有任何条件,那我就归于真. public ...
最新文章
- 韩国文档的编码方式_像韩国学生学习英语一样学习编码
- 全了!从Python入门到精通
- 一文看懂 AI 训练集、验证集、测试集(附:分割方法+交叉验证)
- 这些知识点你会吗?redis的分布式布隆过滤器含答案解析
- 微众WeCross 跨链平台(12)合约总结
- 去银行贷款,有中介和没中介的巨大差别
- 去除list集合中重复项的几种方法
- 【转】图文详解YUV420数据格式
- android webview 设置cookie时间,解决Android webview设置cookie和cookie丢失的问题
- C++基础知识(四)文件的基本操作
- MapInfo MIF/MID文件格式描述
- 调用DllRegisterServer进行COM组件的注册
- android小米手机拍照功能,小米手机 调用相机拍照后无法返回问题
- 计算机类专业都有什么区别?
- matlab图像自动标注程序,基于MATLAB/GUI的图像语义自动标注系统
- 【渝粤教育】电大中专Windows操作系统_1作业 题库
- STM32G474的启动模式NRST引脚特性
- 一名测试工程师的苦逼感想
- 银行网点WLAN无线认证解决方案
- WWF(Windows Workflow Foundation)的简介
热门文章
- JS中的7种设计模式
- 验证环境中的program为什么必须是automatic
- 机器学习典型步骤以及训练集、验证集和测试集概念
- MySQL 学习笔记(4)— 组合查询、子查询、插入数据、更新/删除表数据、增加/删除表中的列以及重命名表
- [ CodeVS冲杯之路 ] P1116
- 利用JS判断是手机端还是PC端 浏览网站
- 0709 C语言常见误区----------函数指针问题
- Delta3D———通过游戏管理器组件和消息的扩展创建自定义行为 《转》
- 理解面向过程和面向对象的程序设计方法
- 老齐学python的django 源代码_《跟老齐学Python:Django实战》真正的手把手“带”您学习...