为什么java语言可以在类(class)的声明中调用new创建实例,而不是在main方法中定义引用,然后调用new分配空间

ba_wang_mao 2018-08-28 02:48:55
刚刚从C语言转学JAVA语言,
C语言定义类型就定义类型,创建对象空间必须先在main()中调用子函数A,在子函数A中调用new()申请空间。

感觉JAVA语言中在class定义和声明中调用new怪怪的,因为class定义只是声明某个类,你只有在main()创建一个引用,然后调用new去申请空间才能创建类的实例对象的嘛,为什么要在类的定义和声明的时候调用new呢?

另外:在类的定义和声明的时候调用new也没有任何意义呀!你只要不在main方法中使用,永远是不会真正的执行new动作的嘛
...全文
595 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ba_wang_mao 2018-09-04
  • 打赏
  • 举报
回复
多态性的关键点:
引用对象使用父类,
实例对象使用子类
例如:
A为父类
B为子类
A a = new B();
ba_wang_mao 2018-09-03
  • 打赏
  • 举报
回复
引用 9 楼 weixin_38500325 的回复:
楼主了解过面向对象编程吗?
c是面向过程,而java是面向对象.
面向对象,注重的是对象,通过对象进行编程,注重对象的行为(即方法),特性(即属性).


好象多态性分以下几个方面:
(1)、方法的重载
说白了就是方法的名称相同,入口参数的类型或入口参数的个数不同。
目的:很多类似的功能只需要起一个共同的API函数名,不必像在C语言中每一个功能命名一个API函数名与之对应。
(2)、子类方法重写父类的方法
子类继承父类,父类要么是普通类,父类要么是抽象类。对于父类是抽象类,抽象方法只能在子类中实现。
父类是普通类,子类继承父类,子类方法名和父类的方法名相同,被称之为重写方法或覆写方法。
重写的本质:子类重写的方法可能和父类的方法功能上有区别。
例如:定义一个哺乳动物父类,它有一个方法【吃】,哺乳动物有的吃草,有的吃肉。
再定义一个老虎的子类,它也有一个方法【吃】,但是老虎只吃肉。
(3)、还有一种是用父类声明引用,但是创建子类实例对象。
ba_wang_mao 2018-09-03
  • 打赏
  • 举报
回复
引用 9 楼 weixin_38500325 的回复:
楼主了解过面向对象编程吗?
c是面向过程,而java是面向对象.
面向对象,注重的是对象,通过对象进行编程,注重对象的行为(即方法),特性(即属性).
我只知道面向对象的三大特征:封装性,继承性和多态性。
封装性好理解,继承性也好理解,只是多态性不好理解,这段时间正在看这方面的知识点。
遇见1995 2018-08-31
  • 打赏
  • 举报
回复
楼主了解过面向对象编程吗?
c是面向过程,而java是面向对象.
面向对象,注重的是对象,通过对象进行编程,注重对象的行为(即方法),特性(即属性).
ba_wang_mao 2018-08-30
  • 打赏
  • 举报
回复
JAVA语言还是借用了C语言指针的概念,例如:用new创建一个对象实例,会在堆区分配实体空间,然后在栈中创建一个引用,该引用指向堆区的实体空间,实际上这个引用就是指针,只是JAVA语言不认为它是指针,而认为它是一个引用。
ba_wang_mao 2018-08-30
  • 打赏
  • 举报
回复
尤其是长期搞嵌入式领域的工程师,基本上用不到用new来创建对象的概念,基本上都是用定义全局变量或者局部变量的方式使用变量,全部变量存储在单片机的RAM区,局部变量存储在栈区,字符串常量区存储在单片机的常量区,很难用到用new创建的堆区。
ladiesmansy 2018-08-29
  • 打赏
  • 举报
回复
面向对象
ba_wang_mao 2018-08-29
  • 打赏
  • 举报
回复
面向对象的三大特征:1、封装性、2、多态性 3、继承性。

封装就是把某一个对象所需的元素(属性)和行为(方法)全部打包封装在某一个类中,外界只能通过方法的方式来访问类的内部属性,不能直接访问类的私有的属性。
JAVA语言仅仅为了在堆栈中节省一个引用指针,就发明了“匿名类”可以直接用new在堆空间分配空间,但是在栈空间却不提供引用指针,让我们这些常年在嵌入式领域搞C语言然后转学JAVA语言的初学者很糊涂。
ba_wang_mao 2018-08-29
  • 打赏
  • 举报
回复
C语言中,我在.h文件中定义一个或声明一个类型

typedef struct
{
uint16_t Year;
uint8_t Month;
uint8_t Day;
uint8_t Hour;
uint8_t Minute;
uint8_t Second;
uint8_t Alarm_type;
} Event_Alarm_Type;


1、你在.h中定义的一个类型,只表示你只是自定义了一个类型,它们和系统提供的int , long , float是一样的。
2、必须要在.C文件中通过定义全局变量或者在函数中定义一个局部变量的方式来创建这个类型的一个引用,系统才会给这个类型的引用创建实体空间(要么在全局变量区,要么在堆栈区)。
Surrin1999 2018-08-29
  • 打赏
  • 举报
回复
在Class里面自己new有什么关系吗,你不在main里面new这个类的对象,这个类里的对象的成员变量就不会被new出来,作为这个类的对象的成员变量是在这个类的对象被分配实体才被分配空间的,所以是没问题的,接触面向对象就能体会两者区别了~
tongkaiming 2018-08-29
  • 打赏
  • 举报
回复
建议去看“面向对象”的含义
verejava 2018-08-29
  • 打赏
  • 举报
回复
Java 面向对象 之 封装方法

http://www.verejava.com/?id=16992728331734

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧