返回顶部
首页 > 资讯 > 精选 >Java编程思想(2nd)学习笔记(8)-2 (转)
  • 566
分享到

Java编程思想(2nd)学习笔记(8)-2 (转)

2023-06-03 04:06:54 566人浏览 八月长安
摘要

Java编程思想(2nd)学习笔记(8)-2 (转)[@more@]二.  Inner classes(内隐类)1.  内隐类的基本用法1)  如果要在外围class的non-static函数之外产生一个inn

Java编程思想(2nd)学习笔记(8)-2 (转)[@more@]

二.  Inner classes(内隐类)

1.  内隐类的基本用法

1)  如果要在外围class的non-static函数之外产生一个inner class对象,得以OuterClassName.InnerClassName的形式指定该对象的型别。而在non-static函数内则不用。

public class ExplicitStatic{

  class Contents{

  private int i = 11;

  public int value() { return i; }

  }

  class Destination{

  private String label;

  Destination(String whereTo){

  label = whereTo;

  }

  String readLabel() { return label; }

  }

  public Destination to(String s){

  //在outer class的non-static函数中可直接产生inner class对象

  return new Destination(s); //(1

  }

  public Contents cont(){

  return new Contents(); //(1

  }

  public void ship(String dest){

//在outer class的non-static函数中可直接通过InnerClassName

//来指定对象型别

  Contents c = cont();

  Destination d = to(dest);

  System.out.println(d.readLabel());

  }

  public static void main(String[] args){

  ExplicitStatic p = new ExplicitStatic();

  p.ship("Tanzania");

  ExplicitStatic q = new ExplicitStatic();

  //在outer class的非non-static函数内产生inner class对象

  ExplicitStatic.Contents c = q.cont();

  ExplicitStatic.Destination d = q.to("Borneo");

  //不能在static函数直接生成inner class对象

// new Contents();

  }

}

2)  对于non-static inner class,在外围class的non-static函数可以通过new产生一个inner class对象,如上面的(1)处。但要在非non-static函数产生一个inner class对象,则一定要关联到其enclosing class的某个对象。

3)  inner class的向上转型

当把一个inner class对象向上转型成为interface时,我们得到的只是一个reference。

interface Destination{

  String readLabel();

}

interface Contents{

  int value();

}

class Parcel3{

  private class PContents implements Contents{

  private int i = 11;

  public int value() { return i; }

  }

  protected class PDestination implements Destination{

  private String label;

  PDestination(String whereTo){

  label = whereTo;

  }

  public String readLabel() { return label; }

  }

  public Destination to(String s){

  return new PDestination(s);

  }

  public Contents cont(){

  return new PContents();

  }

}

public class ExplicitStatic{ 

  public static void main(String[] args){

  Parcel3 p = new Parcel3();

  //把inner class对象向上转型

  Contents c = p.cont();

  Destination d = p.to("Borneo"); 

  }

}

虽然我们不能在ExplicitStatic class无法调用Pcontents class,但我们把一个Pcontents class对象向上转型为Contents,就可对之进行调用。

4)  inner class的作用域为定义该inner class的SCOpe内。但inner class可在它的作用域之外被继承(见4)。

interface Contents{

  int value();

}

class Parcel3{

  //PContents1 class的作用域为Parcel3 class内

  private class PContents1 implements Contents{

  private int i = 11;

  public int value() { return i; }

  }

  public Contents cont1(){

  return new PContents1();

  }

  public Contents cont2(){

  //PContents2 class的作用域为函数cont2内

  class PContents2 implements Contents{

  private int i = 11;

  public int value() { return i; }

  }

  return new PContents2();

  }

  //不能在函数cont2外使用PContents2 class

 

  public Contents cont3(boolean b){

  if(b){

  //PContents3 class的作用域为当前if内

  class PContents3 implements Contents{

  private int i = 11;

  public int value() { return i; }

  }

  return new PContents3();

  }

  //不能在if外使用PContents3 class

  //return new PContents3();

  return null;

  }

}

public class ExplicitStatic{ 

  public static void main(String[] args){

   Parcel3 p = new Parcel3();

  Contents c1 = p.cont1();

  Contents c2 = p.cont2();

  Contents c3 = p.cont3(true);

  }

}

2.  内隐类与外围enclosing  class的连接关系

2.1 non-static inner class

1)  inner class可以访问enclosing class的所有成员(包括private成员),就像inner class自己拥有这些成员一样。即inner class天生具有对enclosing class的所有成员的访问权力。

2)  Inner class对象被产生时,一定要关联到其enclosing class的某个对象(这个enclosing class对象就是Inner class对象的制造者)。建构inner class对象的同时,得有其enclosing class对象的reference才行。

原因:因为inner class可以访问enclosing class的所有成员,那么当产生一个inner class时,编译器会自动为inner class对象添加一个指向enclosing class对象的reference(这个reference是隐藏的)。所以Inner class被产生时,一定要关联到其enclosing class的某个对象。

3)  同一个enclosing class对象产生出来的inner class对象访问的是同一个enclosing class对象中的成员。

interface Destination{

  String readLabel();

}

interface Contents{

  int value(); 

}

class Parcel3{

  int i1 = 10;

  private String s1 = "Parcel3_";

  Parcel3(String s){

  s1 += s;

  }

  private class PContents implements Contents{

  //可调用enclosing class的成员 1

  private int i2 = i1;

   private String s2 = s1;

  PContents(int num){

  System.out.println("" + num + ": i2 = " + i2 + ",s2 = " + s2);

  }

  public int value() { return 1; }

  }

  public Contents cont(int i){

  return new PContents(i);

  }

}

public class ExplicitStatic{ 

  public static void main(String[] args){

  Parcel3 p1 = new Parcel3("1");

  Contents c1 = p1.cont(1); 

  Contents c2 = p1.cont(2);

  Parcel3 p2 = new Parcel3("2");

  c2 = p2.cont(3);

  c2 = p1.cont(4);

  }

}

结果为:

1: i2 = 10,s2 = Parcel3_1

2: i2 = 10,s2 = Parcel3_1

3: i2 = 10,s2 = Parcel3_2

4: i2 = 10,s2 = Parcel3_1

在(1)在inner class调用了enclosing class的成员。结果表明,同一个enclosing class对象p1产生的inner class对象调用的是同一个enclosing class对象中的成员,如结果中的1、2、4。

  2.2  Static inner classes(静态内隐类)

1)  产生Static inner classes对象时,不需要同时存在一个enclosing class对象

2)  只能在Static inner classes对象中访问enclosing class中的静态成员。

interface Contents{

  int value(); 

}

class Parcel1{

private static String s1 = "Parcel3_";

private String s11 = “Parcel3_”;

  Parcel1(String s){

  s1 += s;

  }

protected static class PContents implements Contents{

//只能访问enclosing class中的s1

  String s2 = s1;

//s11不是static成员,不能访问

//String 22 = s11;

  PContents(int num){

  System.out.println("" + num + ":s2 = " + s2);

  }

  public int value() { return 1; }

  }

  public static  Contents cont(int i){

  return new PContents(i);

  }

}

public class ExplicitStatic{ 

  public static void main(String[] args){

  Parcel1 p1 = new Parcel1("1");

  Contents c1 = p1.cont(1); 

  c1 = Parcel1.cont(2);  //(1)

  Parcel1 p2 = new Parcel1("2");

  c1 = p2.cont(3);

  c1 = Parcel1.cont(4); //(1)

  }

}

因为内隐类Pcontents class是静态的,所以在(1)处不通过enclosing class对象而是通过静态函数来直接产生其对象。

2.3  无论inner class被嵌套置放的层次有多深,且所有outer class的成员都可

被它访问。

class MNA{

  private void f() {}

  class A{

  private void g() {}

  class B{

  void h(){

  g();

  f();

  }

  }

  }


--结束END--

本文标题: Java编程思想(2nd)学习笔记(8)-2 (转)

本文链接: https://lsjlt.com/news/232796.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java编程思想(2nd)学习笔记(8)-2 (转)
    Java编程思想(2nd)学习笔记(8)-2 (转)[@more@]二.  Inner classes(内隐类)1.  内隐类的基本用法1)  如果要在外围class的non-static函数之外产生一个inn...
    99+
    2023-06-03
  • Java编程思想学习笔记2 - 字节流和字符流
    《Thinking in Java》第18章的内容是相当丰富精彩的,也在网络学习参考了很多前辈们的笔记,个人由于能力有限(毕竟和大神Bruce Eckel的能力相差甚远),将这一章的内容分三个部分来写,希望能够慢慢品味和领悟Java IO的...
    99+
    2023-06-02
  • 《Java编程思想》学习笔记03、控制程序流
    大部分操作符只能操作基本类型(primitives),只有=、==和!=可以操作对象,另外String支持+和+=在=两边,右值(rvalue)可以是常数、变量或表达式,左值(lvalue)必须是一个变量,即必须有物理空间来存储rvalue...
    99+
    2023-06-03
  • JAVA学习笔记- - - day 2
     💕前言:作者是一名正在学习JAVA的初学者,每天分享自己的学习笔记,希望能和大家一起进步成长💕 目录  💕前言:作者是一名正在学习JAVA的初学者,每天分享自己的学习笔记,希望能和...
    99+
    2023-09-04
    学习
  • JAVA编程学习笔记
    常用代码、特定函数、复杂概念、特定功能……在学习编程的过程中你会记录下哪些内容?快来分享你的笔记,一起切磋进步吧! 一、常用代码 在java编程中常用需要储备的就是工具类。包括封装的时间工具类。htt...
    99+
    2023-09-03
    java 学习 笔记
  • JAVA编程思想笔记 : 复用类
    复用代码是 Java 众多引人注目的功能之一.但是想要成为机具革命性的语言,仅仅能复制代码并对之加以改变是不够的,它还必须能够做更多的事情.组合语法只需将对象引用置于新类中即可.初始化引用位置定义对象的地方,他们总是能够在构造器被调用之前初...
    99+
    2021-03-31
    java教程 JAVA
  • Android学习笔记(Android Studio)2-6~2-8(CheckBox、ImageView、ListView )
    Android学习笔记2-6~2-8 推荐新手向学习视频:B站https://www.bilibili.com/video/av3840996...
    99+
    2022-06-06
    android学习 Android Studio checkbox studio listview Android
  • 学点Java里的编程思想(r12笔记第65天)
       按照自己之前的计划,我觉得得看看关于开发的东西了,因为我对于并发,锁的认知总是有一个局限性,自己也在地铁上做了些功课。有了这个想法,再有拿起书的勇气,那就是一个开始了。   每个圈子都有自己喜爱...
    99+
    2023-06-03
  • 想学习 go 编程?这些 shell 学习笔记能帮到你吗?
    想学习 Go 编程?这些 Shell 学习笔记能帮到你吗? Go 语言是一个非常流行的编程语言,它的设计目标是让程序员能够轻松地编写高效、可靠的软件。而 Shell 编程则是一种用于编写脚本的语言,它可以帮助你自动化和简化工作流程。 在本文...
    99+
    2023-08-03
    教程 shell 学习笔记
  • java大数据最全课程学习笔记(2)-
    目前CSDN,云海天,简书同步发表中,更多精彩欢迎访问我的gitee pages 目录Hadoop完全分布式运行模式步骤分析:编写集群分发脚本xsync集群配置集群部署规划配置集群集群单点启动SSH无密登陆配置登录状态的环境变...
    99+
    2021-07-11
    java大数据最全课程学习笔记(2)-
  • 想要学习 Go 编程吗?试试这些 Linux 算法学习笔记!
    如果你对 Go 编程感兴趣,那么你需要一些学习笔记来帮助你更好地掌握这门语言。而对于 Linux 算法,你也需要一些学习笔记来更好地掌握它们。本文将介绍一些关于 Linux 算法学习笔记的内容,以帮助你更好地学习 Go 编程。 一、什么是 ...
    99+
    2023-09-23
    编程算法 linux 学习笔记
  • 想要学习 Java 编程算法框架吗?这些学习笔记或许能帮到你!
    Java 编程算法框架是 Java 开发领域中非常重要的一部分,它涉及到很多基础的编程概念和技术。如果你想要学习 Java 编程算法框架,那么本文将会为你提供一些非常实用的学习笔记和代码演示,帮助你快速入门。 一、算法框架的基础概念 在开始...
    99+
    2023-10-21
    编程算法 框架 学习笔记
  • Java多线程学习笔记
    目录多任务、多线程程序、进程、线程学着看jdk文档线程的创建1.继承Thread类2.实现Runable接口理解并发的场景龟兔赛跑场景实现callable接口理解函数式接口理解线程的...
    99+
    2024-04-02
  • 想要成为编程算法大师?学习Java和NumPy笔记是关键!
    在现代世界中,数据处理变得越来越重要。从金融业到医疗保健,从科学研究到营销,数据分析和处理已经变成了各个领域中不可或缺的一部分。在这个背景下,编程算法的重要性也变得愈加显著。然而,成为一位优秀的编程算法大师并不是一件容易的事情。为了成为一...
    99+
    2023-09-06
    numpy 学习笔记 编程算法
  • linux shell编程学习笔记(3)
    1、什么是变量保存变化的数据——变量名:名称固定,由系统预设或用户自定义——变量值:根据用户设置、系统环境变化而变化2、如何定义变量——变量名=变量的值2.1变量名的规则(1)数字、字母、下划线(2)字母区分大小写(3)当变量名相同时,后赋...
    99+
    2023-01-31
    学习笔记 linux shell
  • 学习异步编程:Java和JavaScript笔记对比
    异步编程是现代编程语言中的重要概念,它可以让程序在执行长时间的操作时不会被阻塞。Java和JavaScript都是广泛使用的编程语言,它们都支持异步编程。本文将比较Java和JavaScript中异步编程的不同方法,并提供一些示例代码来帮...
    99+
    2023-09-10
    javascript 学习笔记 异步编程
  • 如何在 Windows 上学习 Java 编程?分享我的学习笔记!
    在当今数字化时代,计算机编程已经成为一项越来越重要的技能。而 Java 编程语言则是其中最受欢迎和广泛使用的一种语言。在 Windows 系统上学习 Java 编程,无疑是一条高效而且实用的学习路径。在本篇文章中,我将分享我的学习笔记,希望...
    99+
    2023-10-09
    windows 学习笔记 日志
  • NodeJS学习笔记之网络编程
    Node提供丰富的网络编程模块 Node模块 协议 net TCP dgram ...
    99+
    2022-06-04
    学习笔记 网络编程 NodeJS
  • JUC 并发编程学习笔记(总)
    文章目录 1. 什么是JUC2. 进程和线程2.1 进程2.2 线程2.3 并发2.4 并行2.5 线程的状态2.6 wait 和 sleep 的区别 3. Lock锁(重点)3.1 传统Synchronized3.2 Lock...
    99+
    2023-08-18
    java JUC
  • 想学习 Go 编程?别错过这份 Linux 开发技术笔记!
    Go 编程语言是一种由 Google 开发的开源编程语言,它兼具了 C++ 的效率与 Python 的易用性。如果你想学习 Go 编程,本文会向你介绍一份非常优秀的 Linux 开发技术笔记,并且在文章中也会穿插一些演示代码。 这份 Li...
    99+
    2023-11-02
    学习笔记 linux 开发技术
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作