类与对象( 二 )--静态和内部类

这些只是我在这方面所学到的一些皮毛,整理的粗糙,请多指教。

静态

静态成员修饰的成员与一般的成员区别:

一般的成员是每个对象有一份数据,而静态成员是属于类的,即所有对象所共享;

一般成员的访问方式:对象名.成员名;而静态成员的访问方式:类名.成员名。

如下案例:

public class Student {
    //公有的就定义成静态的
    private String name;//姓名
    private int age;//年龄
    private int count;//班级人数

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        count ++;//每执行一次,人数加一
    }
    public void printClassInfo(){
        System.out.println("班级人数:"+count);
    }
        public static void main(String[] args) {
            Student s1 = new Student("陈安安",18);
            Student s2 = new Student("田娜娜",17);
            Student s3 = new Student("小安安",19);
            s1.printClassInfo();
            s2.printClassInfo();
            s3.printClassInfo();
        }

    }

输出结果是:

执行上述代码,创建了三个学生,本来预期输出班纳吉信息人数应为3人,但实际结果是1人,为什么?

因为姓名是每个学生一份,但班级人数不应该是个体属性,而是整体属性。

修改上面代码如下即可:

private static int count;

上面的this是“这个”,“当前”的意思,每个成员方法都隐含一个参数(this),比如:

System.out.println("学号:"+sno);
//严格来讲,应该写成
System.out.println("学号:"+this.sno);

对于一般的成员变量,是在构造函数中初始化,那么静态成员变量在哪初始化?能否也在构造函数中初始化呢?

不能,因为每次实例化对象时,都要执行构造函数(可能多次),但静态成员是整个类共享的,只需要初始化一次,所以不能在构造函数中初始化,只能在静态代码块中书写。如下:

/**
 * 静态代码块
 */
static {
    className = "Java班";
    classroom = "5号教室";
    count = 0;
}

静态常量?静态成员变量?静态成员方法?静态代码块?

静态方法没有this,因为静态成员属于整个类,它是共享的,所以没有this,而一般成员每使用一次调用一次。

静态方法中只能访问静态成员。如下图:

静态代码块只调用一次。

一般的成员都是通过哦构造函数去完成初始化(实例化对象时),而静态成员则是在加载类的时候(也就是实例化之前)初始化。

内部类

内部类是只在一个类的内部定义的类,内部类可以自由访问外部类的成员,内部类可以作为成员类(在外部类中定义,和成员方法平行)和方法内部类(定义在外部类的成员方法里面)。如下实例:

public class Outter {
    private int x = 3;

    public class Inner{
        private int y = 5;

        public void print(){
            System.out.printf("内部类成员y="+y);
            System.out.printf("外部类成员x="+x);
        }
    }
public static void main(String[] args) {
        Outter.Inner inner = new Outter().new Inner();
        inner.print();
    }
}

在什么情况下使用内部类:当一个类离开了另一个类而无法单独存在或者说没有意义的情况下,使用内部类是合适的(比如:cpu离开了计算机,单独存在就没有了意义)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值