一、static关键字
static 是类共有的。不是某个对象私有的,比如,公司里的打印机是公司的财产,不是每个人私有的,可以说是我的打印机,但是不合理。
1.修饰成员变量时
作用域为整个类 直接类名.属性名调用。可以使用引用变量调用,但是不合理,因为不属于对象
2.修饰代码块
只执行一次,时机是在类加载期间,适用于加载静态资源:图片音频等
3.修饰方法时
3.1 调用格式
类名.方法名 也可以使用引用变量调用,但是不建议,不合理,因为不属于对象
3.2 特点
(1)静态方法里不能访问非成员
(2)被static修饰的方法不能再被重写,但是子类可以有一样的方法,各是各的
4.修饰类
内部类
二、final关键字
1.修饰类
类不能被继承
2.修饰成员变量
只能初始化一次,不能被再次赋值
3.修饰局部变量
不能被再次赋值
4.修饰方法
不可以别重写
5.被final修饰的变量:三种赋值方式
1.在定义是直接赋值
2.声明时候不赋值,在构造器中赋值
3.声明时不赋值,在构造代码块中赋值
public class Test {
//1. 在定义时候直接赋值
final int a = 10;
//2. 在构造器里赋值
final int b ;
public Test() {
b = 15;
}
//3. 在构造(动态)代码块中赋值
final int c ;
{
c = 20;
}
}
6.被final static修饰的变量:两种赋值方式
1.在定义时直接赋值
2.在静态代码块里赋值
public class Test {
//1. 在定义时候直接赋值
static final int d = 25;
//2. 在静态代码块中赋值
static final int e ;
static {
e = 30;
}
}
三、构造方法(构造器)
人从出生到死亡,称之为人的一生,对象从创建也就是构造方法开始到析构方法结束也就是被回收称之为对象的一生也就是对象的生命周期。
1. 作用
构造方法是用来初始化变量的
2.构造方法与普通方法的区别
2.1 语法不同
(1)构造方法没有返回值类型那个位置
(2)构造方法的名字必须与类名相同
(3)构造方法不能被static修饰
(4)通常被public修饰 如果被private修饰不能被子类继承
如果被protected修饰,表示可以被不同包下的子类继承
如果是默认的 表示可以被同包下的其他类调用
public Person(){
}
2.2 执行时机不同
(1)构造方法是在创建对象时执行的 也就是使用new 关键字时
(2)普通方法是在调用该方法时执行的,可以随时调用
2.3 构造方法可以重载
重载是指名字相同但是形参类型(顺序、个数、类型)不同
定义类时没有提供构造器,系统会提供一个无参构造器
如果定义了构造器,系统不会提供无参构造器,需要用无参构造器时,需要自己调用。
2.4 构造方法不可以被重写
构造方法的主要作用是重载 因为每个类的类名都不相同,而构造器名称与类名相同,所以根本谈不上继承,更不可能被重写。
四、this关键字
可以用来区分局部变量和当前类的属性
1. this.是隐藏在成员变量前的关键字
2. 当形参和成员变量名字相同时,如果想要在这个作用域内表示成员变量那么this.不可以省略,否则初始化不会成功。
3. 哪个对象调用,this就代表哪个对象。
4.this调用本类的构造器时候,必须放在首行。
5.如果方法中没写this. 那么该变量就代表着局部变量
五、super关键字
1. 子类不能继承父类的构造器,但是可以使用super关键字调用父类的构造器。
2. 并且子类的构造器中至少存在了一个构造器调用了父类的构造器,因为子类需要初始化。
3. 如果父类中有无参构造器(系统默认提供的也可以),子类会隐式的调用父类的构造器,但是如果父类中没有无参构造器,子类必须显示的调用super(有形参传实际参);关键字,否则编译错误。
4. super(有参传参);必须放在首行。
六、代码块
1.构造(动态)代码块
{
方法体
}
特点:构造器执行一次它就执行一次,
位置:与构造器并列关系,都是在类体中
作用:用于统计创建了多少个对象,或者提前给成员变量赋值,因为构造器的作用是初始化成员变量,而代码块是在构造器之前执行,所以可以提前给成员变量赋值
2.静态代码块
static{
方法体
}
特点:只加载一次,时机是在类加载的时候。
位置:与构造器并列,都是在类体中
作用:一般用于加载静态资源,如视频,音乐等
案例
public class BlockDemo {
public static void main(String[] args) {
//调用无参构造器实例化对象
BlockDemo bd1 = new BlockDemo();
System.out.println(bd1.toString());
BlockDemo bd2 = new BlockDemo(10,20);
System.out.println(bd2);//默认调用了toString
}
int a;
int b;
{
System.out.println("--动态块执行了--");
a = 100;
b = 200;
}
static{
System.out.println("静态块执行了");
}
public BlockDemo() {
System.out.println("无参构造器");
}
public BlockDemo(int a, int b){
System.out.println("有参构造器");
this.a = a;
this.b = b;
}
/**
* String toString(): 将对象的成员信息变成一串字符并返回
* 该方法,在将引用变量放在输出语句中时会默认调用
* @return
*/
public String toString(){
return "a: " + a + ", b: " + b;
}
}
运行结果: