1 继承
在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和方法,来创建一个新的类,这种方式叫继承。
1.1 extends关键字
我们称飞机类Plane为父类(基类),轰炸机类Bomber为Plane的子类(派生类)。
飞机类(父类或基类)
↑
轰炸机类(子类或派生类)
2个类之间存在继承关系,将有如下特点:
1)子类拥有父类的所有属性,即在父类中声明的属性在子类的内部可以直接调用。
2)子类拥有父类的所有方法,即在父类中声明的方法在子类的内部可以直接调用。
3)子类不拥有父类的构造器,如果需要在子类内部使用和父类传入的参数一样的构造器,则需要在子类内部重新声明这些构造器方法。
4)子类类型是父类类型,即子类类型的对象可以自动转换为父类类型的对象;父类类型的对象则需要强制转换为子类的对象。转换的语法与基本数据类型相同。
1.2 调试方法:
1增加调试打印信息.
2增加断点调试.
1.3 super
super调用父类有参构造器
super的两种用法
1 sper.***或者super.***()代表每个类中指向父类对象部分的引用
2super()代表调用父类中制指定的构造器
注意:super()只能放在构造器的第一句!
super和this的区别:
super需要继承关系
this 可以在构造器里面调用其他构造器
super只能在子类构造器里面调用父类构造器
组合的特点是:XX有BB has-a
继承的特点:xx是bb 子类是父类
1.4 继承的优点
继承的优点:代码的可重用性;
父类的属性和方法可用于子类;
设计应用程序变得更加简单;
子类可以扩展父类的属性和方法.
在java里面只支持单继承(继承一个父类)不支持多继承(多个父类).
为什么java只允许单继承?
在java语言中禁止多继承,原因是多继承容易引发意义不明确,增加程序员编程的复杂度,甚至进一步影响多态的灵活性.
1.5 方法重写
什么是方法重写?
当要给子类继承一个父父类的属性和方法.子类可以直接使用父类的属性和方法,如果父类的方法不能满足子类的需求,可以再子类中对父类的方法进行重新实现.这种方法叫方法重写.
方法重写的规则:
1重写方法的参数列表必须被重叠的方法的完全相同;
2重写方法返回值类型必须与被参数中被重写的方法的返回值类型一致。
3重写的方法的修饰符一定要大于被重写方法的访问
修饰符(public)》deprotected》》default》
4重写的方法所跑出的异常必须和被重写的方法所跑出的异常一致或者是其子类;
5被重写的方法访问修饰符不能为private
6静态方法不能被重写为非静态方法,会导致编译出错
方法重载和重写的区别?
1 重写必须要继承,重载不需要;
2重写的方法名、参数数目相同、参数类型相同、
重载的方法名相同,参数列表不同。
3 重写的方法访问修饰符大于等于父类的方法;重载和修饰符无关
4重写不可以跑出父类没有抛出的一般异常
1.6 final:
当设计者设计的类不希望被任何人继承,从而去修改或扩展时,就可以使用final关键字,声明为最终类.如java的设计者不允许继承String类,因为他是java语言中一个十分重要的类,改变方法的行为,从而带来不希望的结果.
通过使String类 成为最终类,就能确保String对象的实现使一致性的和可靠地.
一般工具类.
2 类的高级概念
2.1 访问修饰符
2.1.1 Public
public:Java语言中访问权限最宽的修饰符,一般称为公共的。
被其修饰的类、属性以及方法,不仅可以跨类访问,而且允许跨包访问。
2.1.2 Protected
protected:介于public和private之间的一种访问修饰符,一般称为保护的。
被其修饰的类、属性已经方法,同一个包的类、 类本身的方法及子类访问,及时子类在t不同的包中也可以访问。
2.1.3 默认修饰符
默认修饰符:即不加任何访问修饰符,通常称为“默认访问模式”。该模式下只允许在同一个包中进行访问。
2.1.4 Private
private:Java语言中对访问权限限制最窄的修饰符,一般称为“私有的”。被其修饰的类、属性以及方法,只能被该类的对象访问,其子类不能访问,更不能跨包访问。
注意:class 类修饰都是用public来修饰。
2.2 封装
封装是面向对象技术的重要原则,它是java三大特性(封装、继承和多态)之一。
Java就是通过封装把对象的属性和方法结合为一个不可分割的独立整体,并尽可能的隐藏对象的内部实现,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过对外接口与这个封装对象进行交互,而无需知道该对象内部的细节。
2.2.1 封装的作用(好处)
1、良好的封装能够减少代码耦合;(面向对象设计原则:高内聚、低耦合
2、类内部的结构可以自由修改,而不影响类的外部使用者;
3、可以对类的成员数据进行更精确的控制;
4、能更好的隐藏类的成员数据和实现细节。
2.2.2 get方法(访问器)set方法(修改器)的作用:
用private/protected/default/public四个访问修饰符修饰对象的属性和方法,则设置了类相应的属性和方法的访问权限。private修饰符修饰的属性和方法只能自己访问。当一些特殊情况下,允许被访问时,我们使用get的方法(访问器)和set方法(修改器)。
2.2.3 静态类成员:
static修饰的成员变量叫静态变量,也叫类变量
类变量的值为所有对象所共享
static修饰的方法叫静态方法,即类方法
类方法只能使用静态变量
2.2.4 类的静态成员变量和方法的特点:
类的静态成员变量和方法属于类,而不是类的某个实例化对象。类的静态成员变量只存储一份数据供所有对象共用。使用静态成功量变量和方法可以实现多个对象之间的数据共享,而不会破坏封装(数据隐藏)的原则,这不但保证了安全性而且节省了内存空间。
使用类的静态成员变量和静态方法不需要类实例化对象,可以通过如下方式访问:
类名.静态成员变量
类名.静态方法
类的静态成员变量和静态方法使用注意事项:
1、类的静态方法中不能调用非静态方法和非静态成员变量(也不能使用this和super)
2、类的非静态方法中可以调用静态方法和静态成员变量
2.2.5 静态初始化块:
除了声明静态成员变量和方法外,关键字static还有另外一种用法。Java类可以包含一个静态初始化块。形如
public class类{
static{
//语句
}
}
实例初始化块
形如:
public class 类{
{
//语句
}
}
2.2.6 执行先后顺序
Java中 静态初始化块、实例初始化块、构造器三者都是用来完成类的初始化工作。
在实际编程中,可以根据不同的需要使用不同的初始化方式。而如何选择,关键在于三种方式的执行先后顺序。
静态初始化块在类被JVM的类加载器加载时被执行,而实例初始化块和构造器实在类实例化对象时才被执行。故父类和子类的静态初始化块最早执行,且前者早于后者;
实例初始化块于构造器的执行顺序,同样是前者早于后者。
父类静态初始化块>子类静态初始化块>父类实例初始化块>父类构造器>子类实例初始化块>子类构造器(> 早于执行)