转自:http://blog.csdn.net/andywxf01/article/details/53506549

JAVA里最牛B的最基本的就是类,而C语言中的struct也可以定义自己的数据结构, 它们有很多相似的也有区别。在我看来它们之间最大的不同是struct里不支持方法,class里支持。

       方法是什么?就是函数,也就是说JAVA中的成员变量与函数归属于一个类的,C语言中有办法做到吗? 我想到的就是函数指针。
       先看如下C代码:
#include<stdio.h>
float Getlen(float r)//求周长
{
return 3.14*r*r;
}
float Getrare(float r)//求面积
{
return *3.14*r;
}
typedef struct s_circle
{
float r;
float (*getlen)(float);
float (*getrare)(float);
}Circle;
void main()
{
Circle cl;
cl.getlen = Getlen;//关键点就在这里,将函数与类型关联起来
cl.getrare = Getrare;
printf("%f %f",cl.getlen(), cl.getrare());
}

我定义了一个Circle类型,里面有3个成员,一个普通变量,2个函数指针。在main()里面我将cl的函数指针与上面两个函数关联起来了,在使用的时候就直接调用,发现没有跟JAVA中的类非常相似了,都可以直接用方法了。

  下面看下JAVA中实现这个功能:
class Circle
{
double r;
double getlen(double r)//求周长
{
return 3.14*r*r;
}
double getrare(double r)//求面积
{
return 2*3.14*r;
}
} public class example {
public static void main(String[] args) {
Circle cl = new Circle();
System.out.println(cl.getlen(1)+" "+cl.getrare(2));
}
}

大家对比一下,都要定义成员,都要定义2个函数,使用时也是直接调用方法,是不是并没有什么区别嘛。

    如果只写一个类真的没什么区别,但是JAVA是以类为基本构造起来的,所以它将类功能发挥到了极致,加了很多功能。
    下面来看下类的继承与C中struct的关系:
     看下C的两个结构体:学生与工人
typedef struct s_student
{
int age;
char name[];
char sex[];
char number[];//学号
int grade;//年级
}Student;
typedef struct s_work
{
int age;
char name[];
char sex[];
char company[];//公司
char type[]; //工种
}Work;

大家可以发现age, name, sex重复了,如果再定义老师,农民等类型。发现还是要重复写这3个成员,因为是人都会有这3个成员。所以可以提取出来一个类型,如下

typedef struct s_human
{
int age;
char name[];
char sex[];
}Human;
typedef struct s_student
{
Human info;
char number[];//学号
int grade;//年级
}Student;
typedef struct s_work
{
Human info;
char company[];//公司
char type[]; //工种
}Work;

这样以后不管定义多少种身份,都可以用Human这个基本信息了。

      细心的同学应该会发现,这尼妹跟JAVA里类的继承很像嘛。不过JAVA做的更完美, struct类型下的成员信息是全部公开可访问的,但现实生活中不是这样的,比如女生的年龄,你的存款等。java类成员可以用public, private, protect修饰。
       public就是公开都可以访问, private就是私有。如果你的存款想让家人或者儿子们知道,那就用protect修饰。这太生活化了,真的很好用很符合现实生活中的对象存在方式。
 总结: 面向对象和面向结构是给开发人员看的,对计算机来的就是执行语句,操作内存,根本不存在什么区别。
 
 

最新文章

  1. slideDoor(学习某编程网站的,仅作记录和学习)
  2. Azure China (11) 使用Azure China Storage Public Blob
  3. EFS加密解密----重装系统后
  4. linux学习笔记2-命令总结3
  5. HTML CSS——margin与padding的初学
  6. HttpClient 请求WebApi
  7. jxl读写excel, poi读写excel,word, 读取Excel数据到MySQL
  8. ubuntu server 时区设置问题解决
  9. Mybatis 动态使用update语句
  10. linux 运维,代理,acl控制访问
  11. 初识Java——日期的格式化
  12. mysql时间相加函数DATE_ADD()
  13. 1、docker容器技术基础入门
  14. mysql 开发进阶篇系列 42 逻辑备份与恢复(mysqldump 的完全恢复)
  15. 田螺便利店—PyCharm安装第三方库
  16. 微信应用号来了,微信小程序开发教程!
  17. CodeForces 1059C
  18. Android开发之漫漫长途 Ⅲ——Activity的显示之Window和View(2)
  19. windows 8 中 使用 httpclient
  20. 一步一步学习IdentityServer3 (6)

热门文章

  1. Google的C++开源代码项目
  2. a标签里文本居中
  3. Log4Net的WebApplication使用
  4. linux用grep查找包含两个关键字的命令
  5. hdu 1281(最小点覆盖数)
  6. PDCurses 笔记(一)
  7. shipyard, swarm看到你,我才睡觉:)
  8. win上配置nginx
  9. PHP的文件操作类
  10. flutter 频道切换