这些只是我在这方面所学到的一些皮毛,整理的粗糙,请多指教。
静态
静态成员修饰的成员与一般的成员区别:
一般的成员是每个对象有一份数据,而静态成员是属于类的,即所有对象所共享;
一般成员的访问方式:对象名.成员名;而静态成员的访问方式:类名.成员名。
如下案例:
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离开了计算机,单独存在就没有了意义)。