Static 静态内部类

Java中的类可以是static吗?答案是可以。在java中我们可以有静态实例变量、静态方法、静态块。类也可以是静态的。

java允许我们在一个类里面定义静态类。比如内部类(nested class)。把nested class封闭起来的类叫外部类。在java中,我们不能用static修饰顶级类(top level class)。只有内部类可以为static。

静态内部类和非静态内部类之间到底有什么不同呢?下面是两者间主要的不同。

(1)内部静态类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的引用。

(2)非静态内部类能够访问外部类的静态和非静态成员。静态类不能访问外部类的非静态成员。他只能访问外部类的静态成员。

(3)一个非静态内部类不能脱离外部类实体被创建,一个非静态内部类可以访问外部类的数据和方法,因为他就在外部类里面。

基于上面的讨论,我们可以通过这些特性让编程更简单、有效。

/* 下面程序演示如何在java中创建静态内部类和非静态内部类 */
class OuterClass{
   private static String msg = "GeeksForGeeks";

   // 静态内部类
   public static class NestedStaticClass{

       // 静态内部类只能访问外部类的静态成员
       public void printMessage() {

         // 试着将msg改成非静态的,这将导致编译错误
         System.out.println("Message from nested static class: " + msg);
       }
    }

    // 非静态内部类
    public class InnerClass{

       // 不管是静态方法还是非静态方法都可以在非静态内部类中访问
       public void display(){
          System.out.println("Message from non-static nested class: "+ msg);
       }
    }
} 

class Main
{
    // 怎么创建静态内部类和非静态内部类的实例
    public static void main(String args[]){

       // 创建静态内部类的实例
       OuterClass.NestedStaticClass printer = new OuterClass.NestedStaticClass();

       // 创建静态内部类的非静态方法
       printer.printMessage();   

       // 为了创建非静态内部类,我们需要外部类的实例
       OuterClass outer = new OuterClass();
       OuterClass.InnerClass inner  = outer.new InnerClass();

       // 调用非静态内部类的非静态方法
       inner.display();

       // 我们也可以结合以上步骤,一步创建的内部类实例
       OuterClass.InnerClass innerObject = new OuterClass().new InnerClass();

       // 同样我们现在可以调用内部类方法
       innerObject.display();
    }
}

时间: 2024-08-02 12:04:49

Static 静态内部类的相关文章

2016.02.24总结

今天学习了JavaOO上册中的第8章,类的高级概念,其中的要点有: 1. 动态绑定:父类的引用可以指向子类的对象,但只能用子类中的父类部分的属性和方法. 2. 访问修饰符(可用于修饰属性,方法,类): private:只能用在本类中: 默认访问修饰符:可以用在本类,同包的子类和非子类中: protected:可以用在本类,同包的子类和非子类,以及不同包的子类中: public:可以用在所有类中. 3. OOP的封装就是通过访问修饰符来实现的,一般类中属性都设为私有的,并通过编写相应的getter

2、面向对象

三大特性: 1.多态:方法的重载(同一类中方法名相同,参数列表不同).重写/覆盖(父子中,方法名.形参列表相同,子类返回值类型比父类返回值类型相等或者更小,子类的访问权限应              比父类的更大或相等) 2.继承:extends,代码复用 3.封装:隐藏类的内部属性和实现,对外提供公共访问方式,外界通过setter.getter(setAbc对应abc)方法访问. 匿名对象:调用一次的时候使用 new Person().eat(); 构造方法:初始化对象的时候调用,没有系统会提

Handler机制原理

首先说说Handler 使用中隐藏的坑 1.delay的时间过长,导致 activity未被回收内存泄漏以及逻辑错误 可以将Handler携程static静态内部类,或者而降handler中引用的activity位软引用 2.new 了过多的message,导致内存泄漏,应该在处理后remove这些msg 3.Activity finish()后应该remove所有的msg和runable -----------------------------------------------------

关于Java内部类的一些知识

成员内部类: 相当于类的非静态成员,可以用权限修饰符来修饰,包括private.protected.public. 1.定义成员内部类 class Outter { //非静态内部类 class Inner { //内部类成员 int i = 12; } //外部类的普通成员 int j = 0; } 2.外部类之内创建成员内部类对象 语法和普通的创建对象相同,用new操作符调用相应的构造方法即可.注意的是,非静态内部类属于外部类的非静态成员,不能在静态上下文使用. 例子: class Outt

java 反射技术

什么是反射?反射就是将字节码中的各种成分映射到相应的java类中来,java反射技术自JDK1.1以来就出现了,目前大多数流行的框架都采用了这种技术,可见其重要性,这篇文章将详细介绍我对java反射技术的一些研究. 代表字节码对象的Class java中所有的类都有自己特有的一份字节码,当程序调用该类时,JVM便会将这份字节码装载到内存中来.在java中主要有三种方法来得到相应的字节码对象. 通过类的实例的getClass()方法获取,如 Class clazz=new Date().getCl

Java核心技术 第六章 接口和内部类

Java核心技术  第六章  接口与内部类 接口: 任何实现Comparable接口的类都需要包含compareTo方法,并且这个方法的参数必须是一个Object对象,返回一个整数数值. 在Java SE 5.0中,Comparable接口已经改进为泛型类型. 接口中所有的方法自动的属于public.因此,在接口中声明方法时,不必提供关键字public. 接口中决不能含有实例域,也不能在接口中实现方法. 要让一个类使用排序服务,必须让它实现compareTo方法,因此必须实现Comparable

Java 继承详解

什么是继承? 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 多个类可以称为子类,单独这个类称为父类.超类或者基类. 子类可以直接访问父类中的非私有的属性和行为. 通过 extends 关键字让类与类之间产生继承关系. class SubDemo extends Demo{} //SubDemo是子类,Demo是父类 继承有什么好处? 提高代码的复用性. 让类与类之间产生了关系,是多态的前提. 继承的特点 1.Java只支持单

疯狂Java学习笔记(83)----------继承详解

有一段时间没有更新博客了,感觉挺愧疚的,这两天忙着考试,实在没有办法,只能放一放了,还好自己复习的还不错,闲的没事,跟两篇博文,来能弥补一下空虚! 言归正传! 什么是继承? 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 多个类可以称为子类,单独这个类称为父类.超类或者基类. 子类可以直接访问父类中的非私有的属性和行为. 通过 extends 关键字让类与类之间产生继承关系. class SubDemo extends Dem

java中关于内部类的一些总结

/** * 问题:java学习之---------->java的内部类 * 首先什么叫内部类:所谓的内部类就是在一个类的内部再定义一个类 * 这个类就叫做内部类 * 内部类与类的成员一样有static类.private/public类 * 还有两种一个是局部内部类.匿名内部类 * 它们之间的差别只要在于与主类之间的访问方式及权限的问题 * 比如成员内部类---->既可以访问主类的成员,切主类也能访问它的成员 * -----------------------------------------