封装、继承与多态

封装、继承和多态


1. 封装

封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。

面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。

封装是一种信息隐藏技术,在java中通过关键字private,protected和public实现封装。

什么是封装?封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。

适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性。

/**
 * 其实一个类本身就是一个封装,类中的方法也可理解成以个封装,
 * 对类中数据的访问只能同过类提供的方法来进行
 */
public class Product {
    //对属性的封装
    private String name;
    private float price;

    //对外界提供方法的封装
    public void setName(String name) {
        this.name = name;
    }
}

封装的作用:

① 对象的数据封装特性彻底消除了传统结构方法中数据与操作分离所带来的种种问题,提高了程序的可复用性和可维护性,降低了程序员保持数据与操作内容的负担。

②对象的数据封装特性还可以把对象的私有数据和公共数据分离开,保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的。

2. 继承

继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。其中被继承的类叫父类(也叫超类或基类),继承者叫子类(也叫派生类)。

继承避免了对父类和子类之间共同特征进行的重复描述。

继承分为单继承和多重继承。
  • 单继承是指一个子类最多只能有一个父类。
  • 多继承是一个子类可以有二个以上的父类。

    由于多继承会带来二义性,在实际应用中应尽量使用单继承。Java语言中的类只支持单继承,而接口支持多继承。Java中多继承的功能是通过接口(interface)来间接实现的。

    public class A { //建一个A类
    
        protected int a = 10; //A类的成员
    
        public void printA() { //A类的方法
            System.out.println("a = " + a);
        }
    }
    
    public class B extends A { //B类继承A类,则B类的对象自动拥有A类的属性和方法
    
        protected int b; //B类自己的成员
    
        public void printB() { //B类自己的方法
            this.printA();//B类的对象可以使用A类的公开方法printA()
            System.out.println("b = " + b);
        }
    }
    

Java继承的特征

  • 继承关系是传递的。若类C继承类B,类B继承类A(多层继承),则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性和方法。继承来的属性和方法尽管是隐式的,但仍是类C的属性和方法。继承是在一些比较一般的类的基础上构造、建立和扩充新类的最有效的手段。

  • 继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。

  • 继承提供了软件复用功能。若类B继承类A,那么建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。

  • 继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。

  • 提供多重继承机制。从理论上说,一个类可以是多个一般类的特殊类,它可以从多个一般类中继承属性与方法,这便是多重继承。Java出于安全性和可靠性的考虑,仅支持单重继承,而通过使用接口机制来实现多重继承。

3. 多态

多态是指不同类的对象对同一消息,做出不同的响应或者同一个操作,在不同条件下,做不同的处理。

多态有两种表现形式:方法重载和方法重写

  • 方法重载:在一个类中,包含两个或者两个以上同名、不同参数列表的方法。

  • 方法重写:在子类中,实现父类中的抽象方法(接口)的过程,或者覆盖原有可重写的方法。

方法重载要满足一下条件

  1. 在同一个类中;

  2. 方法名相同;

  3. 参数列表不同,即参数的个数,或对应位置上的类型不同;

注意:方法的返回值不是方法签名的一部分,因此进行方法重载的时候,不能将返回值类型的不同当成两个方法的区别

方法重写要满足的条件

  1. 在两个不同的类中,且这两个类要具备继承关系;

  2. 子类方法与父类方法必须具有相同的方法名,返回值类型,参数列表(如果参数列表不同,系统会默认这两个重载后的不同的两个方法);

  3. 要重写的方法在父类中是非private、final和static方法;

  4. 子类重写方法的访问权限不能比父类被重写方的法有更小(private < default < protected < public);

  5. 子类重写方法中的异常,不能比父类被重写方法的异常更广泛(父类方法中的异常不能是子类方法中的异常的子孙类)

    public abstract class A {
        private int a = 10;
    
        public abstract void print(); //提供抽象方法,用来被子类重写
    
        public void setA(int a) {
            this.a = a;
        }
        //方法setA()被重载
        public int setA() {
            return 0;
        }
    }
    
    //继承A类的B类
    public B extends A {
    
        @Override
        public void print() {
            System.out.println("This is " + getClass.getName);
        }
    }
    
    //继承A类的C类
    public C extends A {
    
        @Override
        public void print() {
    
            System.out.println("This is C! ****");
    
            System.out.println("This is " + getClass.getName);
        }
    }
    
    
    
    public class Test {
    
        public static void main(String[] args) {
    
            A a1 = new A();
            int x = a1.setA(); 
            a1.setA(2);
    
    
            A a2 = new B();
            a2.print();
    
            A a3 = new C();
            a3.print(); 
    
        }
    }
    

多态的作用:

通过多态可以减少类中代码量,可以提高代码的可扩展性和可维护性。

消除类型之间的耦合关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值