音乐播放器
琢钰
 
文章 标签
12

Powered by X2 | Theme: Fog
载入天数...
载入时分秒...
总访问量:  |   访问人数:
御风飞行中...

总复习04-面向对象

  热度: loading...

面向对象四大基本特性

封装

封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

好处:

  1. 将变化隔离。
  2. 便于使用。
  3. 提高重用性。
  4. 提高安全性。

封装原则:

  1. 将不需要对外提供的内容都隐藏起来。
  2. 把属性都隐藏,提供公共方法对其访问。如,getXXX,setXXX。

注意事项:

  • 私有仅仅是封装的一种体现而已。
  • private关键字:是一个权限修饰符,用于修饰成员(成员变量和成员函数),被私有化的成员只在本类中有效。
  • 常用场景之一:将成员变量私有化,对外提供对应的set、get方法对其进行访问,提高对数据访问的安全性。

继承

在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。在程序中,如果想声明一个类继承另一个类,需要使用extends关键字。

通过 extends 关键字让类与类之间产生继承关系。

多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。多个类可以称为子类,单独这个类称为父类或者超类。

注意事项:

  • 子类可以直接访问父类中的非私有的属性和行为。
  • 子类无法继承父类中私有的内容。
  • 父类怎么来的?共性不断向上抽取而来的。
  • 父类的构造方法不可以继承。

继承的特点

1.在Java中,类只支持单继承,不允许多重继承,也就是说一个类只能有一个直接父类,例如下面这种情况是不合法的。

1500704447701

2.多个类可以继承一个父类,例如下面这种情况是允许的。

1500704467099

3.在Java中,多层继承是可以的,即一个类的父类可以再去继承另外的父类,例如C类继承自B类,而B类又可以去继承A类,这时,C类也可称作A类的子类。例如下面这种情况是允许的。

1500704487847

4.在Java中,子类和父类是一种相对概念,也就是说一个类是某个类父类的同时,也可以是另一个类的子类。例如上面的示例中,B类是A类的子类,同时又是C类的父类。

Java只支持单继承,不支持多继承。一个类只能有一个父类,不可以有多个父类。 原因:因为多继承容易出现问题。两个父类中有相同的方法,子类到底要执行哪一个是不确定的。

多态

定义:某一类事物的多种存在形态。

编译时类型和运行时类型不一致就会出现多态。相同类型的变量调用同一个方法时呈现出多种不同的行为特征,这就是多态。最终多态体现为父类引用变量可以指向子类对象。

多态的实现分为两种:

  • 向上转型
  • 向下转型

同一个父类的方法会被不同的子类重写。在调用方法时,调用的是各个子类重写后的方法。

当子父类中出现同名的成员变量时,全部调用父类的成员变量,因为变量没有多态性,因为系统总是试图访问它编译时所定义的成员变量。

多态调用该变量时:
编译时期:参考的是引用型变量所属的类中是否有被调用的成员变量。没有,编译失败。
运行时期:也是调用引用型变量所属的类中的成员变量。
简单记:编译和运行都参考等号的左边。编译运行看左边。

抽象

抽象定义:抽象就是从多个事物中将共性的、本质的内容抽取出来。

  1. 抽象类

    Java允许在定义方法时不写方法体,不包含方法体的方法为抽象方法,抽象方法必须使用abstract关键字来修饰。

    Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。

    抽象类不一定有抽象方法,包含抽象方法的类一定是抽象类.

    抽象类不可以new创建对象,但是抽象类有构造方法.

  2. 抽象类的使用

    • 定义一个子类继承抽象类
    • 复写抽象类中所有的抽象方法

  • import

    import后面的*只能代表类,不能代表包。

    import static 导入静态成员

对象和类

自己写了构造方法,系统将不再生成默认无参构造方法。

对象在构造方法执行之前就已经产生了。

instanceof运算符

用来判断前面的对象是否是后面的类或者其子类、实现类的实例。前面的操作符编译时类型需要与后面的相同或者具有父子继承关系,否自编译出错。

对象 instanceof 类名

访问权限关键字

关键字 当前类 同包下的类 子类 不同包且无继承关系的类
public
protected ×
default × ×
private × × ×

值传递和引用传递

值传递不会改变实参,引用传递会改变实参。不可改变的final类也可以理解成值传递。

super和this关键字

静态方法里不可以使用super和this关键字

可以通过this()和super()调用构造方法,必须放在第一行,普通方法中不能调用。

static关键字

  1. static可以修饰什么
  • 属性(静态属性、静态变量、类变量)
  • 一般方法(静态方法、类方法)
  • 游离语句块(静态语句代码块)
  • 内部类
  1. static关键字注意事项
  • 在静态方法中是没有super和this关键字的
  • 静态方法只能访问静态的成员变量和静态的成员方法
  • 在Java中规定不能将方法体内的局部变量声明为static

final关键字

作用:

  1. 声明类:声明类的时候表示该类不能再被继承
  2. 声明方法:声明方法的时候表示该方法不能被子类重写
  3. 声明变量:声明变量的时候表示该变量变成常量(常量:一旦赋值之后,里面的值不能再变)

用final修饰复合数据类型的时候,引用不能重新赋值,但里面的内容可以重新赋值。

final修饰方法形参时,形参只可以用传参初始化,不可以在方法体内对形参赋值。

常见的Final类:

  • 所有的包装类
  • String/StringBuilder/StringBuffer
  • Math
  • Class
  • System
  • java.time包下的除了Clock和ZoneId之外全都是

类的初始化顺序

父类静态游离块 > 子类静态游离块 > 父类游离块 > 父类构造函数 > 子类游离块 > 子类构造函数

所有的变量初始化完,才会执行构造方法

可变参数

可变长参数的底层是数组,访问的方式用for循环。

内部类

访问特点:内部类可以直接访问外部类中的成员,包括私有成员。而外部类要访问内部类中的成员必须要建立内部类的对象。

内部类和外部类的相互调用

  1. 外部类访问内部类:

内部类被static修饰:可以直接new

Inner in = new Inner();

内部类没有被static修饰:得先new出来外部类的实例,再new内部类的

Inner in = new Outer().new Inner();

  1. 内部类访问外部类同名方法或变量
    • 使用外部类变量:外部类名.this.变量名
    • 使用外部类方法:外部类名.this.方法名()

内部类的分类

  1. 成员内部类

    • 非静态内部类

    • 静态内部类

      创建静态内部类的对象时,不需要外部类的对象,可以直接创建。

    • 匿名内部类

  2. 方法内部类

    不能使用修饰符,只能在方法内使用。

  3. 匿名内部类

    定义:就是内部类的简化写法。 前提:内部类必须继承或实现一个外部类或者接口,但两者不可兼得。 格式:new 外部类名或者接口名(){覆盖类或者接口中的代码,(也可以自定义内容。)} 简单理解:就是建立一个带内容的外部类或者接口的子类匿名对象。

    内部类定义在成员位置上,可以被private、static成员修饰符修饰。被static修饰的内部类只能访问外部类中 的静态成员。

    如果内部类中定义了静态成员,该内部类也必须是静态的!

    • 继承式
    • 接口式
    • 参数式

接口和抽象类的区别

接口

  • 成员变量默认用 public static final修饰
  • 方法默认public abstract 修饰
  • jdk1.8 接口中还可以声明有方法体的方法,但是必须要有 default 修饰 或者 static 修饰 ,而且这两个修饰符不能同时存在 。还可以用 stricfp 关键字修饰方法 ,只能和static搭配使用。
  • JDK 1.9时,接口中的方法可以是private的。主要是为了提取冗余代码,以便我们的API客户端无法看到它们。

区别

  • 接口没有构造方法
  • 单继承多实现
  • 接口可以有静态方法和默认方法,抽象类和普通类一样
  • 接口里只能定义静态常量,抽象类可以定普通成员变量

重载和重写

重载:同一个类中的方法,名字相同,参数列表不同,与返回值无关

重写:发生在继承关系中,两同两小一大原则