面向对象的特征(封装、继承、多态)
封装
核心思想就是“隐藏细节”、“数据安全”。将对象不需要让外界访问的成员变量和方法私有化,只提供符合开发者意愿的公有方法来访问这些数据和逻辑,保证了数据的安全和程序的稳定。将事物的一些特性封装成属性,行为封装成方法(关键字private),并提供公共的外界可访问的方法setter gerter用以访问字段。
1.如何控制程序中的访问 ?
通过给类中的成员(字段,方法,构造方法)添加访问权限来实现访问控制
2.什么是访问权限:
例子:比如做一个系统,不同人登录进去,的访问权限不一样;
3.访问权限修饰符:
private < 默认不写(注意不要添加default修饰)< protected < public
private :最小权限,被它修饰的成员只能够在本类中可以访问到;
public :最大权限,任何地方和任何人都能访问;
测试私有化的字段只能在本类中可以访问
封装的步骤:setter getter方法–>标准的javaBean
继承
Java类中的继承的语法格式:
class Person{}
class Student extends Person{} //目标就是为了继承到Person,这个类型
Person 就是Student的父类; Student是Person的子类
每一个类都有一个直接父类,如果没有看到显示的继承代码,那么就隐式继承就Object
Object是所有类的直接或间接父类
注意:
子类可以从父类继承到哪些?
字段,普通方法可以继承
构造方法不能继承
1)在多个不同的类中抽取出共性的数据和逻辑,对这些共性的内容进行封装一个新的类即父类(也叫做超类或基类),让之前的类来继承这个类,那些共性的内容在子类中就不必重复定义
2)Java 的继承机制是单继承,即一个类只能有一个直接父类。但是可以多重继承如:
class Animal{}
class A extends Animal(){}
class B extends A(){}
class C extends B(){}
3)如果子类和父类有同名成员变量和方法,子类可以使用 super 关键字调用父类的成员变量和方法,上述使用方式前提是成员在子类可见。
4)在调用子类构造方法时,会隐式的调用父类的构造方法 super()。如果父类没有无参构造方法,为了避免编译错误,需要在子类构造方法中显式的调用父类的含参构造方法。
5)子类创建时调用父类构造方法:子类需要使用父类的成员变量和方法,所以就要调用父类构造方法来初始化,之后再进行子类成员变量和方法的初始化。因此,构造方法是无法覆盖的。
6)当子类需要扩展父类的某个方法时,可以覆写父类方法
7)继承提高了程序的复用性、扩展性,也是 Java 语言多态特征的前提。
多态
java中多态简单定义就是:一种事物多种形态
多态存在的前提:必须有继承关系
class Animal {}
class Person extends Animal{}
class Bird extends Animal{}
Animal a = new Person();new一个人类对象,用Animal类型变量接收,这样的情况就是多态
如果是有这样的情况存在
如果编译时类型父类的类型,取值是父类里面字段的值;
如果编译时类型子类的类型,取值是子类里面字段的值;
编译看左边,运行看右边
class Dog{//父类类型Dog
void eat(){
System.out.println(“吃食物”);
}
}
class DDog extends Dog{//子类类型DDog
void eat(){
System.out.println(“哈根达斯”);
}
}
class XDog extends Dog{//子类类型XDog
void eat(){
System.out.println(“吃牛排喝红酒”);
}
}
class Person{//人类:定义喂狗方法
void feedDog(Dog dog){
dog.eat();
}
}
//------------------------------测试类-----------------------------------
class Test {
public static void main(String[] args) {
Dog ddog = new DDog();
XDog xdog = new XDog();
Person pson = new Person();
pson.feedDog(ddog);
pson.feedDog(xdog);
}
}
1.如上代码多态的体现的本质:都是父类类型的变量存放子类类型的对象
2.Dog dog = new XDog();//核心本质
3.方法参数传递:方法形参父类类型,允许传子类类型对象
i.Dog dog = new XDog();
ii.XDog xdog = new XDog();
iii.void feedDog(Dog dog){ }//此方法运行传递上面两个参数dog 或者 xdog : 本质传递的都是子类对象
4.方法返回值
Dog getDog(){//此方法返回值类型为父类类型Dog
return new XDog();//允许返回子类类型
}
5.多态的好处:屏蔽了不同子类之间实现的差异