static关键字
/**
* static关键字的使用
*
* 1.static:静态的
* 2.static可以用来修饰:属性,方法,代码块,内部类
*
* 3.使用static修饰属性:静态变量(或类变量)
* 3.1属性,按是否使用static修饰,又分为:静态属性vs非静态属性(实例变量)
* 实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性,当修改其中一个对象中非静态属性时,不会导致其他对象中同样的属性值的修改
* 静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量,当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的
* 3.2 static修饰属性的其他说明:
* 1.静态变量随着类的加载而加载,可以通过类.静态变量的方式进行调用
* 2.静态变量的加载要早于对象的创建
* 3.由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中
* 4. 类变量 实例变量
* 类名 yes no
* 对象 yes yes
*
* 3.3静态属性举例:Math.PI
*
* -----------------------------------------------------------------------------------------------------------------
*
* 4.使用static修饰方法:静态方法
* 1.随着类的加载而加载,可以通过类.静态方法的方式进行调用
* 2. 静态方法 非静态方法
* 类名 yes no
* 对象 yes yes
* 3.静态方法中,只能调用静态的方法或属性
* 非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性
*
* 5.static注意点:
* 5.1 在静态的方法内,不能使用this关键字,super关键字
* 5.2 关于静态属性和静态方法的使用,大家都从生命周期的角度去理解
*
* ----------------------------------------------------------------------------------------------------------------------
* 6.开发中,如何确定一个属性是否要声明为static的?
* 1.属性是可以被多个对象所共享的,不会随着对象的不同而不同的
* 2.类中的常量也常常声明为static
*
* 开发中,如何确定一个方法是否要声明为static的?
* 1.操作静态属性的方法,通常设置为static的
* 2.工具类中的方法,习惯上声明为static的. 比如:Math Arrays Collections
*
*/
代码块
package com.up;
/**
*
*类的成员之四:代码块(或初始化块)
*
* 1.代码块的作用:用来初始化类,对象
* 2.代码如果如果有修饰的话,只能使用static
* 3.分类:静态代码块 vs 非静态代码块
*
* 4.静态代码块
* >内部可以有输出语句
* >随着类的加载而执行,只执行一次
* >作用:初始化类的信息
* >如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行
* >静态代码块的执行要优先于非静态代码块
* >静态代码块内只能调用静态的属性,静态的方法,不能调用非静态的方法
*
*
*
*
* 5.非静态代码块
* >内部可以有输出语句
* >随着对象的创建而执行,每创建一个对象,就执行一次非静态代码块
* >作用:可以在创建对象时,对对象的属性等进行初始化
* >如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行
* >非静态代码块内可以调用静态的属性,静态的方法,或非静态的属性,非静态的方法
*
*/
public class Person {
int age;
static String desc = "aaaa";
static{
System.out.println("静态代码块 - 1");
desc = "bbbbb";
eat();
}
static{
System.out.println("静态代码块 - 2");
}
{
System.out.println("非静态代码块 - 1");
desc = "c";
age = 20;
eat();
info();
}
{
System.out.println("非静态代码块 - 2");
}
public static void eat(){
}
public void info(){
}
}
内部类
/**
* 类的内部成员之五:内部类
* 1.Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类
* 2.内部类的分类:成员内部类(静态,非静态) vs 局部内部类(方法内,代码块内,构造器内)
*
* 3.成员内部类:
* 一方面,作为外部类的成员:
* >调用外部类的结构
* >可以被static修饰
*
* 另一方面,作为一个类
* >类可以定义属性,方法,构造器等
*
* 4.关注如下的3个问题
* 4.1 如何实体化成员内部的对象
* 4.2 如何在成员内部类中区分调用外部类的结构
*
*
*/