Java基础语法(封装)

封装

面向对象程序的三大特性: 封装, 继承, 多态. 封装, 就是将程序细节隐藏起来, 通过接口来给用户使用. 例如一台电脑, 使用电脑的用户不需要关注电脑是怎么组装的, 内部细节是什么, 而是关注电脑是怎么去使用的, 怎么使用鼠标, 怎么操作键盘等等…

访问限定符

Java中通过访问修饰限定符来实现类的封装.
访问限定符表
public : 在任何地方都可以访问.
private : 只能在类内部访问.
default : 也叫做包访问权限, 在同一个包下面可以访问 (关键字可以不写).
protected : 除了可以在一个包内部访问, 也可以在不同包中的子类访问. (和继承有关)

访问修饰限定符不仅可以修饰成员变量, 也可以修饰成员方法, 甚至构造方法.

试想 : 如果private修饰构造方法, 会发生什么情况?
private修饰构造方法
上图可以看到, 一旦构造方法被private修饰, 类便不能再外面被实例化. (后面单例模式会用到)

Java中用import语句来导入包中的类.
import语句

自定义包

自定义包情况

static

在Java中, 被static修饰的成员被称为静态成员(类成员), 静态成员不属于具体的对象, 被所有对象共享.

static修饰成员变量

static修饰成员变量
static修饰成员变量后, 创建对象时成员变量就不会放在堆上, 而是放在方法区当中. 现在我把Cat类中的color属性由static修饰, 然后当我创建三个对象的时候, JVM里的存储情况:
JVM存储情况
可以看到, 作为普通成员变量的name, 在堆上有三个, 而静态成员变量color 则只在方法区中创建了一份.

static修饰成员方法

static修饰成员方法
static 也可以修饰成员方法.

静态成员的特性:

  1. 静态成员变量和静态成员方法都用类名来调用, (也可以用对象来调用, 语法上支持, 但是不推荐)
    静态成员的调用
  2. 静态成员变量的生命周期伴随类的一生. (和类一起被创建, 和类一起被销毁)
  3. 不能在静态方法中访问任何非静态成员变量和方法.
    特性三

可以看到, 我试图在静态成员方法func()中访问非静态成员方法run()和非静态成员变量name, 编译器都报错了…

4.静态方法不能重写, 无法实现多态.

代码块

普通代码块

在方法中的代码块, 用 { } 来表示, 比较少用.
普通代码块

实例代码块和静态代码块

**实例代码块(构造代码块)**是定义在类中的代码块, 同样用{}表示, 一般用来初始化成员变量.
静态代码块同样也是定义在类里的代码块, 用 static{} 表示, 用来实例化静态成员变量.
实例代码块和静态代码块
实例代码块和静态代码块的特性:

  1. 静态代码块是属于类的代码块, 在JVM加载类的时候就会执行, 而实例代码块在对象生成的时候才会加载.
  2. 静态代码块不管加载多少对象, 都只会执行一次, 而实例代码块是创建对象的时候就会加载, 有多少个对象就会执行多少次.
    代码块执行情况
  3. 静态代码块, 实例代码块, 构造函数按照上述顺序执行.
    三者执行顺序
  4. 如果类里有多个静态代码块, 那么按照先后顺序执行, 静态成员变量创建也和静态代码块也按照先后顺序执行(一般静态成员变量都会放在静态代码块前面)
    多个静态代码块
    就地初始化和静态代码块初始化
  5. 实例化代码块里可以写静态成员变量, 而静态代码块里不能写普通成员变量. (刚发现的…)
    变量赋值

同步代码块

和多线程有关.

内部类

在类的内部可以继续定义一个类, 类里面的类被称为 " 内部类 ". 内部类和普通的类一样, 也可以有成员变量, 成员方法. 内部类分为四种: 实例内部类, 静态内部类, 匿名内部类, 局部内部类.

实例内部类

实例内部类
这是一个实例内部类, 也可以…

实例内部类的调用

通过 类名.内部类名 内部对象名 = 对象名. new 内部类名(); 来实例化实例内部类, 前提是提前实例化一个外部对象.
调用实例内部类
也可以不用提前实例化外部类, 一句代码即可.
使用 类名.内部类名 内部对象名 = new 类名(). new 内部类名();
另一种方法调用实例化内部类

实例内部类的注意事项:

  1. 实例内部类里面不能有被static修饰的成员变量和方法.
    注意1
    但是被static修饰的变量再被final修饰就不会报错
    再被final修饰
    final也是Java中的关键字. 表明该变量是常量, 再被赋值的时候值就确定下来, 如果后面给它再赋值会报错.(一般被final修饰的变量名都是全部大写)
    final

  2. 实例内部类方法可以直接调用外部类的任何变量, 但是当外部类和内部类变量有重名时, 优先调用内部类自己的变量:
    直接调用外部类成员变量
    如果非要再内部类方法里调用外部类的变量, 有两种方法:
    1).在内部类方法里实例化外部类对象, 然后用 外部类对象. 变量 来调用
    调用外部类变量的方法1
    2).使用 外部类名.this.变量名 调用 调用外部类变量的方法2

  3. 实例内部类同样也受到public, private等修饰限定符的约束.

  4. 实例内部类的非静态方法中会包含一个指向外部类对象的引用.(第二条中所说的外部类名.this.变量名这种方法就是依靠这个特性)

  5. 外部类想要调用内部类的成员, 必须先创建内部类对象.

静态内部类

静态内部类
在class前加static就是一个静态内部类. 上图可以看到, 静态内部类可以有静态成员.

静态内部类的调用

可以直接调用, 不需要再创建外部类的对象.
调用静态内部类

静态内部类的注意事项:

  1. 静态内部类中不能直接访问外部类的非静态成员, 需要通过外部类的对象的引用来访问.
    注意事项1

局部内部类

定义在方法内部的类, 只能在方法内部使用, 随着方法结束类也被销毁, 不能被static, public等修饰符修饰.
不怎么用

匿名内部类

和抽象类和接口有关的类.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值