我们都知道,在java中,面向对象三大特征是:封装、继承、多态。接下来我们首先来看在封装中的一些重点难点。
1.static
用static修饰的成员,称之为静态成员,也称为类成员。无论类实例化多少对象,都会共用一块同样的内存空间。静态成员从类第一次被加载的时候就会产生,一直到这个类不再有任何对象被使用,就是说彻底进行销毁,静态成员才会进行资源的释放。
1)特征:1.类对象共享 2. 类加载时产生,销毁时释放,生命周期长
2)静态的访问方法:
1.对象.成员
2. 类.成员(因为是类成员,所以可以用类名.静态成员调用)
eg. Cat cat = new Cat();
cat.price与Cat.price效果相同,但是最好是用第二个访问方法(其中price是static修饰的静态成员)。
3)static + 属性==》静态属性、类属性
4)static + 方法==》静态方法、类方法
其中,类方法的调用,既可以用:1.对象.方法。又可以使用 2.类.方法(但是推荐第二个)
5)static + 类 ==》不可以!
6) static + 方法中的局部变量,也是不存在的!
7)在成员方法中,可以直接访问类中静态成员或静态方法。
在静态方法中,不能直接访问同一个类中非静态成员,只能直接调用同一个类中的静态成员。如果一定要调用,只能通过 对象实例化后,通过对象.成员方法的方式进行访问非静态成员。
同样有一点需要说明,在静态方法中,不能使用this关键字。this关键字等同于本类对象,与static是矛盾的。
代码块
1)普通代码块:存在于普通方法。顺序执行,先出现,先执行
eg.public void eat(){
{
System.out.println("我是普通代码块1);
}//普通代码块
}
2)构造代码块:创建对象时调用,优先于构造方法执行。构造代码块在一个类中也可以有多个,是顺序执行的。
{
System.out.println("我是构造代码块1);
}//构造代码块
{
System.out.println("我是构造代码块2);
}//构造代码块
3)静态代码块:在构造代码块前加一个static,就会升级为静态代码块。类加载时调用,优先于构造代码块执行。静态代码块也可以有多个,按照顺序执行。
static{
System.out.println("我是静态代码块1");
}//静态代码块
4) 问题: 当有多个实例对象,静态代码块会执行几次,构造代码块会执行几次?
答:静态代码块无论实例化多少个对象,都只执行一次,而构造代码块会在每次进行实例化都会执行一次。
顺序:先执行静态代码块,接着构造代码块,最后构造方法。
注:1)构造代码块中可以对普通成员赋值,也可以对静态成员赋值,而静态代码块中,只可以对静态成员赋值。这与静态方法中访问非静态成员的方式类似,我们当然也可以进行对象实例化,通过对象.属性的方式去访问。
2)根据静态代码块的特殊性,如果对于一些我们仅希望执行一次的代码,可以放在静态代码块中,来提高程序效率。
5) 了解普通代码块中,局部变量的使用。
public void run(String name) {
{
int temp=12;
System.out.println("我是普通代码块1,temp="+temp);
}//普通代码块
{
int temp=13;
System.out.println("我是普通代码块2,temp="+temp);
}//普通代码块
}
其中,两个temp各有自己的作用空间,不属于同名变量使用。
public void run(String name) {
{
int temp=12;
System.out.println("我是普通代码块1,temp="+temp);
}//普通代码块
int temp=14;
{
// int temp=13;
System.out.println("我是普通代码块2,temp="+temp);
}//普通代码块
}
若是在两个代码块中间定义了一个temp,这个temp的作用空间一直到方法体的结束,因此第二个普通代码块中的temp属于同名变量,会报错。
public void run(String name) {
int temp=14;
{
// int temp=12;
System.out.println("我是普通代码块1,temp="+temp);
}//普通代码块
{
// int temp=13;
System.out.println("我是普通代码块2,temp="+temp);
}//普通代码块
}
若是一开始就定义了一个temp,此temp的作用空间一直到方法体的结束,因此两个普通代码块中的temp都会报错。