1.1什么是类和对象
类是模子,是不存在的,用来确定将会拥有的特征(属性)和行为(方法)。
类的特点:
类是对象的类型;
是具有相同属性和方法的一组对象的组合;
对象的属性: 对象拥有的各种属性,每个对象的每个属性都拥有特定值。
对象的方法: 对象执行的操作。
类是抽象的概念,如手机
对象是具体实体,如小米
1.2 定义类
类的重要性:所有Java程序都以类class为组织单元
定义一个类的步骤:
- 定义类名
- 编写类的属性
- 编写类的方法
1.3如何使用Java中的对象
- 创建对象 : 类名 对象名 = new 类名()
- 使用对象 :引用对象的属性和方法: 对象名.属性 对象名.方法
1.4 成员变量和局部变量
作用域 | 初始值 | 其他 | ||
成员变量 | 类中定义,用来描述类有什么 | 在整个类中都是可见的 | Java会给成员变量一个初始值 | 不同方法中可以有同名的局部变量 |
局部变量 | 类的方法中定义,在方法中临时保存数据 | 仅限于定义它的方法 | Java不会给成员变量一个初始值 | 局部变量的优先级比同名的成员变量高 |
1.5 Java 中的构造方法
- 使用 new + 构造方法, 创建一个新的对象
- 构造的方法是定义在Java类中的一个用来初始化对象的方法
构造方法与类同名且没有返回值
当没有指定构造方法时,系统会自动添加无参的构造方法
当有指定构造方法时,即使只定义了有参的,系统也不会自动添加无参的构造方法
构造方法的重载: 方法名相同,但是参数不同的多个方法,调用时会根据不同的参数选择相应的方法
构造方法不但可以给对象的属性赋值,还可以保证给对象的属性赋一个合理的值。
1.6 Java中static使用之静态变量
Java中被static 修饰的成员称为静态成员或 类成员,它属于整个类所有,而不是某个对象所有,即被所有的对象所共享。
静态成员可以使用类名直接访问,也可以使用对象进行访问。推荐用类名访问
使用static 可以修饰变量,方法和代码块。
注意:静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间,直到该类被卸载才会进行资源回收!
1.7 Java 中static 使用之静态方法
与静态变量一样,我们也可以使用static修饰方法,称为静态方法或类方法。
之前我们一直写的main函数方法就是静态方法。
public static void main ( String[] args) { }
注意:
- 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员,可以在静态方法中创建类的对象,通过对象来访问非静态变量;
- 在普通成员方法中,则可以直接访问同类的静态变量和非静态变量;
- 静态方法中不能直接调用非静态方法,需要通过创建对象来访问非静态方法。
1.8 Java 中static 使用之静态初始化块
Java中可以通过初始化块进行数据赋值:
public class Hello {
String name; //定义一个成员变量
// 通过初始化块为成员变量赋值
{
name = "爱慕课";
}
}
在类的声明中,可以包含多个初始化块。
当创建类的实例时,就会依次执行这些代码块。
如果使用 static 修饰初始化块,就称为静态初始化快。
注意: 静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量
运行结果:
通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。由于静态初始化块只在类加载时执行一次,所以当再次创建对象 hello2 时并未执行静态初始化块。
面向对象的三大特性: 封装,继承,多态
封装
2.1 什么是Java中的封装
概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
好处:
- 只能通过规定的方法访问数据
- 隐藏类的实例细节,方便修改和实现
封装的实现步骤
- 修改属性的可见性,设为private
- 创建getter/setter 方法,用于属性的读写
- 在 getter/setter方法中加入属性控制语句,对属性值的合法性进行判断
2.2 使用包 管理Java中的类
包的作用:
管理Java文件,解决同名文件冲突
定义包: package 包名
注意:必须放在Java源程序中的第一行,包名之间可以用点号”.“隔开
系统中的包:
Java.(功能).(类)
java.lang.(类) 包含Java语言基础的类
java.util.(类) 包含java语言中各种工具类
java.io.(类) 包含输入输出相关功能的类
包的使用:
使用 import 关键字在某个文件中使用其他文件夹中得类。
java中,包的命名规范是全小写字母。
.* 可以把某个包下的所有文件加载进来。
2.3 Java 中访问修饰符
访问修饰符: 可以修饰属性和方法的访问范围。
访问修饰符 | 本类 | 同包 | 子类 | 其他 |
private | √ | |||
默认 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
2.4 Java 中的this关键字
this关键字代表当前的对象
this.属性
this.方法
封装对象的属性时,经常会使用this关键字
2.5 Java中的内部类 Inner Class
内部类就是定义在另一个类里面的类。
同理,包含内部类的类被称为外部类。
内部类的作用:
- 内部类提供了更好的封装,可以把内部的类隐藏在外部类之内,不允许同一个包中的其他类访问该类。
- 内部类的方法可以直接访问外部类的所有数据,包括私有的数据;
- 内部类所实现的功能,使用外部类同样可以实现,只是有时使用内部累更方便
内部类有以下几种:
- 成员内部类
- 静态内部类
- 方法内部类
- 匿名内部类
/外部类HelloWorld
public class HelloWorld {
// 内部类Inner,类Inner在类HelloWorld的内部
public class Inner {
// 内部类的方法
public void show() {
System.out.println("welcome to imooc!");
}
}
public static void main(String[] args) {
// 创建外部类对象
HelloWorld hello = new HelloWorld();
// 创建内部类对象
Inner i = hello.new Inner();
// 调用内部类对象的方法
i.show();
}
}
继承
3.1 Java中的继承
概念: 继承是类与类的一种” is a“ 的关系
父类,基类 ------- 子类,派生类
注意:Java中的继承是单继承的,只有一个父类。
继承的好处:
子类拥有父类的所有属性和方法,但 private修饰的除外;
实现代码复用
语法规则:
class 子类 extends 父类 { }
3.2 Java中的方法重写:
什么事方法的重写:
如果子类对继承父类的方法不满意,是可以重写父类继承方法的,当调用方法时会优先调用子类的方法。
语法规则: 返回类型,方法名,参数 都要和父类继承方法相同才可以。
3.3 Java中的继承初始化顺序
- 初始化父类,在初始化子类
- 同一个类中,先执行初始化对象中属性,再执行构造方法中的初始化
也就是说: 父类属性初始化 ==> 父类构造方法 ==> 子类对象属性初始化 ==> 子类对象构造方法
3.4 Java中的fanal 关键字
final关键字作标识有”最终的“含义,也就是说不可修改,不可变化的。
- final 修饰类,则该类不允许被继承
- final 修饰方法,则该方法不允许被覆盖(重写)
- final 修饰属性,则该类的属性不会进行隐性的初始化(类的初始化必须有值),或是在构造方法中赋值,必须二者选其一。 也就是说要么在属性的声明时赋初始值,要么在构造函数里面赋值。
- final 修饰变量, 则该变量的值只能赋一次值,在声明的时候初始化赋值,即变为常量。
3.5 Java中的super 关键字
super 关键字在对象的内部使用,可以代表父类的对象。
子类的构造过程中,必须调用父类的构造方法。
程序隐式的在子类的构造函数里的
第一行添加父类的构造方法,如super();
如果子类构造方法中既没有显式的调用父类的构造方法,而父类又没有无参的的构造方法,则编译出错。
3.6 Java中的Object类
Object 类是所有类的父类,也就是Java世界中的老总。
如果一个类没有使用 extends 关键字明确标识继承另外一个类,那么这个类默认基本Object类。
Object类中的方法,适合所有的子类。
Object类 常用方法:
- toString() 方法,返回对象的哈希code码(对象地址字符串);哈希码是用来唯一区分对象的字符串。可以通过重写toString() 方法表示出对象的属性
- equals() 方法 ,比较的是对象引用的是否指向同一块内存地址,可以通过重写equals() 方法使其比较两个对象的值是否一致。
new 类 : 得到的是 类的对象
对象调用 getClass() 方法 : 得到的是 类对象
多态
4.1 Java中的多态
多态: 对象的多种形态
注意: 继承是多态实现的基础。
1 引用多态
父类的引用可以指向
本类的对象
父类的引用可以指向
子类的对象 (注意:子类的引用不能指向父类的对象)
2 方法多态
创建本类的对象时,调用的方法是本类的方法
创建子类的对象时,调用的方法为子类重写的方法或继承的方法
如果子类具有独有的方法,不是从父类继承来的,那就不能通过父类的引用来调用子类独有的方法。
4.2 多态中的引用类型转型
1 向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 无风险
2 向下类型转换(强制类型转换),是大类型到小类型的转换 : 有风险,可能溢出
可以运用运算符 instanceof 来解决引用对象的类型,避免类型转换的安全性问题。
4.3 Java中的抽象类
语法定义: 抽象类前使用abstract 关键字修饰,则该类为抽象类。
应用场景:
- 某些情况下,某个父类只是知道其子类应该包含怎样的方法,但是无法准确知道这些子类如何实现这些方法;(约束子类必须有哪些方法,但不约束其具体实现)
- 从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免子类设计的随意性。
作用: 限制规定子类必须实现某些方法,但不关注实现细节。
使用规则:
- abstract 定义抽象类
- abstract 定义抽象方法,只有声明,不需要实现
- 包含抽象方法的类必须是抽象类
- 抽象类中可以包含普通的方法,也可以没有抽象方法
- 抽象类不能直接创建,可以定义引用变量
抽象方法 没有方法体则以分号结束。
4.4 Java中的接口
概念: 接口可以理解为一种特殊的类,由全局变量和公共的抽象方法所组成。
如果说类是一种具体实现体,而接口定义了某一批类所需要遵循的
规范,接口不需要关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类里必须提供的某些方法。
和定义类不同,定义接口不再使用 class 关键字,而是使用interface 关键字
基本语法:
[修饰符] interface 接口名 [extends 父接口1, 父接口2 ... ]
{
零到多个常量定义 。。。
零到多个抽象方法定义。。。
}
注意:
interface 前一定有 abstract,自己没显式地添加时,系统也会自动添加
可以有多个父接口, 而Java类最多只有一个父类。
接口定义
- 常量: 接口中的属性是常量,即使定义时不添加 public static final 修饰符,系统也会自动加上;
- 方法: 接口中的方法只能是抽象方法,总是使用;即使定义时没有添加 public abstract修饰符, 系统也会自动加上;
接口中方法不能有方法体,同时方法的访问修饰符不能是 private 和 protected
使用接口:
一个类可以实现一个或多个接口,实现接口使用 implements 关键字。
Java中的一个类只能继承一个父类,是不够灵活的,通过实现多个接口可以做补充。
继承父类实现接口的语法:
[修饰符] class 类名 extends 父类 implements 接口1, 接口2 ..
{
类体部分 ;
// 如果继承了抽象类,需要实现继承的抽象方法;
// 也要实现接口中的抽象方法
//如果要继承父类,继承父类必须在实现接口之前
}
通过接口可以描述两个不同的类型之间相同的特征。
使用接口:
接口类对象引用指向实现类的对象:
另外一种使用接口的方式:
接口在使用的过程当中,还经常与匿名内部类配合使用
匿名内部类就是没有名字的内部类,多用于关注实现而不关注类的名称
4.7 UML 简介
Unified Modeing Language 统一建模语言/ 标准建模语言
是一个支持模型化和软件系统开发的图形化语言