面向对象的基本
什么是面向对象?
面向对象是一种编程思维,通过这种思想将生活中复杂的事情简单化,从原来的执行者变成一个指挥者
面向对象的大特征。
a)封装
- 封装就是隐藏对象的属性和实现细节,仅仅对外提供公共的访问方式。
- 好处:提高代码的安全性和重用性
- 使用private关键字修饰
b)继承 - 子类继承父类的所有数据属性和方法(除了父类私有的属性和方法),并且能够进行功能扩展
- 继承多用于功能的修改
- 使用extends关键字修饰
c)多态
-
多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征。
-
主要指同一个对象在不同时刻,代表的对象不一样,指的是对象的多种形态。
-
多态的前提是继承,要有方法重写。
-
好处是提高了程序的扩展性和可维护性
-
多态可以让我们不用关心某个对象到底是什么具体类型,既可以使用该对象某些方法。
-
特点
1、 成员变量使用的是父类的
2、 成员方法由于存在重写现象所以使用的是子类的
3、 静态成员随着对象而存在,谁调用的就返回谁 -
口诀:父类引用指向子类 编译看左边,运行看右边
对象?
对象具有三大特点:对象的状态,对象的行为,对象的标识。
-
对象的状态用来描述对象的基本特征。
-
对象的行为用来描述对象的功能。
-
对象的标识是指对象在内存中都有一个唯一的地址用来和其他对象去分开来。
java中修饰符都有哪些,作用范围是什么?
- private 私有的,仅本类中使用,如果想访问,只能对外提供公共的 get 和 set 方法。
- default 缺省的,同类、同包。
- protected 受保护的 在同类、同包、子类
- public 公共的,同类、同包、子类、不同。也就是说,任何地方都可以访问到。
创建对象的流程,例如:Person p = new Person();
a) 把Person.class 文件加载进内存
b) 在栈内存中,开辟空间,存放变量p
c) 在堆内存中,开辟空间,存放Person对象
d) 对成员变量进行默认的初始化
e) 对成员变量进行显示初始化
f) 执行构造方法(如果有构造代码块,就执行构造代码块再执行构造方法)
g) 堆内存完成
h) 把堆内存的地址值赋值给变量p,p就是一个引用变量,引用了Person对象的地址值
什么是匿名对象?
就是没有名字的对象,当调用对象只调用一次是,就会使用匿名对象。
例如:
new Demo().show();//创建了一个匿名对象并调用方法
构造方法。
构造方法是一种特殊的方法,它没有返回值,但和其他方法一样可以重载。
其主要功能是完成对象的创建或对象的初始化。当类实例化一个对象时会自动调用构造方法。
子类创建对象时,会默认去访问父类的无参构造方法
什么是构造代码块、局部代码块、静态代码块,作用是什么,执行的优先级顺序?
-
构造代码块
· 在类的内部,方法外部的代码块
· 作用是用来抽取构造方法中的共性代码。
· 每次调用构造方法前都会调用构造方法。
· 每次创建对象都会被调用 -
局部代码块
· 在方法里面的代码块
· 通常用于控制变量的作用范围,出了括号就失效
· 变量的范围越小越好,成员变量会有线程安全问题
· 方法被调用才会执行 -
静态代码块
·static {…} 类里方法外
· 一般用于项目的初始化
· 随着类的加载而加载,并且只加载依次 -
执行的优先级
· 静态代码块 > 构造代码块 > 局部代码块
this、super的区别是什么?
- this代表本类对象的引用,super代表父类对象的引用
- this用于区分局部变量和成员变量,super用于区分本类变量和父类变量
- this.成员变量、this.成员方法()、this(【参数】)代表调用本类内容
super.成员变量、super.成员方法()、super(【参数】)代表调用父类内容 - this和super不可以同时出现在同一个构造方法里,他们两个只要出现就都得放在第一行
重写和重载的区别?
- 重载是指在同一类中多个方法具有相同的名字,但这些方法具有不同的参数列表,既参数的数量和参数类型不能完全一样
- 重写是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名,相同的参数表和相同的返回类型
- 重写是父类与子类之间多态性的一种表现
- 重载是一类中多态性的一种表现
static 关键字(静态的)
- 用于修饰成员中的变量和方法
- 全局唯一,全局共享
- 被static修饰的变量或方法可以直接通过类名调用(类名.静态修饰的变量或方法)。
- 静态只能调用静态的,非静态的可以随意调用
- static不能和this或者super共用,因为static时可能还没有对象。
final 关键字(最终的)
- 被final修饰的类,不能被继承
- 被final修饰的方法,不能被重写
- 被final修饰的变量是常量,值不能被更改
- final 初衷,java出现了继承后,子类可以更改父类的功能,当父类功能不许子类改变时可以用final关键字修饰父类
静态变量和实例变量的区别?
-
在语法定义上的区别:静态变量前要加static关键字,而实例变量前不加
-
在程序运行时的区别:
·实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名引用。
·实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于实例对象,而是属于类,所以也称为类变量,只要程序加载类的字节码,不用创建任何实例对象,静态变量就会分配空间,静态变量就可以被使用。
异常
- 用来封装错误的对象,异常是指程序中出现的BUG,有的可修复,有的不可以
- 继承结构
· Trowable–顶级父类
···Error:系统错误
··· Exception:可修复错误 - 异常处理有两种处理方式
·捕获异常
·抛出异常
throw和throws区别?
- throw作用在方法内,表示抛出具体的异常,由方法体内的语句处理
- throws作用在方法声明上,表示如果抛出异常,则由该方法的调用者类进行处理异常
- throw若执行则一定抛出异常
- throws出现异常是一种可能性,但不一定会发生异常。
什么是抽象类?特点?
- 没有方法体的方法我们称之为抽象方法,含有抽象方法的类我们称之为抽象方法。
- 抽象方法可以理解为一个只有方法声明没有方法体的特殊类。
- 特点
·通过 abstract 实现
· 可以修饰方法或者类
· 抽象类中可以没有抽象方法(由子类去实现)
· 子类继承抽象类中以后,要么还是抽象类,要么就把所有抽象方法都重写
· 抽象类不可以实例化 - 抽象类也有构造方法,但是不能本身实例化,一般用于子类实例化
- 抽象方法可以有变量,也可以有常量
- 抽象类里既可以有普通方法,也可以有抽象方法
什么是接口?
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
接口的特点?
- 接口中都是抽象类
- 通过interface关键字创建接口
- 通过implement让子类来实现
- 突破了java的单继承的局限性
- 接口和类之间可以多实现,接口和接口之间可以多继承
- 接口提高了程序的功能扩展,降低了耦合性
接口的用法。
- 接口里没有构造方法(接口实现类对象创建时,系统会自动去调用Object的无参构造)
- 接口里没有变量,都是常量 会自动为变量 拼接public static final
- 接口里都是抽象方法,而且可以 简写。会自动拼接public abstract
接口和抽象类的区别?
-
相同点:
·都是抽象层,不能实例化 -
不同点:
· 抽象类用abstract关键字描述,接口用interface
· 子类和抽象类之间是extends关系,实现类和接口之间是implements关系
· 抽象类中可以有构造方法,接口里不能出现构造方法
· 抽象类里可以有变量,接口里没有变量全都是静态的常量
· 抽象类里可以有普通方法,也可以有抽象方法,接口都是抽象方法
· 抽象类和子类之间是继承关系,而且java中,只支持单继承
· 接口突破了java单继承的局现性,因为接口可以多继承也可以多实现,甚至可以继承的同时多实现。