思想

80年代,百花争名,OOP(面向对象编程) OOA(面向对象分析) OOD(面向对象设计)

程序即现实:模拟现实世界

万事万物皆对象

核心:类和对象

类是对象的抽象,对象是类的具体

  • 类:抽象的,模板,概念,是一些具体共同特征和行为的一类的定义
  • 对象:实际存在的,通过类来创建
  • 类的组成:属性(特征)和方法(行为)

目的:消除重复代码

优点:1.可重用性      2.可扩展性                 3.可管理性


实例变量

局部变量

位置

直接书写在类内部

定义在方法中

默认值

有默认值,与数组相同

没有默认值

作用范围

整个类中

离当前变量最近的大括号以内

生命周期

随着对象的创建而生效,随着对象被垃圾回收而死亡

随着方法的入栈而生效,随着方法的出栈而死亡

存储位置

实例变量全部在堆中

局部变量基本数据类型存在栈中,引用数据类型名字在栈,内容在堆

命名

可以与局部变量重名,就近原则使用

局部变量与局部变量之间不能重名

三大特征

封装

封装就是需要在实现的把一部分不让别人看到的操作封装起来,留下一个接口让别人可以直接来调用。

保护信息,聚合内容

类的创建就是封装的体现

封装:私有属性,公有方法

继承

把多个类相同的内容抽取到父类中,形成继承关系

能不用就不用

单继承

继承就是子类在父类的基础上边可以有自己的方法,同时可以使用父类非私有化的方法和变量,同时当父类的方法不足以满足需求的时候,还可以重写父类的方法,除此之外还可以有自己的方法,但是Java中只能实现单继承,不过可以通过内部类的方式来解决这个问题

重载和重写的区别:

重载:同一个类中,方法名相同,形式参数不同

重写:在子类中,可以对父类的方法进行重写,不能比父类的更严格

位置

方法名

参数列表

返回值

访问修饰符

方法重载

同类中

相同

不同

无关

无关

方法重写

子类中

相同

相同

相同或者是其子类

不能比父类更严格

多态

多态,就是一种东西具备多种形态,分为编译时多态(重载)和运行时多态(重写、对象转型)


向上转型:父类作为形参、父类类型作为返回值;向上转型的方式实现多态

父类引用指向子类对象;可以调用子类重写父类的方法和子类继承父类的方法,不能调用子类独有的方法。

Pet dog1 = new Dog();

向下转型:向上转型后,此时的对象是不能访问子类独有的方法的,如果需要访问,必须强制向下转型

Dog dog2 = (Dog) dog1        向下转型可以调子类独有的方法

通过instanceof关键来判断类型是否合理

对象a instanceof 类型A 表示判断对象a 是否属于A类类型的


对象转型:子类可以代指父类,父类对象如果是子类对象充当的,那么父类对象也可以转换为子类对象

想向下转型,先向上转型

什么是多态,多态的优点,多态实现的条件

(1)就是对于同一消息,根据调用对象的不同做出不同的反应,例如一个接口,这个接口的不同实现类,对这个方法的实现不一样,当调用时候得出的结果也就不一样。

(2)多态的优点是

可替换性,例如计算一个圆的面积,这个方法同样可以计算圆环的面积。

可扩展性,就是如果新增一个方法,不会破坏已经存在的方法的继承性和多态性。

(3)多态实现的三个条件:重写、继承、父类引用指向子类对象。

关键字

final 最终的

修饰类 没有子类,不能被继承

修饰方法 可以被继承,不能重写

修饰属性 常量

final可以用来修饰方法,类,变量,常量等,被fina|修饰的方法不能够被重写,被final修饰的类不能被继承,被final修饰的变量中成员变量一旦被赋予初始值就不能改变,被final修饰的局部变量一旦赋值就不能改变,被final修饰的常量不能改变,在编译时期存储到常量池中,被final修饰的引用对象,不能改变引用的内容。

static

静态 类 范围很广

修饰类        

修饰方法        静态方法中不能直接访问非静态的方法;非静态方法中可以直接访问静态的方法

修饰属性        static修饰的属性称之为静态属性,在内存中只有一份拷贝,属于整个类,不属于任何对象,可以被当前类的所有独享共享

修饰代码块    static修饰的代码块称之为静态代码块,当JVM加载类的时候自动执行,不能调用,多个静态代码块按照顺序执行,每个静态代码块只执行一次。

abstract

抽象 模糊

修饰类 抽象类

修饰方法 抽象方法 没有方法体,只有方法声明

this

当前类的对象 实例

代指本类对象 参数传递 调用实例属性或方法 调用构造函数

this可以访问属性、普通方法、构造方法;但是访问构造方法时,要求必须在本类中构造方法的第一句 而且在同一个构造方法中只能使用一次this访问构造    

super

表示父类对象,可以访问父类访问权限允许的属性,方法,构造方法

可以调用父类的标记符

调用父类的构造函数、属性、方法等

this和super的区别

this表示当前对象。super不能表示父类对象

this访问本类中的属性,如果本类中没有就去父类中查找;super则直接访问父类中的属性

this访问本类中的方法,如果本类没有此方法则从父类中继续查找。super访问父类中的方法。

this调用本类构造,必须放在构造方法的首行。super调用父类构造,必须放在子类构造方法首行。

访问修饰符

public            公共的,都可以访问                        本类中 本包中 子类中 本项目

protected        受保护的,本类内部可用,所有的子类中        本类中 本包中 子类中

private            私有的,本类内部使用                        本类中

没有访问修饰符    同包下可以                                本类中 本包中

访问访问权限从高到低:public>protected>没有访问修饰符>私有

接口

interface

模板的定义结构体,主要可以实现规范化开发

1.7和1.8差异 1.8支持默认实现default

接口中方法默认:public修饰 abstract

枚举

特殊的类,可以定义变量,用于多种状态的定义

语法格式:enum 枚举名称{变量1(值),……;私有属性 值,公有getter ,私有构造函数 为私有属性赋值}

内部类

静态内部类

成员内部类

局部内部类

匿名内部类

面试题

1.抽象类和接口的区别

(1)从方法上来说,抽象类中的方法可以为抽象方法也可以是非抽象方法,接口中的方法只能够是抽象方法,抽象类的抽象方法没有方法体,接口的抽象方法在jdk1.8中是可以有方法体的。

(2)抽象类的变量没有final修饰,接口中的变量都被public static final修饰。

(3)抽象类只能够单继承,他的子类不用重写其全部方法,接口能够实现多实现,他的实现类必须重写其全部方法。

2.final、finally、finalize的区别

final是常量,可以修饰类,方法,变量。

finally是在try catch最终语句执行的,是就算捕获到异常,依然会执行的语句,例如关闭流。

finalize是垃圾回收机制中的一个方法。

3.运行时异常,一般异常的区别

(1)运行时异常是不需要用户处理的,是程序运行的时候。jvm抛出的异常,一般异常是用户声明在方法后边可能抛出的异常,是用户处理的

(2)运行时异常在编写方法的时候不能被捕获或者抛出,一般异常是在编写方法的时候可以被捕获或者抛出的

Error是Jvm中出现的重大错误

Excption分为三种:编译时异常、运行时异常、一般异常