本帖最后由 小石姐姐 于 2017-12-22 15:34 编辑
就业班前6天知识点总结
day01 面向对象(静态, 数组工具类, 代码块)静态的概述和特点
static:
静态
是一个关键字
作用
修饰成员变量, 成员方法, 使其被该类的所有对象共享
修饰类(后面讲)
如何调用static修饰的变量和方法
类名.静态成员属性: System.out
类名.静态成员方法();: Arrays.toString(arr);
静态的特点
静态成员被所有对象共享
静态成员可以直接使用类名调用
静态成员的加载优先于对象
静态资源在创建类时加载并初始化(在方法区中)
非静态资源在创建对象时才加载并初始化(在堆内存中)
静态成员生命周期
随着类的加载而创建, 直到程序结束
静态成员在内存中的位置
方法区中的类的字节码区域中的静态区域中
静态成员的加载时机
随着所在类的加载而加载
静态成员和非静态成员的区别
生命周期不同
静态成员: 随着类的加载而创建, 随着程序结束而销毁
非静态成员: 随着对象的创建而创建, 随着对象的销毁而销毁
所以, 静态成员的生命周期优先于非静态成员创建, 晚于非静态成员销毁
内存中的定义位置不同
静态成员: 方法区中类字节码区域的静态区中
非静态成员: 堆内存中
初始化时机不同
静态成员: 类加载时初始化
非静态成员: 对象创建时初始化
静态注意事项
static的访问规则:
静态方法中
可以调用静态的成员变量
可以调用静态的成员方法
不可以调用非静态的成员变量
不可以调用非静态的成员方法
非静态方法中
可以调用静态的成员变量
可以调用静态的成员方法
可以调用非静态的成员变量
可以调用非静态的成员方法
静态方法中不能用this
因为this引用当前类的对象, 而静态方法在类加载时已经加载, 此时没有对象可以引用
静态的优缺点以及应用场景
优点:
为共享数据提供同一个存储空间, 节省内存空间
可以直接类名调用, 不用创建对象
缺点:
访问有局限性, 只能访问静态
静态的应用场景
作为该类所有对象的共享数据
工具类. 工具类一般只用于调用其中的方法进行逻辑处理, 没必要创建多个对象, 所以静态类名直接调用方法即可
Math类 ◆◆◆◆
◆ 静态成员属性:
◆ static double PI : 接近圆周率的一个double数字, 3.1415...
◆ 静态成员方法:
◆ static int/long/float/double abs(int/long/float/double a) : 返回一个数字的绝对值
◆ static double ceil(double a) : 向上取整
◆ static double floor(double a) : 向下取整
◆ static long round(double a) : 四舍五入取整
◆ static int round(float a) : 四舍五入取整
◆ static int/long/float/double max(int/long/float/double a, int/long/float/double b) : 返回两者较大值
◆ static int/long/float/double min(int/long/float/double a, int/long/float/double b) : 返回两者较小值
◆ static double pow(double a, double b) : 返回第一个参数的第二个参数次幂
◆ static double random() : 返回一个大于等于0.0并小于1.0的随机数
自定义工具类
利用static可以直接类名调用方法的特点, 定义类作为工具类, 处理常用操作
步骤
定义一个类
private修饰构造方法: 因为没必要使用对象
使用static修饰工具方法
如何避免一个类创建对象?
将构造方法使用private修饰, 让外界无法访问
代码块概述
代码块:
使用{}括起来的代码被称为代码块
4种代码块分类:
静态代码块
定义位置: 类中, 方法外, static修饰
执行时机: 加载类时执行, 只执行一次.
作用: 在加载类时进行一些初始化操作, 并且只需要执行一次
构造代码块
定义位置: 类中, 方法外
执行时机: 创建一个对象时, 在构造方法之前执行, 无论使用无参还是有参构造方法
作用: 为所有构造方法都执行同一种操作, 减少构造方法中编写重复代码
局部代码块
定义位置: 方法中
执行时机: 执行到方法中的局部代码块时
作用: 控制局部变量的生命周期(作用域)
day02 面向对象(继承, 匿名对象, 抽象类)
继承的概述
面向对象三大特征:
封装
继承
多态
继承,是面向对象三大特征之一
概念
从已有类派生出新的类
已有类称为父类(基类), 新类称为子类(派生类)
子类对于父类的关系就是继承
作用:
如果多个类有共同的成员变量和成员方法, 将他们抽取到另一个类(父类)中, 再让多个类去继承这个父类, 这些子类就可以获取到父类中的成员变量和成员方法
继承使用extends关键字:
作用: 子类继承父类时使用
定义位置: 子类类名后
格式: 权限修饰符 class 子类类名 extends 父类类名 {}
继承的特点◆◆◆
◆◆Java中类的继承的特点
◆ 只支持单继承: 一个类只能继承一个直接父类
◆ 不支持多继承: 有些语言如C++支持一个类同时继承多个直接父类, 但Java不支持
◆ 支持多层继承: 子类继承父类, 父类继承爷爷类...(父类无论多少层都叫父类)
注意:
Java中所有类都直接或间接的继承自Object类
继承关系中成员变量的特点
◆◆继承中成员变量的特点
◆ 子类只能获取父类的非私有的成员
* 老爹的私房钱儿子不知道
◆ 就近原则:
* 如果子类定义了与父类同名的成员变量, 则使用该变量时的值为子类中定义的值
* 如果子类没有定义父类同名的成员变量, 则使用父类变量时的值为父类中定义的值
◆◆子类父类中存在同名成员变量或方法时, 如何区分使用?
◆ this : 使用本类中的成员方法或变量, this.name;
◆ super : 使用父类中的成员方法或变量, super.name;
◆◆同名局部变量, 本类变量, 父类变量的使用顺序(就近原则):
◆ 有局部变量使用局部变量
◆ 没有局部变量, 使用本类成员变量
◆ 没有局部变量和本类成员变量, 使用父类成员变量
◆ 没有局部变量, 本类成员变量和父类成员变量, 则报错
继承关系中成员方法的特点◆◆◆
◆◆方法的重写:
◆ override, 重写, 重新编写, 也叫作覆写, 覆盖
◆ 在继承关系中, 子类方法和父类方法完全一样, 则子类重写了父类的方法, 此时子类调用该方法时调用的是子类中自己重写后的方法
◆◆方法重写(override)与方法重载(overload)的区别
◆ 定义位置不同:
◆ 重载: 同一个类中
◆ 重写: 存在继承关系的子父类当中
◆ 方法定义不同:
◆ 重载: 方法名相同, 参数列表不同, 与返回值, 形参名, 方法体无关
◆ 重写: 方法声明完全一模一样(权限要大于等于), 与方法体无关
◆◆重点: 重写的特点:
◆ 子类对象调用一个方法时:
* 子类中重写了这个方法, 则调用子类的重写方法
* 子类中没有这个方法, 则调用父类的
* 父类如果没有, 报错
方法重写的应用场景和注意事项◆◆◆
* 当父类的方法不能完全满足子类使用, 这时子类可以重写父类的方法
* 在重写方法中使用`super.方法名()`调用父类方法, 既可以保留父类方法功能, 也能实现自身特有功能
◆◆方法重写注意事项:
◆ 父类private方法不能重写
◆ 父类方法时私有private时, 子类可以定义相同方法, 但不是重写关系. 相当于子类看不见父类有这个方法
◆ 子类重写方法的权限必须大于等于父类方法的权限
继承中构造方法的执行顺序
◆◆继承关系中的构造方法执行顺序:
◆ 子类构造方法中默认会先调用父类无参构造
* 如果子类的构造方法的第一行代码中, 没有显式调用父类的构造方法(即没有 super() 和 this() ), 则默认会调用父类的无参构造方法(相当于增加了一行 super(); )
* 原因: 因为子类可能使用到父类的成员, 所以一定要先初始化父类成员, 初始化成员就是通过创建对象调用构造方法
◆◆子类构造方法中调用父类构造方法:
◆ 在子类构造方法的 第一行 使用 super(有参或无参); , 则调用父类的构造方法
◆◆子类构造方法中调用子类的其他构造方法:
◆ 在子类构造方法的 第一行 使用 this(有参或无参); , 则调用子类的其他构造方法
this和super的区别◆◆◆
◆◆this
◆ 关键字作用: 当前类的对象的引用
◆ 语句作用:
* 调用子类的成员变量: this.age;
* 调用子类的成员方法: this.eat();
* 在子类构造方法第一行调用子类的其他构造方法: this();
* 当子类没有父类的某个成员变量或成员方法时, this也可以调用父类的成员变量或成员方法(因为子类继承了父类的成员)
*
◆◆super
* 关键字作用: 当前类的对象的父类引用
* 语句作用:
* 调用父类的成员变量: super.age;
* 调用父类的成员方法: super.eat();
* 在子类构造方法第一行调用父类的构造方法: super();
◆ 注意:
* this和super用于调用构造方法时, 必须在构造方法第一行调用
继承的优缺点◆◆◆
◆◆优点:
◆ 提高代码复用性
◆ 提高代码可维护性
◆◆缺点:
◆ 类的耦合性增加了
◆ 开发中的原则是: 高内聚, 低耦合
* 内聚: 自身完成某件事的能力
* 耦合: 类与类的依赖关系. 耦合高了类与类之间相互依赖太多
匿名对象概述和应用场景◆◆◆
◆◆匿名对象:
◆ 匿名, 没有名字, 没有变量引用的对象
◆◆使用匿名对象的格式:
◆ 调用属性: new 类名().属性;
◆ 调用方法: new 类名().方法();
◆ 作为参数: student.eat(new Food("苹果"));
◆◆匿名对象应用场景:
◆ 当方法或属性只调用一次时, 使用匿名对象
final概述◆◆◆
◆◆final关键字:
◆ 是一个修饰符, 可以修饰类, 方法, 变量, 表示其无法改变
◆ 作用:
* 修饰类: 不能被继承
* 修饰方法: 不能被子类重写
* 修饰变量: 自定义常量
* 基本数据类型: 其值永不改变的常量
* 引用数据类型: 引用一经初始化便不能修改, 且必须在使用前对其初始化
◆◆ 常量分类:
◆ 字面值常量: 之前所学的如 "Hello", 12
◆ 自定义常量: final修饰的
* 常量名命名规则: 字母全都大写, 不同单词用下划线分隔, 如 YOUR_AGE
抽象类概述◆◆◆
◆◆什么是抽象?
◆ 无法具体描述的, 但能够表示出共性
◆◆abstract关键字:
◆ 表示抽象
◆ 修饰方法和类
◆◆抽象包括2种:
◆ 抽象方法:
* 使用abstract修饰, 没有方法体的方法, 也就是说没有 {...} , 直接以 ; 分号结尾
* 为什么没有方法体? 某些方法对于不同子类有不同实现, 如动物的吃方法, 松鼠抱着吃, 螃蟹夹着吃
* 抽象方法的修饰符只能是: public 或 protected
◆ 抽象类:
* 使用abstract修饰的类
* 含有抽象方法的类 必须 定义为抽象类
◆◆类与抽象类的关系:
◆ 抽象类也是类
◆ 一个子类继承了抽象类后只有2种选择:
1. 重写抽象类中抽象方法(可以是空实现),
2. 将该子类也改为抽象类
抽象类的特点◆◆◆
◆ 抽象类和抽象方法必须被abstract修饰
◆ 抽象方法只能定义在抽象类中
◆ 抽象类中也可以有非抽象的方法, 且也可以只有非抽象方法
◆ 抽象类不能创建对象 (即不能实例化, 不能new)
◆◆抽象类和类之间也可以存在继承关系
◆一个类继承了抽象类只有2种操作:
* 重写抽象方法
* 自身改变为抽象类
抽象类的成员特点◆◆◆
◆◆抽象类中
◆ 成员变量
* 可以有成员变量
* 可以有常量
◆ 成员方法
* 可以有抽象方法
* 可以有非抽象方法
◆ 构造方法
* 可以有构造方法, 用于子类通过调用 super();使抽象类的成员进行初始化
抽象类的细节◆◆◆
◆◆abstract不能与以下关键字共存
◆ final
* 抽象方法必须要重写, 而final指定方法不能被重写
* 抽象类要继承, 而final指定类不能被继承
◆ private
* 抽象方法必须是非private的, 否则子类无法访问到, 从而无法重写
◆◆抽象类不能创建对象, 但可以有构造方法来进行初始化
◆◆抽象类可以没有抽象方法
* 有时会将一个类定义为抽象类, 来防止创建对象
* private修饰构造方法也可以用于防止创建对象
day03 面向对象(接口, 多态)
接口的概述◆◆◆
◆ 接口是完全抽象的类, 接口中所有方法都是抽象方法
类和接口的关系: ◆◆
◆ 类实现接口
◆ 实现接口的类称为 xx接口的实现类
接口的作用: ◆◆
◆ 为实现类扩展出接口具有的功能
◆ 弥补Java只能单继承的局限性, 抽象类只能单继承, 而接口可以多实现
定义接口:◆◆
◆ 使用 interface 关键字替代 class
◆◆ 格式: 权限修饰符 interface 接口名 {}
一个类如何实现接口:◆◆
◆ implements 关键字
◆◆ 格式: 权限修饰符 class 类名 implements 接口名1, 接口名2... {}
// 定义一个接口 public interface Boss {}
// 父类 public class Programmer {}
// 子类既可以继承Programmer类, 又可以实现Boss接口 public class BillGates extends Programmer implements Boss {}
接口的成员特点◆◆◆
接口的成员变量◆◆
◆ 必须都是常量(自定义常量)
◆ 默认是 public static final 修饰的, 即使你不写或少写某个修饰符
接口的构造方法◆◆
◆ 不能定义构造方法, 也不能创建对象
接口的成员方法◆◆
◆ 必须都是抽象方法
◆ 不能是static的
◆ 默认是 public abstract 修饰, 即使你不写或少些某个修饰符
* 如果写也只能使用 public abstract 修饰, 因为接口必须通过实现类来实现抽象方法, 如果方法权限不足以调用, 则无法达成目的
接口和类的关系◆◆◆
类与类的关系:◆◆
◆ 继承关系: 子类继承父类
◆ 单继承, 多层继承
类与接口的关系:◆◆
◆ 实现关系: 类实现接口
◆ 多实现. (不能多层实现, 因为接口不能实现接口, 只能继承接口)
接口与接口的关系:◆◆
◆ 继承关系: 子接口继承父接口
◆ 多继承, 多层继承
接口的优点◆◆◆
接口的优点◆◆
◆ 通过多实现打破了单一继承的局限性
◆ 接口可以为实现类提供规则
◆ 降低程序耦合性(多人分别按照接口开发各自的功能)
接口和抽象类的异同◆◆◆
相同点◆◆
◆ 接口和抽象类都是抽取出共性的内容
不同点◆◆
◆ 与类的关系不同
◆ 类和接口是实现关系: 多实现
◆ 类和抽象类是继承关系: 单继承, 多层继承
◆ 成员变量定义不同
◆ 接口只能有静态常量, public static final
◆ 抽象类可以有成员变量, 也可以有常量
◆ 成员方法定义不同
◆ 接口只能有抽象方法, public abstract
◆ 抽象类可以有抽象方法, 也可以没有抽象方法(避免创建对象), 也可以有非抽象方法
◆ 构造方法定义不同
◆ 接口不能有构造方法, 也不能创建对象
◆ 抽象类可以有构造方法, 用于初始化成员, 但不能创建对象
多态的概述和实现◆◆◆
多态: ◆◆
◆ 一个事物可以具有多种表现形态
◆ 是面向对象三大特征之一
◆ 面向对象三大特征:
* 封装
* 继承
* 多态
多态的前提◆◆
◆ 子父类存在继承关系
◆ 子类有重写父类的方法
◆ 父类引用指向子类对象: `Animal cat = new Cat();`
动态绑定:◆◆
◆ 对象调用的成员方法, 是根据程序运行时的具体的类型确定的
多态的成员特点◆◆◆
* 成员变量: 编译看左边, 运行看左边. student.age 调用父类成员属性
* 静态方法: 编译看左边, 运行看左边. student.staticFunc(); 调用父类静态方法
* 成员方法: 编译看左边, 运行看右边. student.eat(); 调用子类
◆◆◆简化记忆规律: 除了成员方法运行时看右边, 其他无论编译还是运行都看左边
多态中的向上转型和向下转型◆◆◆◆
转型: ◆◆
◆ 即转换类型
向上转型: ◆◆
◆ 子类型转换为父类型(自动转换)
向下转型:◆◆
◆ 父类型转换为子类型(强制转换)
多态的优缺点◆◆◆
优点◆◆
◆ 提高代码复用性
◆ 提高可维护性
◆ 提高可扩展性
缺点◆◆
◆ 父类无法直接访问子类特有成员
多态的应用:◆◆
◆ 向上转型: 作为参数类型, 简化代码
◆ 向下转型: 调用子类对象特有的方法
day04 面向对象(包, 权限修饰符, 内部类)
包的作用和特点
包:
package, 就是文件夹(目录)
作用:
分类管理Java文件, 避免重名类的冲突
特点:
可以有多级, 每层目录就是一级
定义包:
使用package关键字
类的全名:
格式: 包名.类名
如: com.itheima.practice_01.Test
访问规则
相同包下的类:
直接访问
不同包下的类:
方式1: 导入包后直接使用类
方式2: 使用类的全名
创建非静态成员内部类的对象: ◆◆◆
◆◆格式:
外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
◆ 权限修饰符
◆ public, protected和默认都可以
◆ private: 只能在该内部类所在的外部类中访问, 在其他类中无法访问
* 与私有的成员变量一样, 因为内部类是外部类的成员, 所以外部类中可以访问自己的内部类; 而其他类中权限不够, 不能访问该内部类
◆ static: 静态成员内部类
◆ abstract: 可以, 抽象类
◆ final: 可以, 不让继承
创建静态成员内部类对象:◆◆◆
◆◆◆格式:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
示例: Outer.Inner inner = new Outer.Inner();
|
|