目录
世界是由各种各样的具有自己独特的运动规律和内部属性的对象组成,不同对象之间互相作用和通讯就形成了缤纷的世界
概念: 类用来封装数据,及处理这些数据的方法,类是抽象,而对象是具体
对象:现实生活中客观存在的,万物皆可为对象,是类对应的实体,不同的对象有不同或者相同的运动规律和内部属性,对象之间存在交互和复杂的关系
我们通过类来创建对象用new关键字; 对象就是类产生出来的实例。
类:即模板,是不同对象的共同属性和方法集合;是将现实中的对象抽象成java代码世界中的类(建模),用来封装对象的相关数据和处理这些数据的方法,当java中的一个类被创建/实例化(类-->对象)后就会加载进入内存
我们将一些对象的共同属性和方法抽取出来,形成了类,类是对象的模板
建模: 将对象抽象成类,如下图所示
实例化: 用类创建对象
· 使用new运算符可以实例化一个已经声明的对象,并按照对象的类型给它分配内存。
· 通常用new运算符实例化一个对象时,会同时调用类的构造方法对它进行初始化。
· 如果该类中没有写构造方法,系统会调用默认的构造方法,默认的构造方法是不带参数的。
· 例如,实例化上面已经声明的car对象:
Car c=new Car(); 此处c为对象名
类变量: static修饰的变量成员变量,可以通过类型/类名访问
实例变量: 没有static修饰的成员变量,必须通过实例对象访问
成员变量:java中,成员变量是指在类体的变量部分中定义的变量,也称为属性。成员变量声明在类中,方法体之外,在创建对象时实例化;成员变量可被类中的方法、构造方法以及特定类的语句块访问。如果声明成员变量时没对其初始化,则系统会使用默认值初始化成员
全局变量:定义在类中,作用于整个类,要考虑线程安全
局部变量:定义在方法中,只作用于某一块
类中的static块:在类加载完成,进行初始化时执行,且整个生命周期只被执行一次,一般的可用于资源初始化(例如:我们常用的DBHelper中的加载驱动)
public、protected、friendly(默认)、private: 访问权修饰词
修饰符的作用域:(接口中定义的方法默认修饰符是public)
作用域 | 当前类 | 同一包中的类 | 子类孙类 | 其他包中的类 |
public | √ | √ | √ | √ |
protected(仅自己家族用) | √ | √ | √ | × |
friendly(默认) | √ | √ | × | × |
private | √ | × | × | × |
abstract: 抽象类,不能实例化对象
final:最终类,不能有子类,在java中的游戏工具类会用final修饰符修饰,其目的就是为了让使用者只能直接实例化使用,不能修改和继承
继承是代码重用的一种方式,将子类都有的属性和行为放到父类中。将重复代码抽取到公共类(父类)中,让其它的类(子类)来调用它,减少代码量。
继承的作用:其重要作用就是实现多态,除此之外还可以复用父类的代码,提高代码利用率
格式: public class 子类名 extends 父类名{}
父类(基类)和子类(派生类),子类继承了父类,子类就有了使用父类的属性和方法的权限。
1、子类继承父类后,子类实例化时,先自动执行父类的构造方法,再执行子类的构造方法;
2、子类访问父类的构造方法:super(); 或 super(参数表); 只能写在子类构造方法的第一条语句。
1、父类中用private声明的属性或方法;
2、父类与子类不在同一个包中,父类使用默认修饰符修饰的属性与方法;
3、父类的构造方法。
继承初始化顺序: 父类属性是 —> 父类构造方法 —> 子类属性 —> 子类构造方法
· 方法在现实生活中是事物的各种动作、行为,在java的世界中方法是类的行为(或者叫功能)
· 方法可以类比为是遥控器上的按钮,不同的按钮触发不同的控制效果
· 方法不能嵌套定义,即方法中不能再写方法
不能在方法体外直接写逻辑代码(static块除外)
类的方法示例
如何使用带参数的方法
对方法进行重载,同一个类中存在多个方法名相同,参数不同的方法。
重载:同名不同参,同名即方法名相同;不同参即参数个数、类型、顺序不同,与返回值无关。
好处:传入不同的方法参数,具有不同的行为。(静态多态或叫编译时多态)
重载的规则:
1、当子类对于父类的不满意,可以补充,则直接重写父类的方法。
2、删除重写中的super.方法();就是全部推翻父类写法。
3、注意:子类的方法名、返回值、参数必须要与父类保持一致,而访问修饰符只能比父类的要高或者相等
4、重写的方法是否可以重载?可以
5、访问权限不能比父类中被重写的方法的访问权限更低,例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected
6、声明为 final 的方法不能被重写(最终方法,不能被重写)
7、声明为 static 的方法不能被重写,但是能够被再次声明
8、子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法
9、子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法
重写的好处: 好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。(运行时多态或叫动态多态 ,继承类,实现接口也是动态多态 )
abstract 加在类或方法前面变成抽象类、抽象方法。
抽象类 :不能被实例化,只能作为其它类的基类(父类)。
抽象方法
-- 没有方法体;
-- 必须在子类中被实现(重写),除非子类也是抽象类;
-- 抽象方法必须位于抽象类中。(换句话说:抽象方法一定要在抽象类中,抽象类中不一定所有的方法都是抽象方法)
抽象方法的由来:只规定对象的行为,不负责实现。(比如猪吃的方法,狗也有吃的方法,基类中写个吃的方法,但是吃什么就不管了。)
所有方法均为抽象方法(jdk8之后不太合适)
接口不可以被实例化(常作为类型使用)
实现类必须实现接口的所有方法(抽象类除外)
实现类可以实现多个接口(Java中的多继承)
接口中的变量都是静态常量
接口中的方法全部是公共的抽象方法
接口表示的其实是一种能力,接口是对类的抽象
接口里全部都是抽象方法,其它类在实现接口时,都要对接口中的方法进行重写。
概念:同一种行为在不同的对象上表现出来的不同的形态。
同样的类型(如动物类和狮子类,老虎类...),因为不同的实例产生不同的行为
类之间的关系也是一种多态的体现:类的对象对同一消息作出不同的响应,这些不同类要么是继承了相同的父类,要么是实现了相同的接口
编写父类
编写子类,子类重写父类方法
运行时,使用父类的类型,子类的对象
1、有继承或实现关系
2、子类重写父类的方法
例外情况:
- static方法,因为被static修饰的方法是属于类的,而不是属于实例的
- final修饰的方法,不能被子类不重写
- private修饰的方法,对子类不可见,更不能被重写
- protected修饰的方法,虽然子类可见也能重写,但不能再外部引用
3、 实现同一接口
4、使用父类或接口类型来引用子类或接口的实现类(里氏替换),即一个父类可以继承的子类是多个的,比如人这个父类就可以继承男人,女人,按国家分就有更多了
强制异常(或叫受检异常)Exception,即该异常报出时有解决的方式,开发人员捕获后可以解决
非强制异常(或叫非受检异常)RuntimeException
try-catch-finally
throw、throws:用于抛出异常实例,在方法定义中声明该方法可能抛出的异常,如果异常为强制异常则方法调用者必须trycatch捕获或者继续抛出
开闭原则是所有原则的总目标,即所有原则最终都是为了走向开闭原则
开闭原则简单来说就是指对扩展开放,对修改关闭,即在添加新功能时不需要修改源代码,他人可以直接使用却不能进行修改
开闭原则不修改源代码,减少了bug的引入,易维护,易定位错误(加入的代码中)
里氏替换原则:就是用子类实例化的对象去覆盖父类声明的对象。
语法: 父类 对象=new 子类名();
对象的类型是父类。
迪米特原则又叫最少知识原则,只与你的直接朋友交谈,不与"陌生人"说话
优点:降低类之间的耦合度,提高模块的相对独立性
缺点:过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性
类不要承担太多的功能,职责要单一,减少因在类中添加新功能或者修改时bug引入的机会
如果承担太多功能,则每个功能的变化都会影响该类
客户端不应依赖它不需要的接口
可以理解为接口要符合单一职责原则
高层模块不应该依赖底层模块,二者都应该依赖抽象
抽象不依赖于具体,具体依赖于抽象
中心思想是面向接口编程
原因:细节的东西往往是多变的,而越抽象则越稳定
如果处于代码复用的目的,则应该使用组合/聚合复用原则,而不要使用继承
这里简单解释一下组合和聚合
组合和聚合指一个对象由多个对象组成,之间紧密联系,但是组合的组成对象中如果有某个对象出现问题了可以再创建一个新的对象来代替原来的对象,而聚合则不能
今天分享的java面向对象的知识就到这里了,类容有点小多,要耐心的阅读哦