文章目录
简单概述
此文章是自己进行java学习的一个总结内容, 可能会有多篇.
类与对象
类本质上是一个模板, 是一种抽象都描述, 是一系列事务的特征和行为的抽取, 对于其特征我们称之为属性, 对于其行为我们称之为方法.
public class 类名{
属性;
方法;
}
对象则是根据类产生出来的一个具体实例, 其可以运行类中的各种行为(方法).
类名 对象名(变量名) = new 类名;
类中的6大组成部分
成员变量
定义在类当中, 其在方法外且不被static修饰的变量, 我们称之为成员变量.
成员变量属于对象, 可以不用给初始值, 系统会根据其基本类型赋予初值:
整数变量: 0, 小数变量: 0.0, 字符变量: \u000, 布尔变量: flase, 引用类型: null
成员变量的作用域为整个类.
成员方法
定义在类当中且不被static修饰的方法, 我们称之为成员方法.
局部变量
局部变量则是定义在方法内部或者参数列表中的变量, 局部变量的作用域在方法体内部, 且必须要有初始值才能使用.
静态变量
被static修饰的变量我们称之为静态变量, 静态变量是所有对象共同拥有的属性, 其本质上是类所独有的.
静态方法
被static修饰的方法我们称之为静态方法, 静态方法是所有对象共同拥有的方法, 其本质上是类所独有的.
构造方法
构造方法是创建类所必须的, 默认情况下创建类时会默认拥有一个无参的构造方法, 其主要目的时用于给对象进行初始化, 使得对象能够正常创建.
构造方法的特点
- 构造方法其方法名和类名一模一样
- 构造方法没有返回值类型
- 在类中如果实现了一个构造方法, 那么默认的无参构造方法会消失.
构造方法的格式
// 无参构造
修饰符 类名(){
}
// 有参构造
修饰符 类名(参数列表){
.....
}
其他
成员变量与局部变量的比较
比较部分 | 局部变量 | 成员变量 |
---|---|---|
定义位置 | 方法内部 | 类中方法外 |
作用域 | 方法内部 | 整个类中 |
默认值 | 没有默认值, 必须初始化 | 有默认值, 可以直接使用 |
初始化位置 | 栈内存 | 堆内存 |
生命周期 | 随着方法的调用初始化, 随着方法的运行完毕而消失 | 随着对象的创建而初始化, 随着对象的消失而消失 |
抽象类
定义
被abstract
关键字修饰的类称为抽象类
格式
abstract class 类名{
}
什么时候使用抽象类
- 在不确定子类中的方法逻辑时, 此时可以通过使用抽象类来定义方法, 这个时候可以通过添加
abstract
关键字来定义抽象方法, 当子类继承该类的时候, 此时会强制要求重写抽象方法 - 如果我们需要强制对子类的一个方法进行重写时, 此时也可以定义抽象方法, 强制要求子类对其进行重写.
特点
- 抽象类本身还是一个类, 拥有类的所有特性
- 抽象类虽然也具有构造方法, 但是其不能进行对象创建
- 抽象类的构造方法, 主要是保证抽象类的构造, 使得子类对象能够初始化成功
- 有抽象方法的类一定是抽象类, 抽象类本身不一定有抽象方法.
包
定义
包其实就是对应在磁盘当中的文件夹.
如何进行包名定义
域名倒写原则, 比如baidu.com
创建包名时就需要使用com.baidu
的方式.
final关键字
定义
final
关键字可以用来定义常量, 被其修饰后无法在进行更改.
final关键字的使用场景
使用场景 | 结果 |
---|---|
修饰类 | 该类不可以被继承 |
修饰方法 | 该方法不可以被重写, 只能修饰普通方法, 抽象方法无法修饰 |
修饰变量 | 变量变成常量, 修饰基本类型变量时变量值无法更改, 修饰引用类型变量时, 地址值无法改变, 内存中具体的值可以改变 |
实参与形参
实参: 调用方法时, 真实传入的变量或者常量
形参: 方法的参数列表, 就叫形式参数
当实际参数是基本类型时, 形式参数的改变不会影响实际参数.
当实际参数是引用类型是, 形式参数的改变会影响实际参数.
static关键字
定义
static
关键字修饰的内容在jvm中都会被认为属于类而不是属于对象, 所以被static
修饰的变量或者方法, 都可以被类名直接调用.
静态和成员的区别
静态 | 成员 | |
---|---|---|
属于范围 | 静态属于类 | 成员属于方法 |
初始化时间 | 静态是随着.class文件进入方法区就开始加载 | 成员是随着new一个新对象而创建 |
调用情况 | 静态不能调用对象 | 对象可以调用静态 |
是否共享 | 静态被所有对象共享 | 对象不能共享其成员 |
接口
定义
接口其内部的变量和方法默认都是由public static final
进行修饰, 类可以进行多个接口的实现, 解决了类只能单个继承的问题.
格式
interface 接口名{
抽象方法;
}
// 接口的调用
class 类名 implements 接口名{
}
注意事项
- 接口内部没有构造方法
- 类可以一次性实现多个接口
- 类可以在继承一个类的同时是实现多个接口
- 接口和接口之间是继承关系, 而且是多继承
- 类的实现和继承同时存在的情况下, 一定是继承在前, 实现灾后
- 接口中所有的变量默认都是由
public static final
进行修饰的
接口与抽象类的区别
接口 | 抽象类 | |
---|---|---|
构造方法 | 接口没有构造方法 | 抽象类有构造方法, 但是不能创建对象 |
变量 | 接口中所有的变量都是常量 | 抽象类中既可以有变量也可以有常量 |
方法 | 接口中所有的方法都是抽象方法 | 抽象类中可以有抽象方法也可以没有 |
实现与继承 | 接口可以多实现 | 抽象类只能单继承 |
面向对象的三大特征
封装
封装主要是将类中的属性进行私有化, 使其不能被其他类直接进行调用, 而是通过提供的方法进行调用, 以此来阻止跨类访问属性可能会出现的问题.
模板类
- 对成员变量进行私有化(添加
private
关键字) - 提供无参和有参构造
- 提供get和set方法
- 提供toString方法
匿名对象
匿名对象是直接通过new
关键字创建出来的对象, 其本身调用完, 可以直接被回收.
好处
- 使用简单放方便
- 没有引用指向匿名对象的内存区, 可以做到及时回收.
继承
继承是将多个具有相同属性或功能的类的抽取, 将这些抽取到一个公共类中, 其他类如果想要使用这些属性和行为, 就需要和公共类产生关系, 而这个关系称之为继承关系.
格式
class 子类名 extends 父类名{
}
注意事项
- Java中只允许单继承, 不允许多继承, 但是可以多层继承
- Java中所有的类默认都继承自一个类, 这个类是java中的根类(Object)
- Java中被继承的类叫做父类(超类), 继承的类叫做子类(派生类)
- 不要为了继承而继承, 要在体系下去继承
好处与坏处
好处: 节省了代码量, 提高了代码的复用性
坏处: 增强了类与类之间的耦合性
继承体系
重名 | 不重名 | |
---|---|---|
非私有成员变量 | 使用super(父类)与this(子类)关键字 | 直接调用 |
非私有成员方法 | 使用super(父类)与this(子类)关键字 | 直接调用 |
构造方法:
- 构造方法不能被继承, 因为构造方法需要和类名一致
- 继承体系下, 子类的每次构造都会调用一次父类的构造方法.
重写:
如果子类具有一个和父类方法声明一模一样, 方法体不一样的方法, 此时称为方法的重写.
this与super
在前面我们知道, this
关键字是用来指代当前对象的, 而这里的super
对象则是用来指代其父类对象的, 它们的使用方式有如下几种:
- 调用变量
this.变量名 // 当前类的对象的变量
super.变量名 // 父类中的对象
- 调用方法
this.方法名 // 调用当前类中的某个方法
super.方法名 // 调用父类中的某个方法
- 调用构造方法
this() // 调用当前类的无参构造
this(参数) // 调用当前类的有参构造
super() // 调用父类的无参构造
super(参数) // 调用父类的有参构造
多态
定义
实现多态的三个前提条件:
- 必须得有继承关系或者实现关系
- 必须要有方法的重写
- 父类的引用指向子类的对象
多态在调用重写方法时, 默认走的是子类重写后的方法, 但是父类中必须得有该方法, 才能通过编译
使用多态调用重写方法时: 编译看左边, 运行看右边.
关于我
我的Github: PorterZhang2021
我的博客地址:PorterZhang