一、封装
1.封装
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而只能通过类的方法来实现对隐藏信息的操作和访问。
封装的实现步骤:
普通方法也可以修改属性的值,但从编程规范上而言,才用getter/setter方法
2.访问修饰符
private 只能在本类中访问
protected 能在本类 一个包 子类中访问
没有修饰符 在本类 一个包中访问
public 任何地方都能访问
3.this关键字
this 关键字,代表当前对象。
this.属性 操作当前对象的属性
this.方法 操作当前对象的方法
二、继承
1.继承的概念:
继承是类与类的一种关系,是一种"is a"的关系;
注:Java中的继承是单继承(也就是一个类只有一个父类)
2.继承的好处:
子类拥有父类的所有属性和方法(当然,属性和方法的修饰符不能是private,private的属性和方法是不能继承的)
实现代码复用
3.语法规则:
class 子类 extends 父类
例:class Dog extends Animal{
......
}
4.java中的方法重写
如子类对继承父类的方法不满意是可以重写父类继承的方法的,当调用时就会优先调用子类的方法。
重写方法的规则: 1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。 2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。如果在子类中写了一个只有返回类型不同的函数,将不是重写,且会报错
5.java中的继承初始化顺序
(1)优先创建父类对象,然后创建子类对象,即先初始化父类,再初始化子类
(2)属性的初始化顺序:
父类的属性初始化->父类构造函数初始化->子类的属性初始化->子类构造函数初始化
6.java中final的使用
final关键字: 表示“最终的”,即不可修改。
final可以修饰类、方法、属性和变量
6.1、修饰类:不允许被继承
6.2、修饰方法:不允许被重写
6.3、修饰属性:则该属性不会进行隐式初始化(不会自动初始化),需要手动初始化或者在构造方法中初始化 (但二者只能选一,即只能初始化一次后便不能更改)
7.java中的super的使用
surper.属性 和 surper.方法是访问父类的属性和方法
final 关键字定义的类不可继承,定义的函数不可重写
super关键字的应用:
7.1.子类的构造过程中必须调用其父类的构造方法
7.2.如果子类的构造方法没有显示调用父类的构造方法,则系统会默认调用父类的无参构造方法。
7.3.如果显示的调用构造方法,必须在子类的构造方法的第一行,super()。
7.4.如果子类的构造方法中既没有显示调用父类的构造方法,父类又没有无参的构造方法,则编
三、多态
1.多态: 指的是对象的多种形态,主要分为 引用多态 、方法多态
继承是多态的实现基础,别忘了子父类要有继承关系. 多态特性:
1.1、引用多态
(1)父类引用可以指向本类对象 Animal obj1 = new Animal();
(2) 父类的引用指向子类的对象;
例如:List<T> list = new ArrayList<>();
1.2、方法多态
(1)创建本类对象时,调用的方法为本类方法;
(2)父类引用指向子类的对象时,只能调用继承或重写的方法,不能调用子类独有的方法
2.多态中的引用类型转换
1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换。
如:Dog dog=new Dog();Animal animal=dog;//正确,自动类型提升,向上类型转换
2.向下类型转换(强制类型转换),是大类型到小类型的转换(存在风险,溢出)
如:Dog dog1=(Dog)animal;//向下类型转换
3.instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题。
如: Dog dog=new Dog(); Animal animal=dog; Cat cat=(Cat)animal;//编译时不会出错(按Cat类型进行编译),但运行时会报错,因为它开辟的是Dog类型的空间,而(无法将引用类型进行转换)无法将dog对象转换成Cat类型,并且此方法对程序的安全性有影响。
此时应该利用instanceof和if语句结合使用,进行验证,以保证程序的安全性,
如:
if(animal instanceof Cat){
//判断animal类中是否包含Cat类型的元素,若包含则进行转换,instanceof返回值为布尔类型 Cat cat=(Cat)animal;
}else{
System.out.println("无法进行类型转换");
}
3.java中的抽象类
抽象类的终极奥义是:抽取类的共同特性,然后各个类,有不同的实现。
比如:要创建几个类,这些类都有一样的方法,比如都是需要求周长和体积,这就能把求周长和体积的方法抽取出来到抽象类里。
然后类再继承抽象类来分别实现这个方法。