类和对象
面向对象中最主要的“一词”是:对象。
什么是类?
类实际上在现实世界中是不存在的,是一个抽象的概念。是一个模板,它描述一类对象的行为和属性。。是我们进行“思考,总结,抽象”的一个结果。
什么是对象?
对象是实际存在的个体。
java语言中,要想得到“对象”,就必须定义“类”,“对象”是通过“类”模板创造出来的。
类是一个模板:类中描述的是所有对象的“共同特征信息”
对象就是通过类创造出的个体。
类的定义?
【修饰符列表】 class 类名{
//类体 = 属性 +方法
//属性在代码上以“变量”的形式存在
//方法可以描述动作/行为
}
为甚么属性是“以变量的形式存在”?
因为属性是以数据的形式存在
属性对应的是“数据”,数据在程序中只能放在变量中
变量必须先声明,再赋值
对于成员变量来说,没有手动赋值,系统默认赋值。
什么是实例变量?
对象又被称为实例。
实例变量实际上就是:对象级别的变量。
实例变量必须先创建对象。(不能通过类名来直接访问实例变量)
构造方法:
什么是构造方法?有什么用?
构造方法是一个比较特殊的方法,通过构造方法可以完成对象的创建,以及实例变量的初始化。(构造方法是用来创建对象并且同时给对象的属性赋值的。【在对象被创建的时候,构造方法被执行】
注意:实例变量没有手动赋值的时候,系统会赋默认值。
构造方法的语法:
【修饰符列表】 类名 (形参列表){
方法体; //为对象的属性赋值。
}
1、修饰符列表:
2、构造方法名与类名一致
3、构造方法不需要指定返回值类型,也不能写void。
4、使用new关键字来调用
当一个类中没有任何构造方法,系统默认提供一个无参构造方法,叫做缺省构造器。
当类中一旦有构造方法,系统将不再提供缺省构造器。
封装:
1、面向对象的三大特征:封装、继承、多态
有了封装才有继承,有了继承才有多态。
2、什么是封装?有什么用?
封装是将多个部件作为一个新的整体,隐藏了内部复杂的实现细节,提供简单的,易于操作的接口或操作方法,方便用户的使用,可以保证内部数据的安全性。
作用:
①保证内部结构的安全。
②屏蔽内部的复杂性,只暴露出简单的接口或实现方法。
3、什么是继承(extends)?有什么用?
superclass:父类,超类,基类
subclass:子类,派生类,扩展类
继承使用关键字extends关键字来描述。在java里面只支持单继承及一个类只能有一个父类,子类可以继承的非private修饰的成员方法和成员变量,构造方法不能被继承,java中的继承和生活中的继承颇为相似,现实生活中一个儿子只能有一个父亲,儿子可以继承父亲的房子车子但是不能继承父亲打闹里面的思想和知识。如果一个类没有显示的继承其他类,那么这个类会默认继承object类
object是sun公司提供的java中的根类
**继承的优点: **
提高代码的复用性
提高代码的维护性
方法覆盖,让类与类之间产生关系,是多态的前提(主要作用)
继承的缺点:
增强了类之间的耦合
软件开发的一个原则是高内聚、低耦合
内聚是一个模块内各个元素彼此结合的紧密程度
耦合是一个软件里面不同模块之间的互相连接的数量
this关键字:
1、this是一个关键字,是一个引用, 保存内存地址指向对象自身
2、this可以使用在实例方法中,也可以使用在构造方法中。
3、this出现在实例方法中其实是代表的是当前对象。
4、this不能使用在静态方法中。
5、this() 这种语法只能出现在构造方法第一行,表示当前构造方法调用本类的其他构造方法。
Java继承是复制还是共用?答案共用
继承是软件复用的一个关键,但是继承并非是简单的代码复制:即类A继承了类B,并不只是类A有了类B的代码。因为java是可以向上转型的,即B=new A()是合法的,而若有另一个类C,也从B继承,下面这行代码将报错:B=new C()。
1、共用更恰当,因为父类的一些私有方法和私有属性是不会被继承的,继承之后,子类可以共用父类的公有属性和公有方法,,
2、Dog中如果没有重新定义父类已有的同名属性,则修改公有属性就是修改父类的公有属性,即父类的属性会一起改变,,
3、如果两者都实例化,肯定是两个不同的对象,内存地址不可能共用的,就算是Dog实例化多次也是只是多个不同的对象,内存地址是不一样的,,
4、super其实就是一个区分标志,不会新建对象的,,,super()只是调用父类的无参构造方法,因为子类也有无参构造方法,,只要是子类要调用在父类中有同名同参的方法或者同名的属性,都要用到super来区分,,
方法重写:
当子类对父类继承过来的方法进行重写后,
子类对象调用该方法的时候,默认执行子类的方法。
方法重写条件:
1、两个类间必须有继承关系
2、重写之后的方法和之前的方法具有:
相同的返回值类型、相同的方法名、相同的形式参数列表
3、访问权限不能更低,可以更高
4、重写之后的方法不能比之前的方法抛 出更多的异常
构造方法不能重写,静态方法覆盖无意义
什么时候使用方法重写?
父类中的方法无法满足子类的业务需求,子类有必要对继承过来的方法进行重写
方法重载和方法覆盖(重写)有什么区别?
1、方法重载发生在同一个类中,方法名相同,参数列表不同,返回值类型可以不同。
2、方法覆盖是发生在具有继承关系的父子类中,并且重写后的方法必须和父类的一致。
方法名一致、参数列表一致、返回值类型一致