面向对象的四大基本特性

面向对象的四大基本特性

面向对象的核心概念就是封装、抽象、继承、多态这四大基本特性,在这里先解释一下它们的定义:

封装:是一种隐藏信息的特性。找到变化并且把它封装起来,你就可以在不影响其它部分的情况下修改或扩展被封装的变化部分,这是所有设计模式的基础,就是封装变化,因此封装的作用,就解决了程序的可扩展性。 

抽象:在使用面向对象的方法设计一个软件系统时,首先就要区分出现实世界中的事物所述的类型,分析它们拥有哪些性质与功能,再将它们抽象为在计算机虚拟世界中才有意义的实体——类,在程序运行时,由类创建出对象,用对象之间的相互合作关系来模拟真实世界中事物的相互关联。

继承:子类继承父类,可以继承父类的方法及属性,实现了多态以及代码的重用,因此也解决了系统的重用性和扩展性,但是继承破坏了封装,因为他是对子类开放的,修改父类会导致所有子类的改变,因此继承一定程度上又破坏了系统的可扩展性,所以继承需要慎用,只有明确的IS-A关系才能使用,同时继承在在程序开发过程中重构得到的,而不是程序设计之初就使用继承,很多面向对象开发者滥用继承,结果造成后期的代码解决不了需求的变化了。因此优先使用组合,而不是继承,是面向对象开发中一个重要的经验。 

多态:接口的多种不同的实现方式即为多态。接口是对行为的抽象,刚才在封装提到,找到变化部分并封装起来,但是封装起来后,怎么适应接下来的变化?这正是接口的作用,接口的主要目的是为不相关的类提供通用的处理服务,我们可以想象一下。比如鸟会飞,但是超人也会飞,通过飞这个接口,我们可以让鸟和超人,都实现这个接口,这就实现了系统的可维护性,可扩展性。 

 

只说这些概念性的东西,可能会很难理解,所以给大家再用实例解释一下它们各自的含义:

1、封装可以包起外界不必需要知道的东西,只向外界展露可供展示的东西。封装的类=数据+算法

如:定义一个Name对象的方法——(先写上private string _Name,右键,重构,封装)

复制代码
 1 private string _Name;//命名规则:下划线+大写字母开头
 2 
 3 public string Name
 4 {
 5       get//取值
 6       { return _Name; }
 7 
 8       set//赋值
 9       { _Name = value; }
10 }
复制代码

在get,set中可以写上很多种算法,最终让它的返回值返回给Name类,从而实现隐藏信息的效果。

2、抽象即写好一个类,用来在编程中调用。

如:根据年龄、性别来判断是否超重的函数(类)

复制代码
 1         public int cetizhong(string sex,decimal shengao,decimal tizhong)
 2         {
 3             if (sex == "")
 4             {
 5                 decimal biaozhun = shengao - 100;
 6                 if (tizhong > biaozhun + 3)
 7                 {
 8                     return 1;//
 9                 }
10                 else if (tizhong < biaozhun - 3)
11                 {
12                     return 2;//
13                 }
14                 else
15                 {
16                     return 0;//标准
17                 }
18                 
19             }
20             else if (sex == "")
21             {
22                 decimal biaozhun1 = shengao - 100;
23                 if (tizhong > biaozhun1 + 3)
24                 {
25                     return 1;//
26                 }
27                 else if (tizhong < biaozhun1 - 3)
28                 {
29                     return 2;//
30                 }
31                 else
32                 {
33                     return 0;//标准
34                 }
35             }
36             else
37                 return 3;
38             
39         }
复制代码

再在主函数中调用:

复制代码
 1             Ren r = new Ren();
 2             Console.WriteLine("请输入姓名:");
 3             r.name = Console.ReadLine();
 4             Console.WriteLine("请输入姓别:");
 5             r.sex = Console.ReadLine();
 6             Console.WriteLine("请输入身高:");
 7             r.shengao = decimal.Parse(Console.ReadLine());
 8             Console.WriteLine("请输入体重:");
 9             r.tizhong = decimal.Parse(Console.ReadLine());
10 
11             int fanhui = r.cetizhong(r.sex, r.shengao, r.tizhong);
12             if(fanhui ==0)
13                 Console.WriteLine("标准");
14             else if(fanhui == 1)
15                 Console.WriteLine("偏重");
16             else 
17                 Console.WriteLine("偏瘦");
复制代码

new的过程也就是由类创建出新对象的过程,也就是函数的一个扩展。

 

继承——相当于父子关系,食品可以分为水果、蔬菜等等,而水果又可以分为苹果、西瓜等等,它们都继承了上一级的特点。

多态——水果有很多种,分为苹果、西瓜等,这便是它的多种形态。

这些特性还有很多扩展的概念,将会在下面的几章提到。

### 面向对象编程的四大基本特性 #### 封装 (Encapsulation) 封装是指将数据(属性)和操作数据的方法捆绑在一起,形成一个独立的单元——类。通过访问修饰符控制外部对类成员的访问权限,从而保护内部状态不被随意修改。这种方式不仅提高了安全性,还增强了模块化设计的能力[^1]。 ```java public class Person { private String name; // 私有字段 public void setName(String newName) { // 提供公共方法设置name this.name = newName; } public String getName() { // 获取name值 return this.name; } } ``` #### 继承 (Inheritance) 继承允许创建一个新的类,该新类可以从现有的类派生而来,并获得原有类的功能以及可以添加新的功能或覆盖已有功能。这种机制有助于减少重复代码并促进软件组件之间的重用性[^2]。 ```java class Animal { protected void eat() { System.out.println("This animal is eating."); } } // Dog 类继承自Animal类 class Dog extends Animal { @Override protected void eat(){ System.out.println("The dog eats bones."); } public void bark(){ System.out.println("Dog barks"); } } ``` #### 多态 (Polymorphism) 多态意味着同一个接口可以根据所处上下文的不同而表现出多种形态。具体来说,在运行时能够根据实际的对象类型调用相应版本的方法。这一特点使得程序更加灵活通用[^4]。 ```java public interface Shape { double area(); } class Circle implements Shape{ final double PI=3.14; int radius; public Circle(int r){ this.radius=r; } @Override public double area(){ return PI*this.radius*this.radius; } } Shape s=new Circle(5); System.out.print(s.area()); // 输出圆面积78.5 ``` #### 抽象 (Abstraction) 抽象用于隐藏复杂的现实世界实体的具体细节,只保留本质的部分作为模型表示出来。在 Java 中可以通过定义抽象类或者接口来实现这一点。它强调的是概念而不是具体的实现方式。 ```java abstract class Vehicle { abstract void startEngine(); // 定义了一个抽象方法startEngine() void stopEngine(){ // 这是一个非抽象方法 System.out.println("Stopping engine..."); } } class Car extends Vehicle { @Override void startEngine() { System.out.println("Car's engine started!"); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值