生命周期 (过长)
属性为static,方法也要声明为static,它俩声明周期应该一样
在某个方法中重写tostring方法,tostring方法默认输出自己私有的属性,默认不输出static的属性。
也可以通过对象去调静态的结构
同一包下不能写两个同名的类
Arguments代表参数的意思
当你使用类,类(静态方法,静态属性)就会加载在内存中
属性中不能有操作(比如int i;i=2;)但(int i = 2;)可以
方法体中是按先后顺序执行的,在一个类中,结构无所谓谁先谁后,代码块放最前面也行
一。static关键字的使用
1)static:静态的
2)static可以用来修饰属性,方法,代码块,内部类
3)使用static修饰属性,静态变量(类变量:该类所有的对象共享的变量)
3.1 属性:按是否使用static修饰,又分为静态变量 vs 非静态变量(实例变量)
实例变量:创建了类的多个对象时,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。
静态变量:创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此变量时,是修改过后的
3.2其他说明
(1)静态变量随着类的加载而加载,可以通过“类.静态变量”的方式进行调用
(2)静态变量的加载要早于对象的创建(生命周期)
(3)由于类只会加载一次,则静态变量在内存中也只会存在一份,存在在方法区的静态域中
(4) 类变量 实例变量
类 yes no
对象 yes yes
3.3 静态属性举例:System.out; Math.PI;
4)使用static修饰方法:静态方法
(1)随着类的加载而加载,可以通过“类.静态方法”进行调用
(2)
静态方法 非静态方法
类 yes no
对象 yes yes
(3)静态方法中,只能调用静态的方法或属性
非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性
5)static的注意点:
5.1 在静态方法内,不能使用super,this关键字
5.2关于静态属性和静态方法,可以从生命周期的角度去理解
6)如何确定一个属性是否要声明为static的?
属性是可以被多个对象共享的,不会随着对象的不同而不同的
如何确定一个方法是否要声明为static的?
操作静态属性的方法,通常设置为static的
工具类中的方法,习惯上声明为static的。比如Math,Arrays
class Circle{
private double radius;
private id;
public Circle(){
id = init++;
total++;
}
private static int total;//记录创建的个数
private static int init = 1001;//static声明的属性被所有对象共享
public double findArea(){
return PI*radius*radius;
}
}
//这里如果创建了两个圆,第一个就是1001,第二个是1002;
package com.atguigu5.java;
public class Account {
private int id;//自动赋值
private String pwd = "000000";
private double balance;//余额
private static double interestRate;
private static double minMoney = 1.0;
private static int init = 1001;
public Account(){
id = init++;
}
public Account(String pwd,double balance){
id = init++;
this.pwd = pwd;
this.balance = balance;
//static的属性一般不会在构造器里声明,
// 不然一个改了其他都要跟着改。一般都是对象自己有的属性
}
public String getPwd(){
return pwd;
}
public void stePwd(String pwd){
this.pwd = pwd;
}
public static double getInterestRate() {
return interestRate;
}
public static void setInterestRate(double interestRate) {
Account.interestRate = interestRate;
}
public static void setMinMoney(double minMoney) {
Account.minMoney = minMoney;
}
public static double getMinMoney() {
return minMoney;
}
public int getId() {
return id;
}
public double getBalance() {
return balance;
}
}
二。static的应用:单例设计模式
设计模式与数据结构一样,独立于语言之外
1)类的单例设计模式,就是采取一定的方法保证在整个的系统软件中,对某个类只能存在一个对象实例
2)如何实现?
饿汉式 vs 懒汉式
3)区分饿汉式和懒汉式
饿汉式:
坏处:对象加载在内存中的时间过长
好处:饿汉式是线程安全的
懒汉式:
好处:延迟对象的创建
坏处:线程不安全(可以改)
懒汉式:
class Order{
//1.私有化类的构造器
private Order(){
}
//2.声明当前类对象,没有初始化
//4.此对象也必须声明为static的
private static Order instance = null;
//3.声明public,static的返回当前类对象的方法
public static Order getInstance(){
if(instance == null){
instance = new Order();
}
return instance;
}
}
饿汉式:
class Bank(){
//1.私有化类的构造器
private Bank(){
}
//2.内部创建类的对象
//4.要求此对象也必须声明为静态的
private static Bank instance = new Bank();
//3.提供公共的静态的方法,返回类的对象
public static Bank getInstance(){
return instance;
}
}
三。main方法的使用说明
1.main()方法作为程序的入口
2.main()方法也是一个普通静态方法(如果一个包中有多个main,编译器会问你先执行哪个)
3.main()方法可以作为我们与控制台的交互方式(之前使用的是scanner)
先编译在传,或运行时传(控制台cmd)
public是因为JVM在运行时,不在这个包,不在这个类中执行,权限要尽可能大
static是因为main也是通过类调的,如果想通过对象调的话,但对象也在main方法里
void就是不需要返回值
四。代码块Block(类的成员之四)
1.代码块的作用:用来初始化类,对象
2.代码块如果有修饰的话,只能用static
3.分类: 静态代码块 vs 非静态代码块
4静态代码块
>内部可以有输出语句
>随着类的加载而加载,且只加载一次
>作用:初始化类的信息
>如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行
>静态代码块的执行要优先于非静态代码块的执行
>静态代码块内只能调用静态的属性静态的方法 不能调用非静态的结构
5非静态代码块
>内部可以有输出语句
>随着对象的创建而执行
>每创建一个对象,就执行一次非静态代码块
>作用:在创建对象时,对对象的属性等进行初始化
>如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行
>非静态的代码块内可以调用静态的属性静态的方法。非静态的属性或方法也可以调用
代码执行顺序:
原则:由父及子,静态先行
调用main方法时(也是通过类调的),先把main在的此类中所有静态的代码块执行了(子类继承了父类,父类先调/生命周期的原因 只执行一次即可),在执行父类中的代码块,之后执行父类的构造器,再执行子类的代码块,构造器(super())。
属性赋值的先后顺序
默认初始化->显式初始化/在代码块中赋值(谁放前面谁先赋值,默认代码块放后面)->构造器中初始化->有了对象以后,通过“对象.属性”或“对象.方法”的方式进行赋值。