Java 面向对象特性与多态面试题,7

java 基础核心问题汇总:https://mp.weixin.qq.com/s/yKCUlvaL9GwgpvSjBtvihQ

https://mp.weixin.qq.com/s?__biz=MzI3ODc3NzQ4NQ==&mid=2247483745&idx=1&sn=4e9f6b78bb1419fd1f8aca5022986f1e&chksm=eb509a83dc27139593eeed2f840e5d849b2e9f5e00848e72ac409e1f1448953d3816e86db72e&scene=21#wechat_redirect

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

    四种特性:封装、继承、多态、抽象

封装:把过程和数据包围起来,使得数据的访问只能通过已定义的接口,保证了对象被访问的隐私性和可靠性。------常见使用是private修饰成员变量,使用固定格式来使用成员变量。

关于数据的访问只能通过已定义的接口,对于这句话依旧存在疑惑。

public class EncapTest {

    //按照要求用,封装成员方法
    private int s;

    private int ss;


    public int getS() {
        return s;
    }

    public void setS(int s) {
        this.s = s;
    }

    public int getSs() {
        return ss;
    }

    public void setSs(int ss) {
        this.ss = ss;
    }
}


public class RunEncap {

    public static void main(String args[]) {
        EncapTest encap = new EncapTest();
        //使用的体现
        encap.setS(55);
        encap.setSs(66);

        System.out.println("Name:" + encap.getS() + "Age:" + encap.getSs());
    }
}

继承性:类的一种层次模型,其提供了一种明确表述共性的方法,对象的新类可以从现有的类中继承派生,类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

    子类使用父类的成员变量和方法,也可以修改使其更符合自己的需求,子类也可以新增方法,实现自己的新需求。子类对父类方法的重写成为重载。而一个类中,方法名相同,参数列表或者返回值不同成为重写。

class A {  

    public String run(D obj) {  

           return ("A & D");  

    }


    public String run(A obj){  

           return ("A & A");  

    }

}     
     

class B extends A {  

    public String run(B obj) {  

           return ("B & B");  

    }  
  

    public String run(A obj){  

           return ("B & A");  

    }   

}


class C extends B {}   

class D extends B {}

  

A aa = new A();

A ab = new B();

B b = new B();

C c = new C(); 

D d = new D();


//注意传入参数类型和调用对象 System.out.println(aa.run(b)); //1, A & A System.out.println(aa.run(c)); //2, A & A System.out.println(aa.run(d)); //3, A & D System.out.println(ab.run(b)); //4, B & A System.out.println(ab.run(c)); //5, B & A System.out.println(ab.run(d)); //6, A & D System.out.println(b.run(b)); //7, B & B System.out.println(b.run(c)); //8, B & B System.out.println(b.run(d)); //9, A & D /** 多态是对象在不同时刻表现出来的多种状态,是一种编译时期状态和运行时期状态不一致的现象。我们在编写或者分析代码时记住如下口诀: 成员变量:编译看左,运行看左(因为无法重写); 成员方法:编译看左,运行看右(因为普通成员方法可以重写,变量不可以); 静态方法:编译看左,运行看左(因为属于类);
*/

多态性是对象在不同时刻表现出来的多种状态,是一种编译时期状态和运行时期状态不一致的现象,多态性包括参数化多态性和包含多态性。

抽象性是指对一类事物的高度提炼以得到共同的共性部分,抽象不需要了解全部细节,而只是一种通用的描述约束,抽象可以是过程抽象或者数据抽象。

在开发中,对于必须实现的内容,使用接口来进行规范。

问:Java 多态的优缺点分别是什么?

答:多态的优点:

调用时可以直接使用父类的引用变量来调用子类的实现方法。

  1. 提高了代码的维护性(继承保证);

  2. 提高了代码的扩展性(由多态保证);

多态的缺点:

  1. 不能使用子类的特有功能(非要使用只能通过不优雅的创建子类对象方式,但是占用内存,其次就是使用强转类型,也容易出现问题);

  2. 向下转型(把父类转换为子类型)中有可能会出现异常;