本系列记录Java学习过程中当日学过的, 自己觉得容易忘记的重点内容, 内容跟随课程内容变动, 具体参考笔记大纲. 系列是每天学习后随手总结, 所用代码例子与词句不够精妙, 望读者海涵.
新手写作, 若有错误的地方, 恳请读者指正, 先行谢过.
- 系列说明
- 正文
- Java的继承
- 继承解决的问题?
- 多重继承?多继承?
- 怎样使用继承?
- 继承中的方法重写
- super与this
- Java中的final关键字
- 虾米是final?
- Java中的static关键字
- 为什么static
- static的注意事项
- 包
- 跨包访问-导包
- 类名重复?
- 修饰符的级别
- 修饰符权限说明
- 常量
- 枚举类型enum
- 新建枚举类Season:
- 抽象abstract
- 为什么要有抽象?
- 抽象类的特征
- 模版方法模式Template
- 接口interface
- 什么是接口?
- 接口的特性
- 类与接口的关系
- JDK9+开始, 接口新增的成员
本质上都是为了少写代码, 提高共性代码的复用程度.
例如学生A与老师B, 他们可能有不同的特性, 但是他们本质上都是人, 有共性的年龄名字等属性, 可以定义Student与Teacher类, 从Human继承.
首先要明白二者间的区别:
- 多继承: 一个孩子有很多爸爸, (在人类生理学上目前不可能的)
- 多重继承: 一个爸爸有很多孩子, (有道理)
Java支持多重继承, 不支持多继承,所以Java是一门科学的语言.
class A{
}
//用extends创建 B类, 就继承了A类
class B extends A{
}
继承中的方法重写
class A{
public void boo(){
System.out.println();
}
}
class B extends A{
@Override
public void boo(){
System.out.println("重写了");
}
}
重写方法的返回值, 参数列表, 名称都需要和父类相同, 并且有修饰词优先级如下:
private(无法被重写) < 缺省不写 < protected < public
子类重写父类的方法时, 访问权限必须大于等于父类.
super与thissuper与父类捆绑, this符合就近原则, 会现在子类中找.
在调用变量或者方法时, super与this用起来像是一个类,
super.父类方法 super.父类变量 this.成员方法(子类如果没有,去找父类) this.成员变量(子类如果没有,去找父类)
在构造函数内, 使用起来像一个方法/函数
super(无参或多参,...) this(无参或多参,...)
调用父类或就近类的构造方法, 注意!!这类代码必须在构造函数的第一行.
Java中的final关键字 虾米是final?final意为最终, 用最终修饰类/方法/变量, 都有最终版本, 不可改变的意思
- 用于类, 类变成不可继承的类
- 用于方法, 方法无法@override
- 用于变量: 引用变量的地址不能改变, 基本变量的值不能改变
就是, 最终版本
Java中的static关键字 为什么static被static修饰的方法, 变量为静态变量, 跟随类的加载创建, 早于对象实例的存在.
可以通过<类名.变量名(方法名())>调用
static的存在使得一些使用一些方法和量的时候不再需要每次都新建一个对象的实例, 节省了存储空间.(在代码过程中, 新建实例再调用static修饰的内容, 在编码为.class文件时与直接使用无异).
得益于static的方法可以直接调用, 可以专门写一个tools类存放各种通用方法, 调用起来非常方便.
static的注意事项-
静态内容可以互相调用, 不能调用非static内容(因为static内容在堆区的生成早于对象的其它内容)
-
同理, 静态方法中不能有this. 关键字.
-
要注意的一点是, 如果缺少保护, static的变量可以被任意修改, 对于维护并不友好, 所以应该适当保护.
import 包名.类名类名重复?
修饰符的级别 修饰符权限说明严格按照包名.类名访问.
| 本类内 | 本包内 | 子类(可跨包) | 任意包(可跨包) | |
|---|---|---|---|---|
| private | 可 | |||
| 缺省 | 可 | 可 | ||
| protected | 可 | 可 | 可 | |
| public | 可 | 可 | 可 | 可 |
由final修饰的变量, 在创建时遵循全部大写的命名规范
命名应如:
SCHOOL SCHOOL_NAME枚举类型enum 新建枚举类Season:
public enum Season{
SPRING , SUMMER , AUTUMN , WINTER;
}
注意: 枚举项必须写在第一行, 枚举类中可以写成员变量与成员方法、构造方法
反编译可以看到Java底层实际上是创建了一个继承自Enum类的新类
public final class Season extends java.lang.Enum{ public static final Season SPRING = new Season(); public static final Season SPRING = new Season(); public static final Season SPRING = new Season(); public static final Season SPRING = new Season(); public static Season[] values(); public static Season valueOf(java.long.String); }
在新类中, 所有枚举项都是一个创建好的静态final对象, 并且类中提供了一个返回所有枚举项的方法values()
枚举项建立时默认调用无参构造方法, 如果手动写了其它构造方法, 可以使用 <名称>(参数) 构造枚举对象.
抽象abstract 为什么要有抽象?抽象类用来规定子类中必须实现的功能.
抽象类的特征- 抽象类的对象无法被创建
- 抽象类中可以有非抽象方法
- 子类继承抽象父类的时候, 必须重写抽象父类的所有抽象方法, 除非子类也是一个抽象类, 抽象子类用来扩充父类的要求, 在继承子类的孙子非抽象类中, 必须实现上层所有的抽象方法. 套娃.
- abstract不与static同时存在
存在的意义是减少重复代码, 留出待实现的变通部分为抽象方法, 其它方法预先写好, 同时可以创建一个final方法, 以正确顺序调用模版类的方法.
在使用模版类的子类时, 只需要重写好抽象方法, 并调用模版类的输出方法, 就能正确输出所有内容.
接口interface 什么是接口?接口是用来指定规则的, 它是一种特殊的类.
接口的特性接口中定义的量, 实际上被一个隐含的
int a; //实际上是 public static final int a;
接口中的方法都是抽象方法
void show(); //实际上是 public abstract void show();
一个类可以实现多个接口: 就是一个创建的类可以满足很多interface的要求, 语法为
class <新类> implements <接口1> , <接口2>{
...
}
类与接口的关系
| 类 | 接口 | |
|---|---|---|
| 类 | 类间只能单继承 | 一个类中可以实现多个接口 |
| 接口 | 接口间允许多继承 |
JDK8+:
默认方法: public default修饰的方法 默认方法不强制接口的实现类重写, 但是可以被重写
静态方法: public static修饰的方法
JDK9+:
私有方法: private修饰的方法



