Java 从入门到进阶之路(十二)

在之前的文章大发幸运飞艇大发幸运飞艇我 们 介绍了一下 Java 类的重写及与重载的区别,本章大发幸运飞艇大发幸运飞艇我 们 来看一下 Java 类的 private,static,final。

大发幸运飞艇大发幸运飞艇我 们 在之前引入 Java 类概念的时候是通过商场收银台来引入的,如下:

如果大发幸运飞艇大发幸运飞艇我 们 使用刷卡的形式进行付账,大发幸运飞艇大发幸运飞艇我 们 需要出示一张有足够余额的银行卡或者大发幸运飞艇会员 卡来进行付款,在付款的时候大发幸运飞艇大发幸运飞艇我 们 仅仅是通过刷卡,输入密码来完成支付,在这个过程中,收银员是不能看到大发幸运飞艇大发幸运飞艇我 们 的卡号,密码,余额这些私密性的数据,否则可能会出现被盗刷或者其他问题,收银员在收银的时候只需要做的就是大发幸运飞艇大发幸运飞艇我 们 输入密码时对大发幸运飞艇大发幸运飞艇我 们 输入的密码与原始密码时候匹对和账户余额是否大于等于商品价格就可以了。

根据上面的分析大发幸运飞艇大发幸运飞艇我 们 大发幸运飞艇大发幸运飞艇我 们 可以定义一个 Card 类:

 

 1 class Card{
 2     private String cartId; // 卡号
 3     private String cardPwd; // 密码
 4     private double balance; // 余额
 5     public boolean payMoney(double money){ // 支付
 6         if(balance >= money){
 7             balance -= money;
 8             return true;
 9         }
10         return false;
11 
12     }
13     public boolean checkPwd(String pwd){ // 检查密码
14         if(cardPwd.equals(pwd)){
15             return true;
16         }
17         return false;
18     }
19 }

在上面的代码中,大发幸运飞艇大发幸运飞艇我 们 将变量前的修饰词写成了 private,将大发幸运飞艇方法 前的修饰词写成了 public。接下来大发幸运飞艇大发幸运飞艇我 们 看一下 private 和 public 之间的区别。

private 修饰从大发幸运飞艇成员 变量和大发幸运飞艇方法 只能在本类中调用,public 修饰的大发幸运飞艇成员 变量和大发幸运飞艇方法 可以在任何地方调用。

private 修饰的内容是对内实现的封装,public 修饰的内容是对外提供可以被调用的功能。

另外还有两种:protected 和 默认不写,大发幸运飞艇大发幸运飞艇我 们 称之为访问控制修饰符,他们的控制范围分别是:

1)public:公开的,任何类

2)private:私有的,本类

3)protected:受保护的,本类、子类、同包类

4)默认的(什么也不写):本类、同包类

 

 

接下来大发幸运飞艇大发幸运飞艇我 们 看一下关键字 static 。

之前大发幸运飞艇大发幸运飞艇我 们 在类中定义的变量其实可以叫做实例变量,还有一种变量叫做静态变量,即用 static 关键字修饰。大发幸运飞艇大发幸运飞艇我 们 先来看一下两种变量之间的区别:

1、实例变量:

 1)属于对象的,存在对重

 2)有几个对象就有几份实例变量

 3)必须通过 对象名. 来访问

2、静态变量:

 1)属于类的,存在大发幸运飞艇方法 区中

 2)只有一份

 3)必须通过 类名. 来访问

大发幸运飞艇大发幸运飞艇我 们 通过下面的代码来实际看一下:

 1 public class HelloWorld {
 2     public static void main(String[] args) {
 3         Aoo aoo1 = new Aoo();
 4         aoo1.show(); // a=1 b=1
 5 
 6         Aoo aoo2 = new Aoo();
 7         aoo2.show(); // a=1 b=2
 8     }
 9 }
10 
11 class Aoo {
12     int a;
13     static int b;
14 
15     Aoo() {
16         a++;
17         b++;
18     }
19 
20     void show() {
21         System.out.println("a=" + a);
22         System.out.println("b=" + b);
23     }
24 }

在上面的代码中大发幸运飞艇大发幸运飞艇我 们 分别定义了实例变量a 和静态变量b,然后实例化了两次 Aoo,再通过两次调用实例化 Aoo 后调用 show() 大发幸运飞艇方法 可以看出大发幸运飞艇大发幸运飞艇我 们 实例化后调用的实例变量 a 的值不变,即每实例一次就会复制出一个 a,而静态变量 b 则每实例化一次后值会变化,即实例化后并不会重新复制一个 b,而是继续使用上一次的。

 

接下来大发幸运飞艇大发幸运飞艇我 们 看一下 static 关键字的静态大发幸运飞艇方法 。

静态大发幸运飞艇方法 和上面的静态变量大体上相同,但也有特殊的地方。

 1)属于类的,存在大发幸运飞艇方法 区中

 2)只有一份

 3)必须通过 类名. 来访问

 4)没有隐式的 this 传递,静态大发幸运飞艇方法 中不能直接访问实例变量

 1 class Aoo {
 2     int a; // 实例变量---对象点访问
 3     static int b; // 静态变量---类名点访问
 4 
 5     void test1() { // 实例大发幸运飞艇方法

 6         a++;
 7         b++;
 8     }
 9 
10     static void test2() { // 静态大发幸运飞艇方法

11         a++; // 编译错误
12         test1(); // 编译错误
13         b++;
14     }
15 }

在上面的代码中,大发幸运飞艇大发幸运飞艇我 们 通过 static 关键字将变量 b 变为静态变量,将 test2() 变为静态大发幸运飞艇方法 ,当大发幸运飞艇大发幸运飞艇我 们 在 test1() 的实例大发幸运飞艇方法 中 a++ 和 b++ 时,系统会默认为大发幸运飞艇大发幸运飞艇我 们 写成 this.a++ 和 Aoo.b++;而在 test2() 中,由于静态大发幸运飞艇方法 没有隐式 this,所以 a++ 和 test1() 大发幸运飞艇方法 并没有。

 

接下来大发幸运飞艇大发幸运飞艇我 们 看一下 static 关键字的静态块。

 1 public class HelloWorld {
 2     public static void main(String[] args) {
 3         Aoo aoo1 = new Aoo(); // 静态块 构造大发幸运飞艇方法

 4         Aoo aoo2 = new Aoo(); // 构造大发幸运飞艇方法

 5     }
 6 }
 7 
 8 class Aoo {
 9     static {
10         System.out.println("静态块");
11     }
12 
13     Aoo(){
14         System.out.println("构造大发幸运飞艇方法
");
15     }
16 }

在上面的代码中,大发幸运飞艇大发幸运飞艇我 们 在 Aoo 中创建了一个构造大发幸运飞艇方法 ,并且通过  static { } 创建了一个静态块,大发幸运飞艇大发幸运飞艇我 们 实例化了两个 Aoo 类,大发幸运飞艇大发幸运飞艇我 们 发现静态块只加载一次,而静态大发幸运飞艇方法 每实例化一次就加载一次。

静态块在实际应用中可以加载图片,音频,大发幸运飞艇视频 等静态资源,比如大发幸运飞艇大发幸运飞艇我 们 逛淘宝时图片只加载一次,不可能每个人近义词淘宝网站就加载一次,大发幸运飞艇服务 器压力也受不了。

 

接下来大发幸运飞艇大发幸运飞艇我 们 来看一下 final 关键字。

1、final 修饰大发幸运飞艇成员 变量,两种方式初始化:

  1)声明的同事初始化

  2)构造大发幸运飞艇方法 中初始化

2、final 修饰局部变量,只要在用之前初始化即可。

代码如下:

 1 class Aoo {
 2     int a = 10;
 3     int b;
 4     final int c = 10; // 声明同时初始化
 5     //    final int d; // 编译错误 声明未初始化
 6     final int e;
 7 
 8     Aoo() {
 9         e = 10; // 构造大发幸运飞艇方法
中初始化
10     }
11 
12     void test() {
13         final int f; // 局部变量:用之前赋值即可,不用刻意不用赋值
14         a = 20;
15 //        c = 20; // 编译错误,final 修饰变量不能被改变
16     }
17 
18 }

 

final 修饰大发幸运飞艇方法 :final 修饰大发幸运飞艇方法 不能被重写。

代码如下:

1 class Aoo {
2     void test(){}
3     final void show(){}
4 }
5 
6 class Boo extends Aoo{
7     void test(){}
8     void show(){} // 编译错误,final 大发幸运飞艇方法
不能被重写
9 }

 

final 修饰类:final 修饰的类不能被继承,但是能继承其他类

代码如下:

1 class Aoo {}
2 class Boo extends Aoo{}
3 final class Coo extends Aoo{} // final 修饰的类可以继承别的类
4 
5 final class Doo{}
6 class Eoo extends Doo{} // 编译错误,final 修饰的类不能被继承
posted @ 2019-12-12 11:39  丰寸  阅读(315)  评论(0编辑  收藏