看慕课网Java第二季整理
访问修饰符
访问修饰符 | 本类 | 同包 | 子类 | 其他 |
---|---|---|---|---|
private | √ | |||
默认 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
this
this关键字代表当前对象
this.属性 操作当前对象的属性
this.方法 操作当前对象的方法
final
"最终的"
可以修饰类、方法、属性、变量
- 修饰类,则该类不允许被继承
- 修饰方法,则该方法不允许被覆盖(重写)
- 修饰属性,则该类的属性不会进行饮食的初始化,类的初始化属性必须有值,或在构造方法中赋值。(只能选择其一)
- 修饰变量,则该变量的值只能赋一次值为,即变为常量
super
在对象的内部使用,可以代表父类对象
- 访问父类的属性:super.属性名 如
super.age
- 访问父类的方法:super.方法名 如
super.eat()
- 如果子类的构造方法中没有显式调用父类的构造方法,则系统默认调用父类无参的构造方法
- 如果显式的调用构造方法,必须在子类的构造方法的第一行。
- 如果子类构造方法中既没有显式调用父类的构造方法,而父类有没有无参的构造方法,则编译出错。
内部类
内部类( Inner Class )就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。
内部类的主要作用如下:
内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
内部类的方法可以直接访问外部类的所有数据,包括私有的数据
内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
分类
- 成员内部类
- 静态内部类
- 方法内部类
- 匿名内部类
成员内部类
【示例】
//外部类HelloWorld
public class HelloWorld{
//外部类的私有属性name
private String name = "imooc";
//外部类的成员属性
int age = 20;
//成员内部类Inner
public class Inner {
String name = "爱慕课";
//内部类中的方法
public void show() {
System.out.println("外部类中的name:" + HelloWorld.this.name);
System.out.println("内部类中的name:" + name );
System.out.println("外部类中的age:" + age);
}
}
//测试成员内部类
public static void main(String[] args) {
//创建外部类的对象
HelloWorld o = new HelloWorld ();
//创建内部类的对象
Inner inn = o.new Inner();
//调用内部类对象的show方法
inn.show();
}
}
静态内部类
【示例】
//外部类
public class HelloWorld {
// 外部类中的静态变量score
private static int score = 84;
// 创建静态内部类
public static class SInner {
// 内部类中的变量score
int score = 91;
public void show() {
System.out.println("访问外部类中的score:" + HelloWorld.score );
System.out.println("访问内部类中的score:" + score);
}
}
// 测试静态内部类
public static void main(String[] args) {
// 直接创建内部类的对象
SInner si = new SInner();
// 调用show方法
si.show();
}
}
方法内部类
方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。
注意:由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。
【示例】
//外部类
public class HelloWorld {
private String name = "爱慕课";
// 外部类中的show方法
public void show() {
// 定义方法内部类
class MInner {
int score = 83;
public int getScore() {
return score + 10;
}
}
// 创建方法内部类的对象
MInner mi = new MInner();
// 调用内部类的方法
int newScore = mi.getScore();
System.out.println("姓名:" + name + "\n加分后的成绩:" + newScore);
}
// 测试方法内部类
public static void main(String[] args) {
// 创建外部类的对象
HelloWorld mo = new HelloWorld();
// 调用外部类的方法
mo.show();
}
}
抽象类
使用abstract关键字修饰的类为抽象类。
应用场景
- 父类只知道子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。
- 从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性
作用
限制规定子类必须实现某些方法,但不关注实现细节
使用规则
- abstract定义抽象类
- abstract定义抽象方法,只有声明,不需要实现
- 包含抽象方法的类是抽象类
- 抽象类中可以包含普通的方法,也可以没有抽象方法
- 抽象类不能直接创建,可以定义引用变量
【示例】
public abstract class Telephone{
public abstract void call();
public abstract void message();
}
public class Cellphone extends Telphone{
@Override
public void call(){
System.out.println("通过键盘打电话");
}
@Override
public void message(){
System.out.println("通过键盘发短信");
}
}
public class Smartphone extends Telphone{
@Override
public void call(){
System.out.println("通过语音打电话");
}
@Override
public void message(){
System.out.println("通过语音发短信");
}
}
封装
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
继承
- 先初始化父类再初始化子类
- 先执行初始化对象中属性,再执行构造方法中的初始化
多态
引用多态
- 父类的引用可以指向本类的对象。
- 父类的引用可以指向子类的对象。
方法多态
- 创建本类对象时,调用的方法为本类方法
- 创建子类对象时,调用的方法为本类重写的方法或者继承的方法
引用类型转换
- 向上类型转换(隐式/自动类型转换),是小类型到大类型的转换
- 向下类型转换(强制类型转换),是大类型到小类型
- instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题
【instanceof 示例】
//Dog,Cat类继承Animal类
Dog dog=new Dog();
Animal animal=dog;//向上类型转换 自动类型转换
if(animal instanceof Dog){
Dog dog2=(Dog)animal;
}else{
System.out.println("无法进行类型转换 Dog");
}
if(animal instanceof Cat){
Cat cat=(Cat)animal;
}else{
System.out.println("无法进行类型转换 Cat");
}
//会打印出来 “无法进行类型转换 Cat”
方法的重写
重写父类继承的方法,调用方法是优先调用子类的方法。
规则:返回值类型,方法名,参数类型及个数都相同。
接口 interface
类是一种具体实现体,而接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,而只规定这些类里必须提供某些方法。
接口定义的基本语法
[修饰符] interface 接口名 [extends 父接口1,父接口2...]
{
零个到多个常量定义
零个到多个抽象方法的定义
}
- 接口就是用来被继承被实现的,修饰符一般建议用public
- 注意:不能使用private和protected修饰接口。
- 接口是抽象的,abstract(不写abstract系统会自动加上)
常量:接口中的属性是常量,即使定义时不添加public static final 修饰符,系统也会自动加上
方法:接口中的方法只能是抽象方法,即使定义时不添加public abstract修饰符,系统也会自动加上。
[修饰符] class 类名 extends 父类 implements 接口1,接口2...{
类体部分//如果继承了抽象类,需要实现继承的抽象方法;要实现接口中的抽象方法
}
如果要继承父类,继承父类必须在实现接口之前
使用接口
一个类可以实现一个或多个接口,实现接口使用implements关键字。Java中一个类只能继承一个负类,不够灵活,通过实现多个接口可以做补充。
匿名内部类
接口在使用过程中,还经常与匿名内部类配合使用
匿名内部类就是没有名字的内部类,多用于关注实现而不关注实现类的名称
【示例】
IPlayGame ip=new IPlayGame(){
@Override
public void playGame(){
System.out.println("使用匿名内部类的方式实现接口");
}
};
ip.playGame();
或者
new IPlayGame(){
@Override
public void playGame(){
System.out.println("使用匿名内部类的方式实现接口");
}
}.playGame();
语法
Interface i=new Interface(){
public void method(){
System.out.println("匿名内部类实现接口的方式")
}
}
Object 类
所有类的父类,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object类。Object类中的方法,适合所有子类
toString()
在Objecty类里面定义toString()方法的时候反悔对象的Hash code(对象地址字符串)。
可以通过重写toString()方法表示出对象的属性。
equals()
比较的是对象的引用是否指向同一块内存地址。
UML
概念
Unified Modeling Language(UML)统一建模语言或标准建模语言
是一个支持模型化和软件系统开发的图形化语言
为软件开发的所有阶段提供模型化和可视化支持
常用UML图
用例图(The Use Case Diagram):用例图能够以可视化的方式,表达系统如何满足所收集的业务规则,以及特定的用户需求等信息。
序列图(The Sequence Diagram):序列图用于按照交互发生的一系列顺序,显示对象之间的这些交互。
类图(The Class Diagram):UML类图、业务逻辑和所有支持结构一同被用于定义全部的代码结构。
UML建模工具
Visio、Rational Rose、PowerDesigner