面向对象三大特性: 封装、继承、多态;
一、封装
1、定义:
封装就是将类的信息隐藏在类内部,不允许外部程序直接访问,而是通过该类的方法实现对隐藏信息的操作和访问。
2、实现方法:
使用private关键字修饰 类内部的属性;
3、如何访问:
在类内部定义get、set方法,实行使用对象调用方法对内部属性进行操作;
可参考我的另一篇文章,类和对象(oop)
二、继承
1、定义:类与类的一种关系,Java中是单继承,一个子类只能有一个父类,,一个父类可以有多个子类。
2、子类有自己的属性和方法,
3、 子类可以重写父类的方法;
4、子类拥有父类非private的属性和方法
5、 extends关键字;
class father { // 此处是基类(父类)
private int age;
private String name;
private char sex;
}
calss son extends { // 继承了father类,son类成了father类的子类
}
3、super关键字;
super();—>调用父类的构造函数
super.父类非私有的数据成员—>访问父类的数据成员
super.fun();—>调用父类的成员方法
使用super调用父类的构造方法时,应该将此代码放置句首;
public class TestSuper {
public static void main(String args[]) {
ChildClass C1 =new ChildClass(100,200); // 创建子类的对象
C1.f();
}
}
class FatherClass{
public int value;
public FatherClass(int val) {
this.value=val;
}
public void f() {
value=100;
System.out.println("Fatherclass的value值是"+value);
}
}
class ChildClass extends FatherClass{
public int value;
public ChildClass( int valueF, int valueC) {
super(valueF); // 调用父类的构造方法
this.value=valueC;
}
public void f() { // 子类方法,
super.f(); // 使用super在子类中调用父类的方法;
System.out.println("ChildClass的value值是"+value); // value》》》200
System.out.println(value); // 200
System.out.println(super.value); // 调用父类的非私有属性value 》》》100
}
}
三:多态
定义:指的是是同一个方法调用,由于对象的不同可能会有不同的行为;
1:多态势方法的多态,不是属性的多态,(多态与属性无关)
2:多态的存在有三个必要条件:继承、方法重写、父类引用指向子类;
3:父类引用指向子类后,该父类引用调用子类重写的方法,此时多态就出现;
多态内存分析:
在将父类引用指向子类之后,反编译之后却发现调用的仍然是父类方法,其原因是因为
将父类引用指向子类对象后,在堆中产生的子类对象拥有父类的非私有属性,同时在编译时,在方法区产生一个方法表,顶部存有对象的地址,其余是父类和子类可以调用的方法;在编译时,将子类方法的地址赋值给父类方法,因此调用其实父类方法的地址是指向了子类的方法;
图解:、
、
public class test {
public static void main(String args []) {
animal a= new animal();
animal d=new tiger();// 这里是强制向上转型,编译器认为 d 为animal, 将父类引用指向子类
d.shout(); // 多态
d.eat(); // tiger类中并没有eat()方法,此处是调用父类方法;
}
static void animalCry(animal a){ // 使用父类的对象引用来调用子类方法。实现多态
a.eat();
}
}
class animal{ // =============================== 父类
public void shout() { //================父类方法1
System.out.println("动物叫一声");
}
public void eat() { //================父类方法2
System.out.println("动物吃饭时候要叫一声");
shout();
}
}
class dog extends animal{ //================子类1
public void shout() { // 重写父类方法
System.out.println("汪汪汪");
}
}
class tiger extends animal{ //================子类2
public void shout() { // 重写父类方法
System.out.println("老虎嘶吼");
}
}
4、重写(覆盖)与重载:
重载(overload):指多个方法享有相同的名字,但是参数不同或者是参数类型不同(仅仅通过返回值不同不能区分是否重载);
重写(override):指子类继承父类方法,但是改写方法内容;
放一张图片形象比喻