欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JAVA 面向对象三大特征:继承、封装、多态

程序员文章站 2022-06-16 18:05:35
封装:▪面向对象三大特征之一 ——封装,将类的某些信息隐藏在类内部,不允许外部程序直接访 问,而是通过该类提供的方法来实现对隐藏信息的操作和访问封装的好处:1、隐藏类的内部实现细节2、只能推过提供的方法进行访问3、可以根据需求添加 复杂的逻辑判断语句4、方便修改实现面向对象的封装(狭义)可以用一句话概述:讲类中的属性设置为私有,提供共有的外部方法供程序进行调用,可以实现丰富细节操作广义的封装:可以讲完成特定功能的代码块封装成一个方法,供不同的程序进行调用高内聚,低耦合:高内聚:类...

面向对象三大特征:

一、继承
表示父类跟子类的关系,当两个类或者多个类具备相同 属性和方法时,
为什么使用继承:将重复代买抽取到父类中,使用继承优化设计。2、修改重复代码,
▪ 继承 inheritance
– 子类 父类
– 子类可以从父类继承属性和方法
– 子类可以提供自己单独的属性和方法
▪ 封装/隐藏encapsulation
– 对外隐藏某些属性和方法
– 对外公开某些属性和方法
▪ 多态 polymorphism
– 为了适应需求的多种变化,使代码变得更加通用!
▪ 面向过程只有封装性(功能的封装,而没有数据的封装),没有继承和多态

接口*
java中的继承关系是单继承,如果拥有多个父类的时候,可以考虑使用接口进行实现.接口代表着一种约定。
java中的接口具备广泛的使用:
用法:
使用interface来修饰
接口中可以包含多个方法,且方法跟抽象类中的抽象方法一致,可以不写实现,子类在实现的时候必须要实现代码逻辑
子类实现接口使用implements关键字
特征:
1、接口中的所有方法都是抽象方法,不能包含方法的实现
2、接口中的所有方法的访问修饰权限都是public,不写并不是默认访问权限,而是public
3、接口不能被实例化
4、接口的子类必须要实现接口中的所有方法,跟抽象类有所不同,抽象类中的抽象方法必须要被子类实现
5、子类可以拥有实现多个接口
6、接口中的变量都是静态常量,如果变量没有使用static关键字修饰,它也表示静态常量,不用final关键字修饰,也是常量
7、接口中的方法和常量无论是否添加public修饰,默认的权限有且仅有一个,就是public

  接口的使用:
       1、接口代表一种能力,接口中可以定义N多个方法,子类在进行实现的时候,必须要实现这些方法
           将这些方法进行实现,就意味着具体了方法的能力
           关心实现类有何能力,而不关心实现细节
  父类:is a   接口:has a
  抽象类和接口的区别:
       1、抽象类中的方法可以有抽象方法,也可以有普通方法,但是接口中只能包含抽象方法
       2、抽象类需要使用abstract关键字来修饰,而接受使用interface关键字来修饰
       3、子类使用extends关键字来继承抽象类,使用implements来实现接口
       4、子类继承抽象类的时候必须要实现所有的抽象方法,普通方法可以不重写,而接口中的所有方法必须实现
       5、抽象类中可以定义成员变量,而接口中只能定义静态常量
       6、抽象类在子类实现的时候是单继承,而接口时多继承
       7、抽象类和接口都不能实例化,但是抽象类中可以有构造方法,而接口中不能有构造方法
       8、抽象类中可以实现接口,并且不实现接口中方法,而接口只能继承接口,不能实现接口
   注意:
       在实际的项目开发过程中,如果可以使用接口,尽量使用接口,将单继承的父类留在最关键的地方

二、封装:
▪ 面向对象三大特征之一 ——封装,将类的某些信息隐藏在类内部,不允许外部程序直接访 问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
封装的好处:
1、隐藏类的内部实现细节
2、只能推过提供的方法进行访问
3、可以根据需求添加 复杂的逻辑判断语句
4、方便修改实现

面向对象的封装(狭义)可以用一句话概述:
讲类中的属性设置为私有,提供共有的外部方法供程序进行调用,可以实现丰富细节操作
广义的封装:
可以讲完成特定功能的代码块封装成一个方法,供不同的程序进行调用

高内聚,低耦合
高内聚:类的内部数据操作细节自己完成,不允许外部干涉
低耦合:仅暴露少量的方法给外部使用

JAVA 面向对象三大特征:继承、封装、多态
有多少个成员属性,提供多少个get、set方法

访问控制符:
▪ 类的访问权限只有两种
– public 公共的
▪ 可被同一项目中所有的类访问。 (必须与文件名同名)
– default/friendly 默认的/友好的
JAVA 面向对象三大特征:继承、封装、多态

三、多态
对于同一个指令(调用同一个名称的方法)不同的对象给予不同的反应(不同的方法实现)
规范:1、必须要有继承关系
2、子类的方法必须重写父类的方法
3、父类引用指向子类对象 Pet dog = new Dog(); Pet cat=new Cat();

使用多态实现思路:
–编写父类
–编写子类,子类重写父类方法
–运行时,使用父类的类型,子类的对象 Pet dog = new Dog();

多态的目的:
–提高代码的扩展性和维护性
–方便代码逻辑的编辑

多态的两种表现形式:
1.父类作为方法的参数
2.父类作为方法的返回值类型

多态举例:

public abstract class Pet {
    public abstract void feed();
    public void play(){
        System.out.println("playing.....");
    }
}
public class Cat extends Pet {
    @Override
    public void feed() {
        System.out.println("猫在吃鱼");
    }
}

public class Dog extends Pet {
    @Override
    public void feed() {
        System.out.println("狗在吃骨头");
    }
}
public class Penguin extends Pet {
    @Override
    public void feed() {
        System.out.println("企鹅在吃。。。。");
    }
}
public class Person{
    //父类作为方法参数实现
    public void feed(Pet pet){
        pet.feed();
    }
    public void play(Pet pet){
        pet.play();
    }
    //返回值类型实现
    public Pet buyPet(int type){
        if(type==1){
            return new Dog();
        }else if(type == 2){
            return new Cat();
        }else{
            return new Penguin();
        }
    }

    public static void main(String[] args) {
        Person p = new Person();
        Pet dog = new Dog();
        Pet cat = new Cat();
        Pet penguin = new Penguin();
        p.feed(dog);
        p.feed(cat);
        p.feed(penguin);
        p.play(dog);
        p.play(cat);
//        Person p1 = (Person)dog;
        Pet pet = p.buyPet(2);
        if(pet instanceof Dog){//类型判断,通常和强制类型转换结合使用
            System.out.println("买的是一只狗");
        }else if(pet instanceof Cat){
            System.out.println("买的是一只猫");
        }else{
            System.out.println("买的是一只企鹅");
        }
    }

}

引用类型的转换跟基本数据类型的转换类似:

  •   1、当父类需要转成子类的时候,要进行强制转换,但是在强制转换之前一定要先判断父类引用指向的子类对象到底是谁, 如果无法确定,在运行过程中可以出错
    
  •   2、当子类需要向父类转换的时候,直接自动转换,不需要进行任何的判断。
    

本文地址:https://blog.csdn.net/weixin_45662485/article/details/107023252