第04章 面向对象-下
创作日期:2021-11-06
Java 面向对象学习的三条主线:
- Java 类及类的成员:属性,方法,构造器,代码块,内部类
- 面向对象的三大特征:封装性,继承性,多态性,(抽象性)
- 其他关键字:this,super,static,final,abstract,interface,import等
1.关键字: static
1.1 关键字: static的理解
- 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才能产生出对象,这时系统才会分配内存空间给对象,其方法才会供外部空间调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每个中国人的实例对象中都单独分配一个代表国家名称的变量。
- static:静态的,可以用来修饰:属性,方法,代码块,内部类
1.2 使用static修饰属性(静态变量或类变量)
按照是否使用static修饰,分为:静态属性和非静态属性(实例变量)
- 实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个非静态属性时,不会导致其他对象中同样的属性值的修改。
- 静态变量:我们创建了类的多个对象,多个对象共享一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,值已经被修改了。
static修饰属性的其他说明:
- 静态变量随着类的加载而加载,可以通过“类.静态变量”的方式进行调用
- 静态变量的加载要早于对象的创建
- 由于类只会加载一次,所以静态变量在内存的静态域中中也只存在一份。
- 类.静态变量,对象.静态变量,对象.实例变量
//静态变量
public class StaticTest {
public static void main(String[] args) {
Test.Id = 1;//类.静态变量
Test test = new Test();
test.Id = 2;//对象.静态变量
test.age = 23;//对象.实例变量
//Id为静态变量,被所创建的多个对象共享,因此test1对象对静态属性Id进行修改导致其他对象调用的是被修改过的
Test test1 = new Test();
test1.Id = 3;
System.out.println(test.Id);
}
}
class Test {
int age;
String name;
static int Id;
}
1.3 使用static修饰方法
静态方法:
- 随着类的加载而加载,可以通过“类.静态方法”的方式进行调用
- 类.静态方法,对象.非静态方法
- 静态方法中,只能调用静态的方法或属性,非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性。
1.4 使用static的注意点
- 在静态的方法内,不能使用this关键字和super关键字
- 关于静态属性和静态方法的使用,都可以从方法或属性的生命周期去理解
1.5 如何确定使用关键字static
- 开发中,如何确定一个属性是否要声明static关键字?
- 属性是可以被多个对象共享的,不会随着对象的不同而不同。
- 开发中,如何确定一个方法是否需要生命static关键字?
- 操作静态属性的方法,通常设置为static
- 工具类的方法,习惯上声明为static类型,比如:Math,Arrays等
1.6 static关键字的使用实例
//实现类
public class BankTest {
public static void main(String[] args) {
//给类的静态属性赋值
BankMap.setInterestRate(0.622);
BankMap.setMinimumAmount(500);
//自动生成三个账户对象信息打印输出
for (int i = 0; i < 3; i++) {
BankMap bankMap = new BankMap();
System.out.println(bankMap + "\n*********************");
}
//自定义账户信息打印输出
BankMap bankMap = new BankMap(95462328178l, 1234, 1000);
System.out.println(bankMap);
}
}
//银行类
class BankMap {
Random random = new Random();
long accountNumber;
long password;
long depositBalance;
static double interestRate; //静态变量
static int minimumAmount;//静态变量
public BankMap() {
this.accountNumber = Acc();
this.password = Pas();
this.depositBalance = Dep();
}
public BankMap(long accountNumber, long password, long depositBalance) {
this.accountNumber = accountNumber;
this.password = password;
this.depositBalance = depositBalance;
}
public static double getInterestRate() {
return interestRate;
}
public static void setInterestRate(double interestRate) {
BankMap.interestRate = interestRate;
}
public static int getMinimumAmount() {
return minimumAmount;
}
public static void setMinimumAmount(int minimumAmount) {
BankMap.minimumAmount = minimumAmount;
}
//重写toString()方法
@Override
public String toString() {
return "账号:"+accountNumber+
"\n密码:"+password+
"\n账户余额:"+depositBalance+
"\n利率:"+getInterestRate()+
"\n最小额度:"+getMinimumAmount();
}
//自动生成账号
public long Acc(){
long j = 10000000000l;
for (int i = 0; i < 11; i++) {
accountNumber += random.nextInt(10) * j;
j /= 10;
}
return accountNumber;
}
//自动生成密码
public long Pas(){
int j = 100000;
for (int i = 0; i < 6; i++) {
password += random.nextInt(10) * j;
j /= 10;
}
return password;
}
//自动生成余额
public long Dep(){
int j = 10000;
for (int i = 0; i < 5; i++) {
depositBalance += random.nextInt(10) * j;
j /= 10;
}
return depositBalance;
}
}