初识面向对象
面向对象编程的本质就是:以类的方式组织代码,以对象的方式组织(封装)数据
-
面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现。
-
面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,管我们什么事?我们会用就可以了。
-
面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们我们使用的就是面向对象了。
-
面向过程:
-
优点:性能比面向对象好,因为类调用时需要实例化,开销比较大,比较消耗资源。
-
缺点:不易维护、不易复用、不易扩展.
-
-
面向对象
-
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护 .
-
缺点:性能比面向过程差
-
对象创建和分析
类与对象的关系
-
类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表一个具体的事物。
-
对象是抽象概念的具体实例
创建与初始化对象
-
使用new关键字创建对象,
-
new作用:1、创建对象2、调用构造函数;3,、返回对象引用
-
使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化,以及对类中构造器的调用。
-
类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的,并且构造器有以下两个特点
-
1、必须和类名相同
-
2、必须没有返回类型,也不能写void;
-
面向对象三大特性
-
封装
-
该露的露,该藏的藏。设计要求“高内聚,低耦合”,高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。
-
隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性。通常,应禁止直接访问一个对象中数据的实际表示,而应该通过操作接口来访问。这称为信息隐藏
-
属性私有、get/set
-
-
继承
-
提高代码复用性;继承是多态的前提。
-
本质是对某一批类的抽象,从而实现对现实世界更好的建模
-
extends的意思是:“扩展”、子类是父类的扩展
-
Java只有单继承,没有多继承!!!
-
继承是类和类之间的一种关系,除此之外,类和类之间的关系还有依赖,组合,聚合等
-
继承关系的两个类,一个为子类(派生类),一个为父类(基类),使用关键字extends来表示
-
子类和父类之间,从意义上来讲应该具有“is a” 的关系
-
object类(所有类的基类)
-
super:“super.属性 ” 可以调用父类里定义的属性参数****。
-
super调用父类的构造方法,必须在构造方法的第一个。
-
super必须只能出现在子类的方法或者构造方法
-
super和this不能同时调用构造方法
-
-
this 调用当前类里的属性或行为
-
this:本身调用者这个对象
-
super:代表父类对象的应用
-
-
方法重写
-
都是方法的重写,与属性无关
-
需要有继承关系,子类重写父类的方法
-
参数列表必须相同
-
修饰符范围可以扩大但不可以缩小
-
抛出的异常可以被缩小但是不能扩大
-
子类的方法和父类的一致,方法体不同
-
-
-
多态
-
父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。
-
同一方法可以根据发送对象的不同而采用多种不同的行为方式
-
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。
-
多态存在的条件
-
有继承关系
-
子类重写父类方法
-
父类引用指向子类对象
-
-
多态是方法的多态,属性无。
-
instanceof(类型转换,引用类型)
-
对象能执行哪些方法看左边的类型,和右边关系不大。
Student s1= new Student();//s1可以调用重写方法,也可以调用自己的方法; Person s2= new Student();//s2调用的方法可以是Student子类重写的方法。 ?
-
static
-
用static修饰符修饰的常量或方法可以直接被调用。类加载时一起出现,不用在分配内存空间。
-
-
抽象类和接口
-
抽象类
-
abstract修饰符,可以用来修饰方法,也可以用来修饰类。如果修饰方法,那么该方法就是抽象方法,如果修饰类,那么该类就是抽象类。
-
抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。
-
抽象类,不能使用new关键字来创建对象,它是用来让子类继承的
-
抽象方法,只有方法的声明,没有方法的实现,用来让子类实现
-
子类继承抽象类,那么就必须实现抽象类没有实现的抽象方法,否则该子类也是抽象类。
-
抽象类除了不能实例化对象,其他权限与普通类一样
-
提高开发效率
-
-
接口
-
接口可以实现多继承(一个接口多个实现方式)
-
抽象类:extends+父类 。类实现接口: implements + 多个/一个接口(实现多继承),实现了接口的类,就要重写接口中的方法。
-
接口不能被实例化,接口中没有构造方法
-
内部类及OOP实战
内部类
-
成员内部类
-
public class Outer { private int id=9; public void out(){ System.out.println("这是外部类的方法"); } class Inner{ public void in(){ System.out.println("这是内部类的方法"); } //内部类可以直接获得外部类的私有属性,并且可以直接调用外部类方法。 public void getId(){ System.out.println(id); out(); } } } public class Application { public static void main(String[] args) { Outer ou =new Outer(); ou.out();//调用外部类方法 Outer.Inner inner = ou.new Inner();//内部类的实例化对象,通过外部类引用 inner.in();//调用内部类方法 inner.getId(); } }
-
-
静态内部类
-
定义之后无法直接访问外部类,静态不可以调用非静态
-
-
局部内部类
-
方法内的类
-
public class Outer { public void out(){ class Inner{//局部内部类 } } }
-
-
匿名内部类
-
public class Test { public static void main(String[] args) { //没有名字的初始化类,不用将实例保存到变量中 new Apple().eat(); new UserService(){ @Override public void hello() { } }; } } class Apple{ public void eat(){ System.out.println("吃苹果"); } } interface UserService{ void hello(); }
-