Java面试题(一):面向对象

1. 面向对象

1.1 什么是面向对象

 

把事务看作对象,包括属性和方法。

 

面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节。

对比面向过程,是两种不同的处理问题角度。

面向过程更注重事情的每一步骤和顺序,而面向对象更注重事情有哪些参与者(对象)、以及各自需要做些什么。

 

例如:

你刚搬到一个新租的房子,东西很少,怎么放你都可以快速的找到想找的东西。

然后住的越久,东西就越来越多了,你想要找一个东西需要找半天。

这时候就可以把东西分门别类,电脑手机等设备放一起,零食放一起,衣服放一起。

然后零食还可以细分饮料、辣条、饼干啥的,衣服还可以细分成夏装、秋装、冬装。

这样我们就可以快速的找到想要找的东西了。

 

例如:冰箱装大象

面向过程会将任务分解成一系列的步骤(函数):

1. 打开冰箱

2. 把大象装进去

3. 关上冰箱

面向对象会分解成两个对象:

冰箱: 存放大象 打开冰箱 关上冰箱

大象 : 进入冰箱

从这个例子可以看出,面向过程比较直接高效,而面向对象更易于复用、扩展和维护。

1.2 面向对象三大特性

谈到面向对象了就不能不谈Java面向对象的三大特性了。

分别是封装、继承和多态。

如果是四大特性,那就加上抽象。

1.2.1 封装

封装是一个面向对象的术语,其含义其实很简单,就是把东西包装起来。封装的意义在于明确标识出允许外部使用的所有成员方法和数据。

将类的某些信息隐藏在类的内部,不允许外部程序直接访问,并通过该类提供的方法来实现对隐藏信息的操作和访问。(简单的说就是隐藏对象的信息,留出访问的接口)。

特点:1.只能通过规定的方法访问数据;2.隐藏类的实例细节,方便修改和实现。

例如:

javabean的属性私有,提供get/set方法对外访问,因为属性的赋值或者获取逻辑只能由javabean本身决定。而不能由外部胡乱修改。

 

例子:

就拿我们的笔记本电脑来说吧,电脑内的CPU、显卡等这些硬件我们是看不到的,不拆开电脑就不能知道其中的各种硬件信息,我们只能通过电脑开放给我们的键盘、usb接口来使用电脑操作系统,操作系统再来操作这些硬件,而不是由我们直接操作这些硬件。

1.2.2 继承

在Java中就是创建一个父类,用 extends 关键字继承。

在现实中就是儿子继承父亲财产这种。

继承可以理解为一个类从另一个类获取方法和属性的过程。如果类B继承于类A,那么B就拥有A的方法和属性,可以直接使用。

例如:

父类为狗类,有年龄、体型这些属性,还有吃饭、睡觉等特性。

子类继承父类的这些特性,然后进行专项训练,训练导盲的能力成为导盲犬,训练追查毒品的能力成为缉毒犬。

它们都有从父类继承下来的属性和特性,也有后天训练出来的专业技能。

总结:子类共性的方法或者属性总结使用父类的,而不需要自己再定义,只需要扩展自己的个性化方法。

1.2.3 多态

什么是多态?

多态就是多种形态。在自然界中碳的多态就有石墨、钻石等,水分子的多态就有水、冰、水蒸气等。同一个操作,由于条件的不同,产生的结果也不同。

在Java中,就是基于对象所属类的不同,外部对同一个方法的调用,实际执行逻辑不同。

想要使用多态,就要用上继承、方法重写,用父类引用指向子类对象。

父类对象 变量名 = new 子类对象();
变量名.方法名();

我们在使用的时候 只需要改变子类对象,就可以实现不同的效果,实际开发中多用于接口,例如常用的数据库操作接口,完成增删改查等效果。

也举一个栗子吧:

// 父类 动物类
class Animal {
    public void eat(){
        System.out.println("吃饭");
    }
}
//子类 狗类
class Dog extends Animal {
    public void eat(){
        System.out.println("狗吃肉");
    }
    public void lookDoor(){
        System.out.println("狗看门");
    }
}
//子类 猫类
class Cat extends Animal {
    public void eat(){
        System.out.println("猫吃鱼");
    }
    public void atchingMice(){
        System.out.println("猫抓老鼠");
    }
}

class DuoTaiDemo {
    public static void main(String[] args) {
        //定义为狗
        Animal animal = new Dog();
        animal.eat();
        // 无法调用子类特有功能 也就是说我们只能调用父类中有的方法
//        animal.lookDoor();
        System.out.println("-------------------------------");
        // 还原成狗
        Dog dog = (Dog)animal;
        dog.eat();
        dog.lookDoor();
        System.out.println("-------------------------------");
        // 变成猫
        animal = new Cat();
        animal.eat();
        System.out.println("-------------------------------");
        // 还原成猫
        Cat cat = (Cat)animal;
        cat.eat();
        cat.atchingMice();
        System.out.println("-------------------------------");
    }
}

我们无法调用子类特有功能

 

需要注意的几个点:

不能用子类new父类,例如狗是动物,但动物不是狗。

不能用子类new子类,例如猫不是狗,狗不是猫。

左边要是大类型,右边是小类型。

1.3 第四大特性

抽象:

在类的设计层次:将某些事务的共同属性提取出来集合到一个类;类与对象之间的关系:类时抽象的,对象是具体的,类是对象的模板,对象的创建时以类未模板的,同一个类创造出来的对象具有共同的属性,但属性值不同。

posted @ 2021-06-16 18:57  SmallGrayCode  阅读(659)  评论(0编辑  收藏  举报