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

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

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

根据上面的分析我们我们可以定义一个 Card 类:

 class Card{
private String cartId; // 卡号
private String cardPwd; // 密码
private double balance; // 余额
public boolean payMoney(double money){ // 支付
if(balance >= money){
balance -= money;
return true;
}
return false; }
public boolean checkPwd(String pwd){ // 检查密码
if(cardPwd.equals(pwd)){
return true;
}
return false;
}
}

在上面的代码中,我们将变量前的修饰词写成了 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)必须通过 类名. 来访问

我们通过下面的代码来实际看一下:

 public class HelloWorld {
public static void main(String[] args) {
Aoo aoo1 = new Aoo();
aoo1.show(); // a=1 b=1 Aoo aoo2 = new Aoo();
aoo2.show(); // a=1 b=2
}
} class Aoo {
int a;
static int b; Aoo() {
a++;
b++;
} void show() {
System.out.println("a=" + a);
System.out.println("b=" + b);
}
}

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

接下来我们看一下 static 关键字的静态方法。

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

 1)属于类的,存在方法区中

 2)只有一份

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

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

 class Aoo {
int a; // 实例变量---对象点访问
static int b; // 静态变量---类名点访问 void test1() { // 实例方法
a++;
b++;
} static void test2() { // 静态方法
a++; // 编译错误
test1(); // 编译错误
b++;
}
}

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

接下来我们看一下 static 关键字的静态块。

 public class HelloWorld {
public static void main(String[] args) {
Aoo aoo1 = new Aoo(); // 静态块 构造方法
Aoo aoo2 = new Aoo(); // 构造方法
}
} class Aoo {
static {
System.out.println("静态块");
} Aoo(){
System.out.println("构造方法");
}
}

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

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

接下来我们来看一下 final 关键字。

1、final 修饰成员变量,两种方式初始化:

  1)声明的同事初始化

  2)构造方法中初始化

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

代码如下:

 class Aoo {
int a = 10;
int b;
final int c = 10; // 声明同时初始化
// final int d; // 编译错误 声明未初始化
final int e; Aoo() {
e = 10; // 构造方法中初始化
} void test() {
final int f; // 局部变量:用之前赋值即可,不用刻意不用赋值
a = 20;
// c = 20; // 编译错误,final 修饰变量不能被改变
} }

final 修饰方法:final 修饰方法不能被重写。

代码如下:

 class Aoo {
void test(){}
final void show(){}
} class Boo extends Aoo{
void test(){}
void show(){} // 编译错误,final 方法不能被重写
}

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

代码如下:

 class Aoo {}
class Boo extends Aoo{}
final class Coo extends Aoo{} // final 修饰的类可以继承别的类 final class Doo{}
class Eoo extends Doo{} // 编译错误,final 修饰的类不能被继承

Java 从入门到进阶之路(十二)的更多相关文章

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

    在之前的文章我们介绍了一下 Java 中的包装类,本章我们来看一下 Java 中的日期操作. 在我们日常编程中,日期使我们非常常用的一个操作,比如读写日期,输出日志等,那接下来我们就看一下 Java ...

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

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 中的一些常用方法,本章我们来看一下 Java 集合框架中的Collection 的迭代器 Iterator. 当我们创建 ...

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

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的泛型,本章我们来看一下 Java 集合框架中的Collection 的子接口 List. Collection 接口有 ...

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

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的子接口 List的 增删改查和与数组间相互转换的方法,本章我们来看一下 Java 集合框架中的Collection 的 ...

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

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的子接口 List,本章我们来看一下 Java 集合框架中的Collection 的子接口 Queue. 在之前我们讲 ...

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

    在之前的文章我们都是通过 Java 在内存中应用,本章开始我们来看一下 Java 在系统文件(硬盘)上的操作. 系统文件就是我们电脑中的文件,简单来说就是像 Windows 系统中 C D E 等各类 ...

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

    在之前的文章我们已经可以对本地对文件和目录进行新建和删除等操作,接下来我们来对文件内对具体内容进行操作. 如下代码,我们实现了一个基本的文件写入: /** * java.io.RandomAccess ...

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

    之前的文章我们介绍了一下用 IDEA 编辑器创建一个 Java 项目并输出 HelloWorld,本章我们来看一下 Java 中的变量和基本数据类型. 在这之前我们先来看一下 Java 中的关键字,这 ...

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

    在之前的文章我们介绍了一下 Java 中的日期操作,本章我们来看一下 Java 集合框架中的Collection. 早在 Java 2 中之前,Java 就提供了特设类.比如:Dictionary, ...

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

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的迭代器 Iterator,本章我们来看一下 Java 集合框架中的Collection 的泛型. 在讲泛型之前我们先来 ...

随机推荐

  1. C语言程序设计100例之(10):最大公约数

    例10        最大公约数 问题描述 有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b.若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c. 输入数据 第 ...

  2. SpringBoot 整合jdbc和mybatis

    摘要 该文章主要为记录如何在SpringBoot项目中整合JDBC和MyBatis,在整合中我会使用简单的用法和测试用例,毕竟该文章目的是为了整合,而不是教大家如何去使用.希望大家多多包涵. 通用配置 ...

  3. SqlServer2005 查询 第二讲 distinct

    今天我们来说distinct关键字的用法. distinct - distinct:我们可以这样理解成[过滤重复值] - select distinct deptno from emp // -- 首 ...

  4. 为企业应用开发提速,写给企业IT部门的低代码开发基础知识

    简介:应用程序开发长期以来一直是IT部门和业务部门面临的问题. IT部门总是被新的应用程序需求弄得不堪重负.他们不可能完成业务部门想要完成的每一个项目. 同时,业务部门的用户厌倦了等待,并开始完全绕过 ...

  5. python三种格式化输出

    name = '张三'age = 22job = Engineersalary = 99999999 info1 = ''' ---------- info1 of %s ---------- nam ...

  6. 新一代开源即时通讯应用源码定制 运营级IM聊天源码

    公司介绍:我们是专业的IM服务提供商!哇呼Chat是一款包含android客户端/ios客户端/pc客户端/WEB客户端的即时通讯系统.本系统完全自主研发,服务器端源码直接部署在客户主机.非任何第三方 ...

  7. 7. SOFAJRaft源码分析—如何实现一个轻量级的对象池?

    前言 我在看SOFAJRaft的源码的时候看到了使用了对象池的技术,看了一下感觉要吃透的话还是要新开一篇文章来讲,内容也比较充实,大家也可以学到之后运用到实际的项目中去. 这里我使用Recyclabl ...

  8. &#128293;《手把手》系列基础篇之2-python+ selenium-打开和关闭浏览器(详细)

    1. 简介 本节介绍如何初始化一个webdriver实例对象driver,然后打开和关闭firefox浏览器.要用selenium打开fiefox浏览器.首先需要去下载一个driver插件geckod ...

  9. mac如何开启两个vmware虚拟机

    转载链接:https://blog.csdn.net/aifore/article/details/87833088

  10. vuejs中的回车事件

    @keyup.enter.native="事件名称"