Java面向对象

文章目录

  • 一、封装
  • 二、继承
  • 三、多态

一、封装

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(){//返回类型是Animal,可以返回Animal类型的对象或Animal子类类型的对象
   return new Dog("小狗",10);
}

3、向上转型后,通过父类引用调用这个父类和子类重写(覆盖,覆写)的方法,结果是调用了子类的方法,这个过程叫做运行时绑定(后期绑定,动态绑定)。向上转型的缺点是不能调用子类特有的方法,优点是让代码实现更简单灵活
编译时绑定(前期绑定,静态绑定):方法的重载,在编译时通过方法的参数等就能确定调用的是哪个方法。
4、方法重写注意事项(方法重写:方法的名字、参数类型个数名称、返回值类型相同,可用idea生成重写方法,点击generate和Override Methods…):
(1)被private、static、final(密封方法)修饰的方法、构造方法不能重写
(2)访问修饰限定符private<默认权限<protected (3)重写方法与被重写方法的返回值可以不同,但必须满足父子类关系,如被重写方法的返回值类型为Animal,重写方法的返回值类型可以为Dog,返回值构成父子类关系时叫协变类型
(4)在重写方法的前面写上@Override注释,这个注释能帮我们进行合法性校验,如不小心把重写方法的名字写错了(写成watsh),编译器就会发现父类中没有watsh方法,这时就会编译报错无法构成重写
重写的设计原则:对于已经投入使用的类,尽量不要进行修改,重新定义一个新的类,来重复利用其中共性的内容,并且添加或者改动新的内容。
5、向下转型:父类引用还原为子类对象,为的是调用子类特有的方法,向下转型不安全,为提高安全性引入instanceof

Animal animal1 =new Dog("小狗",10);
Bird bird1 =(Bird)animal1;//animal1引用的是Dog类型的对象,Dog类型的对象不能转换为Bird类型的对象,造成类型转换异常,所以向下转型不安全
bird1.fly();

Animal animal2 =new Bird("小鸟",10);
if(animal2 instanceof Bird){//检查animal2引用了Bird类型的对象才会走if,否则走else
    Bird bird2 =(Bird)animal2;
    bird2.fly();
}else {
    System.out.println("不能飞");
}

6、多态:当我们引用的子类对象不一样的时候,通过父类引用调用同一个重写的方法,表现出来的行为不一样,这种思想叫做多态。属性和构造方法没有多态性。多态缺陷:代码运行效率降低。

class Test{
    public static void drawMap(Shape shape){
        shape.draw();//draw()方法在Cycle类中进行了重写,这里发生了向上转型和动态绑定,这里Shape是父类
    }
    public static void main(String[] args){
        Cycle cycle =new Cycle();
        drawMap(cycle);
    }
}

你可能感兴趣的:(java,开发语言,学习)