文章目录
- 一、封装
- 二、继承
- 三、多态
一、封装
1、用private对类的成员属性进行封装(这时这个属性只能在当前类当中使用),可用idea生成或自己写接口(接口是成员方法),鼠标点击generate和Getter and Setter生成接口。
接口:
public String getName(){
return this.name;
}
public void setName(String name){
this.name;
}
2、封装:通过关键字private对类的成员进行隐藏,只对类外提供公开的接口。封装的意义:隐藏类的实现细节,从而达到安全性。
二、继承
1、继承:对共性进行抽取。继承的意义:达到代码的复用。(在定义子类时用关键字extends,如public class Dog extends Animal)
2、super关键字:在子类方法中访问父类继承下来的成员(相当于是子类对象中从父类继承下来的那部分成员的引用),super.data访问父类的成员变量,super.func()访问父类的成员方法。static修饰的方法里面不能使用super(和this一样)。子类继承父类之后,实例化子类对象的时候,先帮助父类进行构造(在子类的构造方法中用super()调用父类的构造方法),再构造子类自己。子类无参数构造方法(编译器自带默认构造方法)或有参构造方法中默认会存在super()(super()的括号中没有参数)的调用,用户没有写编译器也会增加,但是this()用户不写则没有。super()只在子类构造方法中出现一次。因为super()也只能放在构造方法的第一行,所以super()和this()不能同时使用。
三、多态
1、向上转型:父类引用去引用子类对象。
2、发生向上转型的三种时机。
(1)直接赋值时:
Animal animal = new Dog("小狗",10)
(2)方法传参时:
func1(dog);
public static void func1(Animal animal){
}
(3)方法返回值返回时:
Animal animal=func2();
public static Animal func2(){
return new Dog("小狗",10);
}
3、向上转型后,通过父类引用调用这个父类和子类重写(覆盖,覆写)的方法,结果是调用了子类的方法,这个过程叫做运行时绑定(后期绑定,动态绑定),向上转型的缺点是不能调用子类特有的方法
编译时绑定(前期绑定,静态绑定):方法的重载,在编译时通过方法的参数等就能确定调用的是哪个方法
4、方法重写注意事项(方法重写:方法的名字、参数类型个数名称、返回值类型相同,可用idea生成重写方法,点击generate和Override Methods…):
(1)被private、static、final(密封方法)修饰的方法、构造方法不能重写
(2)访问修饰限定符private<默认权限<protected<public,重写方法的访问权限高于或等于父类中被重写方法的访问权限
(3)重写方法与被重写方法的返回值可以不同,但必须满足父子类关系,如被重写方法的返回值类型为Animal,重写方法的返回值类型可以为Dog,返回值构成父子类关系时叫协变类型
(4)在重写方法的前面写上@Override注释,这个注释能帮我们进行合法性校验,如不小心把重写方法的名字写错了(写成watsh),编译器就会发现父类中没有watsh方法,这时就会编译报错无法构成重写
重写的设计原则:对于已经投入使用的类,尽量不要进行修改,重新定义一个新的类,来重复利用其中共性的内容,并且添加或者改动新的内容。
5、31、向下转型:父类引用还原为子类对象,向下转型不安全,为提高安全性引入instanceof。
Animal animal2 =new Bird("小鸟",10);
if(animal2 instanceof Bird){
Bird bird =(Bird)animal2;
bird.fly();
}
6、多态:当我们引用的子类对象不一样的时候,通过父类引用调用同一个重写的方法,表现出来的行为不一样,这种思想叫做多态。属性和构造方法没有多态性。多态缺陷:代码运行效率降低。
public static void drawMap(Shape shape){
shape.draw();//draw()方法进行了重写,这里发生了向上转型和动态绑定,这里Shape是父类
}
public static void main(String[] args){
Cycle cycle =new Cycle();
Rect rect=new Rect();
drawMap(cycle);
drawMap(rect);
}