一、static关键字
1. static的概念
2. 成员变量使用static
成员变量加了static之后,这个成员变量不再属于某一个单独的对象,而是属于这个类创建出来的所有对象。所有对象共享同一数据。修改一个对象的静态成员变量,所有对象的此成员变量都会一起改变
3. 示例:学号自动填充并递增
```java
//student类
package linxu.day02;
public class student {
private String name;
private int age;
private int id;
private static int idCOunter;
public student(String name, int age) {
this.name = name;
this.age = age;
this.id = idCOunter++;
}
public student() {
idCOunter++;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.id = age;
}
public int getid() {
return id;
}
public void setid(int id) {
this.age = id;
}
}
//主函数
package linxu.day02;
public class randomdome {
public static void main(String[] args) {
student p = new student("ww", 9);
System.out.println(p.getName() + " " + p.getAge() + " " + p.getid());
student q = new student("ss", 8);
System.out.println(q.getName() + " " + q.getAge() + " " + q.getid());
}
}
```
4. 静态方法
成员方法加了static之后,这个成员方法不再属于某一个单独的对象,而是属于这个类。即使不创建对象也可以直接使用,即直接类名.方法名()
来调用静态方法。并且更推荐使用类名称来调用,哪怕已经有了创建的对象。
例如:
```java
package linxu.day04;
public class staticdome1 {
public static void staticMothod(){
System.out.println("这是一个静态方法");
}
}
package linxu.day04;
public class dome2 {
public static void main(String[] args) {
staticdome1 p=new staticdome1();
p.staticMothod();//通过对象调用静态方法,
//即使通过类名调用静态方法,在javac编译器编译之后也会翻译(java是解释型语言)为“类名.方法名”
staticdome1.staticMothod();//通过类名调用静态方法
}
}
```
5. 注意事项:
- 对于调用本类当中的静态方法,可以省略类名称,直接使用方法名调用
- 静态不能直接访问非静态(方法、变量);
因为在内存中是先有静态内容,然后才有非静态的内容的。
- 静态方法不能使用this关键字,
因为this代表当前对象,谁调用中国这个方法,this就表示谁。但静态方法是通过类名调用的,而非对象调用,因此会报错。
6. static的内存图
方法区中有一块单独的区域——静态区
7. 静态代码块
当第一次使用本类,静态代码块执行唯一的一次。
静态内容总是优先于非静态,所以静态代码块比构造方法更早执行
格式:
```java
public class 类名{
static{
静态代码块内容
}
}
```
主要作用:一次性的为所有静态成员变量赋值
二、final关键字
1. final关键字
- 表示最终不可改变的,(相当于C语言的const)
- 四种用法:
修饰类
修饰方法
修饰局部变量
修饰成员变量
2. final修饰类
格式:public final class类名{...}
含义:当前类不能有任何子类,其他和普通类相同。
注意:一个类如果是final的,那么其中所有方法都无法进行覆盖重写
3. final修饰方法
格式:修饰符 final 返回值类型 方法名(参数列表){方法体...}
含义:当前方法就是最终的方法,无法被覆盖重写
注意:abstract、final不能一起用,自相矛盾
4. final修饰局部变量
格式:final 返回值类型 变量名=数据值;
含义:final修饰的局部变量,一旦赋值,不可改变,
注意:
- 对基本类型,不可改变的是其数值;对引用类型,不可改变的是其变量地址
- 定义时最好初始化,否则就直接默认值了,变量没啥意义了
5. final修饰成员变量
格式:private final 返回值类型 变量名=数据值;
含义:final修饰的成员变量,一旦赋值,不可改变
注意:
- 加了final的成员变量,编译器不会给默认值,因此必须手动赋值。
- 对于成员变量,要么手动赋值,要么构造方法赋值,不能通过成员方法赋值
三、权限修饰符
java四种权限修饰符:
public > protected > (default) > private
(default)不是关键字,而是什么也不写
public | protected | (default) | private | |
---|---|---|---|---|
同一个类 | YES | YES | YES | YES |
同一个包 | YES | YES | YES | NO |
不同包子类 | YES | YES | NO | NO |
不同包非子类 | YES | NO | NO | NO |
这个表格表示的信息如下:
如第一行,表示同一个类中使用这些权限修饰符修饰的成员变量和成员方法之间是否能相互访问。
第二行,表示同一个包中某个类中使用这些权限修饰符修饰的成员变量和成员方法是否能在其他类中创建对象并访问
…