Java面向对象—嵌套类、内部类、匿名类

一、static静态

在《Java编程思想》有这样一段话:
  “static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”
  这段话说明了static方法的特殊之处,也看出static关键字的基本作用,简而言之,一句话来描述就是:
  方便在没有创建对象的情况下来进行调用(方法/变量)。
很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。

  1. static修饰的变量:在我们平时的使用当中,static最常用的功能就是修饰类的属性和方法,让他们成为类的成员属性和方法,我们通常将用static修饰的成员称为类成员或者静态成员。注意,static只能修饰成员变量,不可以修饰局部变量。
 public String name;public static int age;
     Student s=new Student();s.name="张三";s.age=12;Student s1=new Student();s1.name="李四";s1.age=15;System.out.println(s.name+"今年"+s.age+"岁了");System.out.println(s1.name+"今年"+s1.age+"岁了");

注:当成员变量为静态变量时,那么它的值是存储在内存的静态区中,所以赋值时会变成一个值。

  1. static修饰的方法:static的另一个作用,就是修饰成员方法。static修饰成员方法最大的作用,就是可以使用"类名.方法名"的方式操作方法,避免了先要new出对象的繁琐和资源消耗,我们可能会经常在帮助类或工具类中看到它的使用。
 public static void say() {System.out.println("我是一名学生");}
 Student.say();

注:当方法为静态方法时,那么它可以直接使用类名获取方法,main方法是我们常见的静态方法。

二、嵌套类

在 Java 语言中允许在另外一个类中定义一个类,这样的类被称为嵌套类。包含嵌套类的类称为外部类,也可以叫做封闭类,在本文中统一叫做外部类。

//学生类
public class Student {//优等生类class kind{}}

嵌套类分为两类:

  • 静态嵌套类:使用static声明,一般称为嵌套类。
  • 非静态嵌套类:非static声明,一般称为内部类。
//学生类
public class Student {public String name;public static int age;//优等生类static class kind{String techang;}//普通生类class weak{String youdian;}}
     Student.kind k=new Student.kind();k.techang="唱歌";System.out.println(k.techang);

嵌套类是它的外部类的成员,非静态嵌套类(内部类)可以访问外部类的其他成员,即使该成员是私有的。而静态嵌套类只能访问外部类的静态成员。

嵌套类作为外部类的一个成员,可以被声明为:private,public,protected或者包范围(注意:外部类只能被声明为public或者包范围)。

嵌套类特点:

  • 嵌套类可以访问外部类的所有数据成员和方法,即使它是私有的。
  • 提高可读性和可维护性:因为如果一个类只对另外一个类可用,那么将它们放在一起,这更便于理解和维护。
  • 提高封装性:给定两个类A和B,如果需要访问A类中的私有成员,则可以将B类封装在A类中,这样不仅可以使得B类可以访问A类中的私有成员,并且可以在外部隐藏B类本身。
  • 减少代码的编写量。

1、静态嵌套类
静态嵌套类其实就是在顶级类中封装的一个顶级类,它的行为和顶级类一样,它被封装在顶级类中其实就是为了方便打包。

  • 静态嵌套类是外部类的静态成员,它可以直接使用外部类名.静态嵌套类名访问自身。
  • 它可以访问外部类的静态成员和静态私有成员。
  • 与其他类一样,静态嵌套类不能访问非静态成员。
//学生类
public class Student {public String name;public static int age=12;//优等生类static class kind{String techang;static void say() {System.out.println(age);}}//普通生类class weak{String youdian;}}
Student.kind.say();

2、非静态嵌套类
非静态嵌套类也就是内部类,它有以下几个特点:

  • 实例化内部类必须先实例化一个外部类。
  • 内部类实例与外部类实例相关联,所有不能在内部类中定义任何静态成员。
  • 内部类是非静态的。
    非静态嵌套类包括:成员内部类、局部内部类、匿名内部类

成员内部类:
在外部类中并且在外部类的方法外创建的非静态嵌套类,称为成员内部类。说白了成员内部类就是外部类的一个非静态成员而已。
创建成员内部类的实例,你必须先实例化一个外部类,接着,通过外部类的实例来创建成员内部类的实例。因此成员内部类的实例必须存在于一个外部类的实例中。另外,由于内部类的实例与外部类的实例相关联,因此它不能定义任何静态成员。

局部内部类:
局部内部类(Local inner class)通常定义在一个块中。所以通常你会在一个方法块中找到局部内部类。正如局部变量那样,局部内部类的作用域受到方法的限制。它可以访问外部类的所有成员,和它所在的局部方法中所有局部变量。如果你想调用局部内部类中的方法,你必须先在局部方法中实例化局部内部类。

局部内部类限制:

  • 无法从方法外部调用局部内部类
  • 局部内部类不能被声明为private, public, protected
  • 在JDK1.7之前局部内部类不能访问非final的局部变量,但是在JDK1.8及之后是可以访问非final的局部变量的。

匿名内部类:
匿名内部类,可以理解为不需要声明类的对象,直接使用类的内容。
在使用匿名内部类的过程中,我们需要注意如下几点:

  • 使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
  • 匿名内部类中是不能定义构造函数的。
  • 匿名内部类中不能存在任何的静态成员变量和静态方法。
  • 匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
  • 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

Java基础学习第十三讲:Java面向对象---嵌套类相关推荐

  1. Java基础学习——第十四章 网络编程

    Java基础学习--第十四章 网络编程 一.网络编程概述 计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信 ...

  2. Java基础学习——第十六章 Java8新特性

    Java基础学习--第十六章 Java8 新特性 Java8(JDK8.0)较 JDK7.0 有很多变化或者说是优化,比如 interface 里可以有静态方法和默认方法,并且可以有方法体,这一点就颠 ...

  3. Java基础学习第十二讲:Java面向对象---抽象类和接口

    Java面向对象-抽象类和接口 一.抽象类 抽象的定义: 我们在日常生活中,经常通过总结一些事物的共性来对事物进行分类,这种共性可能是一些相同的属性,也可能是一些相同的动作.通过总结,我们能够清晰的划 ...

  4. Java基础学习总结(6)——面向对象

    2019独角兽企业重金招聘Python工程师标准>>> 一.JAVA类的定义 JAVA里面有class关键字定义一个类,后面加上自定义的类名即可.如这里定义的person类,使用cl ...

  5. Java基础学习第二十讲:Java序列化

    Java序列化 一.序列化和反序列化 序列化:指堆内存中的java对象数据,通过某种方式把对存储到磁盘文件中,或者传递给其他网络节点(网络传输).这个过程称为序列化,通常是指将数据结构或对象转化成二进 ...

  6. Java基础学习第十八讲:Java异常

    Java异常 Java 中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行程序的正常指令流.为了能够及时有效地处理程序中的运行错误,Java中引入了异常类的概念. ...

  7. 夯实Java基础(二十)——JAVA正则表达式

    1.为什么要用正则表达式 首先我们先来做一道题目:判断一个字符串是否由数字组成.代码示例如下: 1 public class Test { 2 public static void main(Stri ...

  8. Java基础学习第二讲:Java数据类型,变量及常量

    Java数据类型,变量及常量 一.Java数据类型 1.什么是数据类型? 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式. 2.为什么要用到数据类型? ...

  9. Java基础学习第十天(抽象类、值交换)

    一.抽象类 1.抽象类的应用场景 我们在描述一类事物的时候,发现该种事物确实存在着某种行为,但是这种行为目前是不具体的,那么我们可以抽取这种行为的声明,但是不去实现该种行为,这时候这种行为我们称作为抽 ...

最新文章

  1. Android:如何添加一个页面,如何跳转页面
  2. 没看完这11 条,别说你精通 Python 装饰器
  3. Openlayers中使用Image的rotation实现车辆定位导航带转角(判断车辆图片旋转角度)
  4. Java将中文姓名转换为拼音
  5. 修改input的placeholder颜色
  6. 离群值如何处理_有理处理离群值的局限性
  7. python 经典100例 (61-80)
  8. 百万级别长连接,并发测试指南
  9. API功能测试如何实施(转载自测试之道 微信公众号)
  10. linux使用RAM_DISK根文件系统基本过程
  11. Packet Tracert 5.0 使用教程
  12. 手把手教你protel 99se 入门
  13. 便携式频谱仪无人机机载频谱仪解决方案
  14. MySQL技术:数据库逻辑结构单元
  15. 洛谷P2184——贪婪大陆
  16. 顶尖电子秤ls6恢复出厂_顶尖LS6(X)条码秤调试教程
  17. PG如何影响数据分布
  18. 苹果MACOS电脑MAC地址修改的方法
  19. 系统架构设计——伸缩性架构
  20. Python+Vue计算机毕业设计BeatHouse伴奏交易平台z19pu(源码+程序+LW+部署)

热门文章

  1. 利用UU对GitHub国内加速优化访问
  2. 手机系统日历如何与备忘录中的待办任务联动同步
  3. 《深入设计模式》笔记 -创建型模式二、工厂方法模式
  4. 【Python】Pyinstaller打包路径配置(Failed to execute script ‘app‘ due to unhandled exception已解决)
  5. 永磁同步电机恒压频比(V/F)开环控制系统Matlab/Simulink仿真分析及代码生成到工程实现(二)
  6. mac系统下取消AppStore正在下载程序
  7. java备忘录模式_Java设计模式之备忘录模式
  8. 整蛊朋友的 Python 程序
  9. python100行代码实现的整蛊小游戏
  10. 有些句子,比人还美!真的