native:
1 本地的
2 可以修饰方法
3 语法格式:
/*
[修饰符] class 类{
[其他修饰符]native 返回值类型 方法名([形参列表])
}
*/
native修饰的方法,看不见方法体
native修饰的方法,不是用Java语言实现的,而是调用了底层C/C++的代码,这些代码被编译为.dll文件,让Java来执行
4 特殊:
与其他方法调用形式相同
子类可以选择对native方法进行重写
final:
final可以修饰: 类(外部类/内部类) 变量(成员变量(类变量/实例变量),局部变量) 方法(静态方法,非静态方法)
final修饰类: 表示这个类不能被继承了
final修饰方法: 表示这个方法不能被重写
final修饰变量: 表示这个变量的值不能被修改了,即"常量"(常量的命名应该所有字母都要大写 每个单词之间用_)
//final修饰成员变量
//必须在对象创建成功之前完成赋值的行为,且只能赋值一次
public class Final {
// private final int A ; 必须保证在对象创建之前能够给A赋值
//否则a为默认值且无法更改,没有意义,程序报错
private final int A = 1;//直接赋值
private final int B;//通过构造方法进行赋值
//有参构造
//创建对象时,传入一个实参,创建成功后,成员变成b就无法进行修改了
public Final(int B){
this.B = B;
}
//无参构造
//当一个类中有多个构造方法时,必须保证所有构造器都要给final的成员变量赋值
public Final(){
B = 97;//此处b的值创建后无法进行更改
}
}
Final修饰引用变量
public class test {
public static void main(String[] args) {
//final修饰引用变量
final testclass a = new testclass();
a.aha = 2;
a.bha =3;
a.show();
System.out.println(a);
System.out.println("============");
//对final修饰的引用类型再次赋值
//变量值会发生改变
//但对象的地址无法被改变
//a = new testclass(); ←报错
a.aha =3;
a.show();
System.out.println(a);
}
}
static
1 静态的
2 static可以修饰: 方法 、成员变量、内部类、代码块
3 修饰后的不同:
【1】这个方法,我们称为“静态方法”,或“类方法”
<1>这个静态方法,对于其他类来说可以用 [类名.方法] 进行调用,当然也可以使用"对象名.方法"进行调用(推荐使用 “类名.方法” 调用)
<2>静态方法中, 是不允许出现: this/super, 对本类的非静态属性、非静态方法直接使用代码
【2】修饰后成员变量: (不能修饰局部变量)
<1>用static修饰的成员变量,表示这个变量对该类所有对象共享
<2>static修饰的成员变量的值,存储在方法区
<3>static修饰的成员变量的get/set也是静态的
<4>如果方法中用局部变量与static修饰的成员变量同名时,在静态变量前加“类名”进行区别
<5>静态方法是不能被重写的: 静态方法在编译期间就确定了,不需要在运行时动态绑定
【3】静态代码块
<1>每一个类的静态代码块只会执行一次
<2>静态代码块在第一次使用这个类时执行(在类初始化时执行)
类初始化(执行类初始化方法): ()
一个类只有一个, 也是由编译器编译生成的, 由两部分代码组成:
静态代码块
静态变量的显式赋值
(↑按顺序执行)
☆在继承时,一个类初始化时会先检查它的父类是否初始化,如果父类没有初始化,那么会先初始化父类.(对于一个类,初始化只会执行一次)
ps: 对一个类来说, 有几个构造器就有几个实例初始化方法, 它们由编译器根据↓生成:
成员变量的显式赋值代码
非静态代码块代码
构造器
public class staticDemo {
public static void main(String[] args) {
//为所有对象赋一个公共的值
staticcc.salary = 100;//所有对象共有
staticcc a = new staticcc();
a.age = 20;
a.name = "马云";
a.show();
staticcc b = new staticcc();
b.name="王健林";
b.age = 20;
b.show();
//建议访问静态变量时,用类名.变量名 进行访问
System.out.println(staticcc.salary);
}
}
public class staticcc {
public String name;
public int age;
//static修饰的成员变量 作为所有对象的公共属性
public static int salary;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static int getSalary() {
return salary;
}
public static void setSalary(int salary) {
//局部变量与static修饰的成员变量同名时 用类名.变量名表示成员变量
staticcc.salary = salary;
}
public void show(){
System.out.println(name+" "+age+" "+salary);
}
}
/*
//非静态代码块格式
[修饰符] class 类{
{
非静态代码块
}
}
静态代码块格式:
[修饰符] class 类{
static{
非静态代码块
}
}
*/