当前位置:澳门金莎娱乐网站 > 经济研究 > 集团董事会视察信阳和句容项目,学习笔记20

集团董事会视察信阳和句容项目,学习笔记20

文章作者:经济研究 上传时间:2019-11-13

澳门金莎娱乐网站 1

C 学习之静态成员,学习静态成员

一、静态数据成员

  C 允许将类的数据成员定义为静态成员。静态数据成员是属于类的,整个类只有一个备份,相当于类的全局变量,能够被该类的所有对象共用。

  1.静态成员的声明

  在类数据成员的声明前加上关键字static,就将该成员指定成了静态数据成员。静态数据成员遵守public、private、protected访问权限的限定规则。如:

 1 class Account
 2 {
 3    public:
 4             Account();  //构造函数
 5             ~Account();  //析构函数
 6     //.....................
 7    private:
 8            static int number;  //静态数据成员声明
 9     //.....................
10 }    

  澳门金莎娱乐网站,2.静态数据成员的定义

  在类的声明中将数据成员指定为静态成员,只是一种声明,并不会为该成员分配内存空间,在使用之前应该对他进行定义。静态数据成员常常在类外进行定义,与类成员函数的定义方法一样。定义形式如:  

1 //类型  类名::静态成员名;
2 //类型 类名::静态成员名 = 初始值
3 int Account::number;  //定义静态成员并初始化为0

  注意:(1)在类外定义静态数据成员时,不能加上static限定词

     (2)在定义静态数据成员时可以指定他的初始值,若定义是没有指定初始值,系统将会自动赋上默认值

  3.静态数据成员的访问

  静态成员属于整个类,如果将他定义为类的公有成员,在类外可有两种方式访问。

  a)通过类名访问

    类名::静态成员名

  b)通过对象访问

    对象名.静态成员名

  4.静态数据成员与非静态数据成员的区别

  (1)非静态数据成员与对象关联,每个对象拥有独立的数据成员备份。静态数据成员与类关联,整个类只有一份静态数据成员备份,由全类所有对象共用。(C 会为对象的非静态数据成员分配独立的内存空间,而静态数据成员在内存中则只分配一次)

  (2)非静态数据成员只有在定义了对象之后才存在(也就是分配内存空间)。静态数据成员不属于单个对象,即使没有定义他所属类的任何对象时,就已经存在了。

  (3)非静态数据成员的作用域限定在定义对象的块作用域内,静态数据成员自他的定义开始到程序结束之前有效。

 

二、静态成员函数

  在类成员函数的原型前面加上static就将他定义成了静态成员函数。静态成员函数属于整个类,他只能访问该类的静态成员(包括静态数据成员和静态成员函数),不能访问非静态成员(包括非静态数据成员和非静态成员函数)。

  1.静态成员函数的声明定义

 1 class Account
 2  {
 3     public:
 4              Account();  //构造函数
 5              ~Account();  //析构函数       
 6      //.....................
 7          static int getNumber()  //定义静态成员函数
 8        {
 9           return number; //访问静态数据成员
10        }
11 
12      private:
13             static int number;  //静态数据成员声明
14      //.....................
15  }    

  2.调用方式

  静态成员函数的调用方式有两种:

  a)类调用方式

    类名::静态成员函数名(参数表);

  b)对象调用

    对象名.静态成员函数名(参数表);

  3.特别注意

  (1)和普通成员函数一样,静态成员函数也可以在类内或类外定义,还可以定义成内联函数

  (2)静态函数只能访问静态成员(包括静态数据成员和静态成员函数),不能访问非静态成员(包括非静态数据成员和非静态成员函数)

  (3)在类外定义静态成员函数时,不能加上static限定词

  (4)静态成员函数可以在定义类的任何对象之前被调用,非静态成员只有在定义对象后,通过对象才能访问

 

 

 

 

ps:如果有什么不对的地方,希望各位前辈同行能够批评指出,本人将感激不尽!!!!

一、静态数据成员 C 允许将类的数据成员定义为静态成员。静态数据成员是属于类的,整个类只有一个...

Java学习笔记20---内部类之对成员内部类的补充说明(一),学习笔记20---

上篇文章--笔记19简要介绍了成员内部类、局部内部类和匿名内部类,下面对成员内部类再补充一些内容。

主要有以下6点:

1.成员内部类不可以有静态成员,成员变量为static final时除外

2.外部类不可以直接访问成员内部类的成员变量或调用成员内部类的成员方法

3.成员内部类可以无限制的访问外部类的成员变量、调用外部类的成员方法

4.成员内部类的成员与外部类成员同名时,内部类成员会屏蔽外部类的同名成员

5.成员内部类本身可以由访问权限修饰符修饰

6.成员内部类的成员变量和成员方法也可以由访问权限修饰符修饰

 (注:时间有点晚了,5、6条下篇再写吧)

 

作者: 蝉蝉

请尊重作者劳动成果,转载请在标题注明“转载”字样,并标明原文链接:

 

 

下面分别展开说明:

 

1.成员内部类不可以有静态成员,成员变量为static final除外

示例:

 1     //笔记19:内部类--成员内部类--不能有静态成员,成员变量为static final时除外
 2     class InnerClass {
 3         String name = "li";
 4         String inname;
 5         static String ingender = "female";
 6 
 7         //不能有静态成员,除非声明为static final
 8         void testStFi() {
 9             System.out.println("ingender:"   ingender);
10         }
11         
12         //不能有静态成员方法
13         static void testStFiMeth() {
14             System.out.println("成员内部类的静态成员方法");
15         }
16     }
17 
18     public static void main(String[] args) {
19         
20         Person per = new Person();
21         Person.InnerClass inC = per.new InnerClass();
22         
23         //笔记19:内部类--成员内部类--4不能有静态成员,除非声明为static final
24         inC.testStFi();
25     }

 

编译时会报出下面的错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
The field ingender cannot be declared static in a non-static inner type, unless initialized with a constant expression
The method testStFiMeth cannot be declared static; static methods can only be declared in a static or top level type

 

分析:

(1).根据错误提示,成员内部类不能有静态成员变量,除非该成员由常量表达式初始化;

      大家知道,由static final修饰的成员变量其值不可改变,是编译时常量,所以把

        static String ingender = "female";

      改为:

        static final String ingender = "female";

      再编译就可以通过了。

(2).成员内部类为什么不可以有静态成员变量呢? 

      1).对于外部类来说,当类尚未加载时,访问静态成员变量或创建一个对象都可以引起类的加载,而类加载时就会为静态成员变量分配空间。访问其静态成员变量时,如果类尚未加载,则会先加载类,并为静态成员变量分配空间,然后就可以访问了;如果类已经加载过了,说明静态成员变量已经分配过内存了,直接访问就可以了。所以,外部类不论什么情况下都可以正确的访问其静态成员变量。(参考笔记11)

      2).而对于成员内部类来说,外部类加载时,并不会被自动加载;只有外部类的一个对象在首次创建成员内部类的对象时,才会引起成员内部类的加载。假设成员内部类有静态成员变量,如果在成员内部类加载之前就需要访问其静态成员变量呢?很显然,在类加载之前,其静态成员变量是未分配内存的,这时候要访问的是一个并不存在的变量,就会出错。所以,成员内部类是不能有静态成员变量及静态成员方法的(道理类似)。

      参考图片更直观:

澳门金莎娱乐网站 2

(3).延伸:外部类与成员内部类的加载方式和父类与子类之间的加载方式是不一样的

      1).成员内部类与外部类是附属与被附属的关系,必须通过外部类对象来创建成员内部类的对象,所以可以先加载外部类,等需要的时候再加载成员内部类。且一个外部类对象可以创建多个内部类对象,是一对多的关系。最近每天睡觉前小姑娘都要听“泥娃娃”,“泥娃娃,泥娃娃,一个泥娃娃,一样的眉毛,一样的眼睛,眼睛不会眨...”。泥娃娃像人一样,但又比人少了点什么,就把人看成外部类,泥娃娃就是人的成员内部类,哈哈,人创造了泥娃娃,而且可以创造多种多样的泥娃娃。

      2).而子类与父类是is-a的关系,两个类相互独立,但可以看成子类对象里隐含了一个父类对象。首次使用子类时,要先加载父类并为其静态成员变量分配内存,再加载子类并为其静态成员变量分配内存,然后依次初始化成员变量,调用构造方法等等(可参考笔记11)。所以这里父类子、类都要加载。

      几者的关系见下图:

澳门金莎娱乐网站 3

 

 

2.外部类不可以直接访问成员内部类的成员变量或调用成员内部类的成员方法

示例:

类Person中定义了一个成员内部类InnerClass,Person的成员方法outerCAccessinC访问InnerClass的成员变量inname。

 1     //成员内部类
 2     class InnerClass {
 3         String name = "li";
 4         String inname;
 5 
 6       void printInC() {
 7             System.out.println("inner class");
 8         }
 9     }
10 
11     //笔记19:内部类--成员内部类--外部类能访问内部类成员变量、调用成员方法吗?
12     public void outerCAccessinC() {
13         System.out.println("inname:"   inname);
14     }
15 
16     public static void main(String[] args) {
17         
18         Person per = new Person();
19         
20         //笔记19:内部类--成员内部类--外部类不能访问内部类成员变量或调用成员方法
21         per.outerCAccessinC();
22         per.printInC();
23     }

 

结果出现下述错误:

  第13行提示如下的错误:

  inname cannot be resolved to a variable

  22行提示如下的错误:

  The method printInC() is undefined for the type Person

 

这说明外部类是无法直接访问成员内部类的成员变量或成员方法的。

 

反面来看,假如外部类可以直接访问成员内部类的成员,还以上面的程序为例,创建一个Person类对象per,per调用方法outerCAccessinC,由于这时尚未创建成员内部类的对象,其成员变量当然也没有分配空间,这时per将访问一个不存在的变量inname,这是不允许的。

所以成员内部类的成员对外部类是不可见的,外部类是无法直接访问成员内部类的成员的。

 

3.成员内部类可以无限制访问外部类的成员变量及调用外部类的成员方法

 示例:

类Person定义了若干个成员变量及一个成员内部类InnerClass。成员内部类InnerClass中定义了成员方法testVarMeth,testVarMeth访问及调用了外部类Person的多个成员变量和成员方法。

    String name;
    int age;
    String gender;

    public String education; //防问权限修饰符
    private String hobby;
    protected String residence;

    static String citizenship = "Chinese";

    class InnerClass {

        void testVarMeth() {
            System.out.println("name:"   name);
            System.out.println("education:"   education);
            System.out.println("hobby:"   hobby);
            System.out.println("residence:"   residence);
            System.out.println("citizenship:"   citizenship);
            System.out.println("age:"   getAge());
            System.out.println("gender:"   getGender());
        }
    }

    public static void main(String[] args) {

        Person per = new Person();
        Person.InnerClass inC = per.new InnerClass();

        //笔记19:内部类--成员内部类--内部类访问外部类成员变量、调用成员方法
        inC.testVarMeth();
    }

 

输出结果为:

name:null
education:null
hobby:null
residence:null
citizenship:Chinese
age:0
gender:null

 

从结果可以看出,成员内部类可以随意访问或调用外部类的成员变量或成员方法,与访问权限及类型等都没有关系。

 

4.成员内部类的成员与外部类成员同名时,内部类成员会屏蔽外部类的同名成员

 示例:

对2中的程序稍加修改,为成员内部类InnerClass添加一个与Person同名的成员变量name:

String name = "li";

再执行程序的话,输出结果变为:

name:li
education:null
hobby:null
residence:null
citizenship:Chinese
age:0
gender:null

 

可以看出,如果成员内部类与外部类有同名的成员的话,成员内部类内部会屏蔽掉外部类的同名成员,也即,外部类的同名成员对成员内部类是不可见的。

上篇文章--笔记19简要介绍了成员内部类、局部内部类和匿名内部类,...

本文由澳门金莎娱乐网站发布于经济研究,转载请注明出处:集团董事会视察信阳和句容项目,学习笔记20

关键词: