转自: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修饰。这太生活化了,真的很好用很符合现实生活中的对象存在方式。
 总结: 面向对象和面向结构是给开发人员看的,对计算机来的就是执行语句,操作内存,根本不存在什么区别。
 
 

从C转到JAVA学习路之struct与class对比(转)的更多相关文章

  1. 从C转到JAVA学习路之基本知识对比(转)

    转自:http://blog.csdn.net/andywxf01/article/details/53502615 我一直在用C开发,想转到Java时最容易想到的事就是把C里写的代码和功能用JAVA ...

  2. (转)如何学习Java技术?谈Java学习之路

    51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领 ...

  3. Java学习之路:不走弯路,就是捷径

    1.如何学习程序设计? JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用.有编程高手认为,JAVA也好C也好没什么分别,拿来就用.为 ...

  4. 新篇章之我的java学习之路下

    昨天写下了人生的第一篇博客,今天接着写我的java学习之路有关开发及框架的学习过程. 想要学好java语言,只学习一些java的基本语法对实际开发中的用处还是不大的,所以我们还要掌握一些有关javaW ...

  5. #Java学习之路——基础阶段二(第一篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...

  6. 【分享】Java学习之路:不走弯路,就是捷径

    1.如何学习程序设计? JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用.有编程高手认为,JAVA也好C也好没什么分别,拿来就用.为 ...

  7. java学习之路之javaSE基础2

    java学习之路之javaSE基础2 所有的代码都是引用他人写的. 1.逻辑运算符 //&,|,^,! //int x = 10; //5 < x < 15 //x > 5 ...

  8. java学习之路之javaSE基础1

    <h2>java学习之路之javaSE基础1</h2> <div> ###01.01_计算机基础知识(计算机概述)(了解)* A:什么是计算机?计算机在生活中的应用 ...

  9. Java学习之路(转)

    Java学习之路(书籍推荐)   一.基础类 1.<Thinking in java>(阅读2遍),入门第一位是建立正确的概念 2.<Core Java>这本书更贴近实践,更多 ...

随机推荐

  1. python基础===python内置函数大全

    python python内建函数 一.数学运算类 abs(x) 求绝对值1.参数可以是整型,也可以是复数2.若参数是复数,则返回复数的模 complex([real[, imag]]) 创建一个复数 ...

  2. Linux内核学习之中断 中断本质【转】

    转自:http://www.linuxidc.com/Linux/2011-11/47657.htm [中断概述] 中断本质上是一种特殊的电信号,由硬件设备发向处理器.异常和中断的不同是异常在产生时必 ...

  3. Linux nc (netcat) 详解

    Linux nc (netcat) 详解 http://blog.csdn.net/michael493439861/article/details/7445454

  4. xdebug参数说明

    ;;;;;;;;;;;;;;;;;;;;;;;;; Basic Features; xdebug基本功能,如堆栈跟踪,递归错误安全输出,时间内存跟踪等;;;;;;;;;;;;;;;;;;;;;;;;; ...

  5. Git-回滚操作

    git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit git log 查询回滚版本唯一commit标识代码 git reset --ha ...

  6. 使用bottle进行web开发(4):HTTPError

    from bottle import error @error(404) def error404(error): return 'Nothing here, sorry' 上述代码,是对404的定义 ...

  7. MATLAB作图方法与技巧(二)

    作为MATLAB作图方法与技巧(一)的补充 1.绘制二维散点图 ① scatter函数 scatter(x,y,s,c)函数绘制向量x和y的散点图,其中s代表点的大小,c代表点的形状,s和c缺省时为默 ...

  8. Linux下安装Sybase ASE 16

    https://jingyan.baidu.com/article/414eccf67281a16b421f0a76.html

  9. 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集

    最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...

  10. 洛谷——P2958 [USACO09OCT]木瓜的丛林Papaya Jungle

    P2958 [USACO09OCT]木瓜的丛林Papaya Jungle 题目描述 Bessie has wandered off the farm into the adjoining farmer ...