简单总结 面向对象三大特性


面向对象三大特性

一、多态

1.面向对象四大基本特性:抽象,封装,继承,多态
抽象,封装,继承是多态的基础。多态是抽象,封装,继承的表现

2.什么是多态
多态是指允许不同类的对象对同一消息作出不同的响应。

3.多态的作用
简单来说:解藕。详细点就是,多态是设计模式的基础(既然是基础,那么一些设计模式中肯定有多态的下面三个条件)

4.多态存在的三个条件(必须同时满足!!!)
有继承关系
子类重写了父类方法
父类引用指向子类对象

5.注意:
因为多态存在必须要有“子类重写父类方法”这个条件,那么下面几种类型的方法没办法表现出多态的特性(因为不能被重写或引用)
static方法:static修饰的方法是属于类的,而不属于实例
final方法:因为被final修饰的方法无法被子类重写
private方法:被private修饰的发那个法对子类不可见,
protected方法:被protected修饰的方法可以被子类见到,也可以被重写,但无法被外部所引用,无法引用,就没有多态

6.多态的分类:
编译时多态,方法的重载
运行时多态,方法的重写

7.分析多态问题的几条原则

比如有一个父类Father,有一个子类Children
(1)向上转型是自动的。Father f=new Children()是自动的,不需要强转。注意:向上转型会丢失子类原有的方法
(2)向下转型要强转。即Children c=new Father()是无法编译通过的,必须要Children c=(Children)new Father(),让父类知道它要转成具体哪个子类
(3)父类的引用能指向子类。如果子类没有重写被调用的父类方法,就使用父类的方法,反之子类重写被调用的父类方法,就使用子类的方法
例如:

[复制代码](javascript:void(0)😉

父类:
public class Father {
        public void say(){
        System.out.println("我是爸爸");
    }
}


[复制代码](javascript:void(0)😉

[复制代码](javascript:void(0)😉

子类:有继承关系,并且重写父类的方法say()
public class Children extends Father {
        public void say(){
        System.out.println("我是儿子");
    }
}

[复制代码](javascript:void(0)😉

[复制代码](javascript:void(0)😉

public class Test {
    public static void main(String[] args) {
        Father f=new Children(); //父类的引用指向子类对象。
        f.say();//因为子类重写父类方法,所以这里其实是调用子类的方法
    }
}

[复制代码](javascript:void(0)😉

二、封装

1.什么是封装
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。

封装的三大好处:

  • 良好的封装能减少耦合。
  • 只能通过规定的方法访问数据。
  • 隐藏类的实例细节,方便修改和实现。

2.实际应用
(1)好处1:封装确实可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码。

[复制代码](javascript:void(0)😉

public class User {
    private int id;
    private String name;
    private int age;
    
    public int getId() {return id;}

    public void setId(int id) {this.id = id;}

    public String getName() {return name;}

    public void setName(String name) {this.name = name;}

    public int getAge() {return age;}

    public void setAge(int age) {this.age = age;}
}

[复制代码](javascript:void(0)😉

如果我们需要修改User这个类,把 age改为String 。你只有少数几处使用了这个类还好,如果你有几十个甚至上百个这样地方,你是不是要改到崩溃。如果使用了封装,只需要稍微改变下 User类的setAge()方法即可。

[复制代码](javascript:void(0)😉

public class User {
    private int id;
    private String name;
    private String age;
    
    public int getId() {return id;}

    public void setId(int id) {this.id = id;}

    public String getName() {return name;}

    public void setName(String name) {this.name = name;}

    public int getAge() {return age;}

    public void setAge(String age) {this.age = age;}
}

[复制代码](javascript:void(0)😉

(2)好处2:可以对成员变量进行更精确的控制。

[复制代码](javascript:void(0)😉

public class User {
    private int id;
    private String name;
    private int age;
    
    public int getId() {return id;}

    public void setId(int id) {this.id = id;}

    public String getName() {return name;}

    public void setName(String name) {this.name = name;}

    public int getAge() {return age;}

    public void setAge(int age) {
        if(age>250){
            System.out.println("年龄不符合要求");//输出提示信息
        }else {
            this.age = age;
        }        
    }
}

[复制代码](javascript:void(0)😉

三、继承

1.什么是继承?
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。

2。继承的利弊
利:

  • 减小代码和数据的冗余度,大大增加程序的重用性。
  • 继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系
  • 提供多重继承机制。

弊:

类与类产生了关系,其实也是继承的一个弊端,继承是一种强耦合关系,违背了开发的原则:低耦合,高内聚。

3.构造方法:
首先是通过构造方法来完成对象的初始化,子类的构造方法默认调用父类的构造方法,通过super()方式 。注意:如果用super关键字在子类里调用父类的构造方法,则必须在子类的构造方法中的第一行。
(1).父类有默认的构造方法,子类的构造方法默认执行super();调用父类构造方法进行实例化
(2).父类没有默认构造方法(肯定是手写了构造方法),子类构造方法中显示使用super()调用父类构造方法


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM