请教,万物皆对象,有时反而把简单问题搞复杂。

SilentHunter460 2020-03-08 11:41:43
这几天学习JavaFx,其中有布局方式对象,Pane类,下面有FlowPane、GridPane、BorderPane、HBox、VBox、StackPane类。
这些类只是设置窗口控件的布局方式,也要New,这东西好像当个属性就够个,提升到对象的级别总觉得把简单问题搞复杂。大家觉得是不是?
...全文
271 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
万物皆对象 我的理解就是 任何事物存在就会有其存在的状态 比如你说的光线,他具有颜色的实例变量,可能不存在方法,但是也算是对象
yyfhz 2020-03-18
  • 打赏
  • 举报
回复
这是一种习惯问题,不存在谁比谁更优秀,只存在谁比谁能更方便的解决某一问题。对象也好,基本数据也好,都只是描述某一事实的工具。
monk294 2020-03-18
  • 打赏
  • 举报
回复
引用 1 楼 qq_16774199 的回复:
在现实中,看得见摸得着的物体、动物、女朋友可以叫作对象,看不见摸不着的东西比如时间、无线电波、光线也硬是把它们叫作对象,不觉得怪怪的吗?
看不见的东西一样可以看做是对象,好比时间,它可以具有时区、时、分、秒等属性,看你怎么理解了,哪怕小到原子一样可以看作对象
qybao 2020-03-09
  • 打赏
  • 举报
回复
Font.font没有这样的方法,Font.decode
qybao 2020-03-09
  • 打赏
  • 举报
回复
首先,针对最开始的问题,lz觉得这个布局属性应该是怎么样一个内存结构(也就是这个布局属性应该包括什么信息)?是一个字符串还是一个整形就可以?这些信息足够控制布局吗?如果不足够,那是不是需要一个结构体来保存相关的信息(也就是说这个布局本身还需要有属性)?那么属性的属性这样层层嵌套,用什么管理最方便,答案当然是用对象了(也就是说这个布局属性不是一个简单的属性值,是复杂的属性,要使用结构体来管理,这个结构体就是对象)。所以说设置布局只是把控件的布局属性设置成了一个布局对象(这个布局对象管理了布局的相关信息) 第二,对于静态方法,其实Font.font也是返回了一个对象(lz可以去看api的返回值),并不是说用了静态方法就可以避免生成对象,只是把生成对象的细节封装起来,可以避免用户自己new。这就是设计模式的工厂模式,lz有兴趣可以自己谷歌百度一下相关方面的知识。
SilentHunter460 2020-03-09
  • 打赏
  • 举报
回复
引用 3 楼 paullbm 的回复:
按照楼主的意思,别说面向对象了,面向函数也没必要了! 什么类,接口,函数,全都没必要存在!全部放在main函数搞定一切! 我正话反说,不知道楼主明白我想说的重点了吗?
如下两句的效果是一样: text.setFont(Font.font("Times New Roman", 35)); //利用Font类的静态方法,我觉得比较符合我的习惯思维。 text.setFont(new Font("Times New Roman", 35)); //要new一个实例对象来设置字体字号,总觉得小题大作。

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.Font;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;

public class windows extends Application{

	public static void main(String[] args) {
		launch(args);
	}

	@Override
	public void start(Stage mystage)  {
		Text text = new Text("JavaFx");
		//text.setFont(Font.font("Times New Roman", 35));
		text.setFont(new Font("Times New Roman", 35));
		Circle circle = new Circle(100, Color.LIGHTGRAY);
		circle.setStroke(Color.BLACK);
		StackPane stack = new StackPane(circle, text);
		Scene scene = new Scene(stack, 500, 500);
		mystage.setScene(scene);
		mystage.setTitle("JavaFX");
		mystage.show();
	}
}
Mister_X 2020-03-09
  • 打赏
  • 举报
回复
好好看看面向对象以及面向过程,也许会有些许感悟
paullbm 2020-03-09
  • 打赏
  • 举报
回复
按照楼主的意思,别说面向对象了,面向函数也没必要了!
什么类,接口,函数,全都没必要存在!全部放在main函数搞定一切!

我正话反说,不知道楼主明白我想说的重点了吗?
110成成 2020-03-09
  • 打赏
  • 举报
回复
万物皆对象,那不叫对象叫什么?叫基本属性?
qq_39936465 2020-03-09
  • 打赏
  • 举报
回复
java就是像搭积木,可以用很多种方法来实现,但是底层东西还是这些。你看似简单的东西,其实是别人帮你把过程打包好了。
qq_39936465 2020-03-09
  • 打赏
  • 举报
回复
引用 15 楼 qq_16774199 的回复:
java.awt.Font public class Font extends Object implements Serializable javafx.scene.text.Font public final class Font extends Object 从这个来看,两个Font好像完全没有关系啊,各自从Object继承。以及awt的Font多继承了一个接口。
有没有关系要看源码,而且你静态返回值为Font肯定用到的Font实例类型。
SilentHunter460 2020-03-09
  • 打赏
  • 举报
回复
引用 14 楼 qq_39936465 的回复:
这个2个是同名类不同包的类,Font是基础类,JavaFx 中Font是在Font基础类上开发的,底层调用的就是Font,也就是没有原来的Font也就没有你所谓的静态方法,所以没啥可比性。一个是爸爸一个是儿子,没爸爸就没你所谓更方便的儿子。
java.awt.Font public class Font extends Object implements Serializable javafx.scene.text.Font public final class Font extends Object 从这个来看,两个Font好像完全没有关系啊,各自从Object继承。以及awt的Font多继承了一个接口。
qq_39936465 2020-03-09
  • 打赏
  • 举报
回复
引用 10 楼 qq_16774199 的回复:
font这个是Font类的构造法,不是Font方法,请先理解构造法。而且静态方法为Font的类所共有,那么问题就来了,你无法用静态方法来表示不同的字体大小和字体类型。
你好。 JavaFx的Font类确实有一个叫font的方法,而且这个方法有好几个重载。 构造方法我知道,构造方法名字必须和类名一样包括大小写。 如下图: [/quote] 这个2个是同名类不同包的类,Font是基础类,JavaFx 中Font是在Font基础类上开发的,底层调用的就是Font,也就是没有原来的Font也就没有你所谓的静态方法,所以没啥可比性。一个是爸爸一个是儿子,没爸爸就没你所谓更方便的儿子。
qybao 2020-03-09
  • 打赏
  • 举报
回复
这种问题属于case by case,就是具体情况具体分析。你总不能什么类都用静态方法来生成对象吧。
格子z 2020-03-09
  • 打赏
  • 举报
回复
引用 5 楼 qq_16774199 的回复:
[quote=引用 3 楼 paullbm 的回复:] 按照楼主的意思,别说面向对象了,面向函数也没必要了! 什么类,接口,函数,全都没必要存在!全部放在main函数搞定一切! 我正话反说,不知道楼主明白我想说的重点了吗?
如下两句的效果是一样: text.setFont(Font.font("Times New Roman", 35)); //利用Font类的静态方法,我觉得比较符合我的习惯思维。 text.setFont(new Font("Times New Roman", 35)); //要new一个实例对象来设置字体字号,总觉得小题大作。

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.Font;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;

public class windows extends Application{

	public static void main(String[] args) {
		launch(args);
	}

	@Override
	public void start(Stage mystage)  {
		Text text = new Text("JavaFx");
		//text.setFont(Font.font("Times New Roman", 35));
		text.setFont(new Font("Times New Roman", 35));
		Circle circle = new Circle(100, Color.LIGHTGRAY);
		circle.setStroke(Color.BLACK);
		StackPane stack = new StackPane(circle, text);
		Scene scene = new Scene(stack, 500, 500);
		mystage.setScene(scene);
		mystage.setTitle("JavaFX");
		mystage.show();
	}
}
[/quote] new对象和万物皆对象有什么矛盾的呢? 你觉得这种方式麻烦,是因为,当时设计这个模块的时候,更加宽松的耦合性。如果你想只调用setFont而不new Font,都没必要用Font.font这种静态方法,使用少又占资源。可以自己包装一层,你想传什么进去,达到什么效果,都自己写。 对于程序来讲,没有好坏,只有不同场景下的适用程度。 再说题主的疑问,个人角度认为,所谓万物皆对象,是指任何物都有它的描述和行为。光线如果是一个对象,肯定是个接口或者抽象类。有不同的光,一束紫外线就是new出来一个实体,属性可以波长、速度、方向等,行为可以是各种发生的事情。 重点是人用语言去总结万物,所以万物成了对象,而不是,天生对象。
SilentHunter460 2020-03-09
  • 打赏
  • 举报
回复
引用 6 楼 qybao 的回复:
首先,针对最开始的问题,lz觉得这个布局属性应该是怎么样一个内存结构(也就是这个布局属性应该包括什么信息)?是一个字符串还是一个整形就可以?这些信息足够控制布局吗?如果不足够,那是不是需要一个结构体来保存相关的信息(也就是说这个布局本身还需要有属性)?那么属性的属性这样层层嵌套,用什么管理最方便,答案当然是用对象了(也就是说这个布局属性不是一个简单的属性值,是复杂的属性,要使用结构体来管理,这个结构体就是对象)。所以说设置布局只是把控件的布局属性设置成了一个布局对象(这个布局对象管理了布局的相关信息) 第二,对于静态方法,其实Font.font也是返回了一个对象(lz可以去看api的返回值),并不是说用了静态方法就可以避免生成对象,只是把生成对象的细节封装起来,可以避免用户自己new。这就是设计模式的工厂模式,lz有兴趣可以自己谷歌百度一下相关方面的知识。
谢谢回复。 就我这个代码来说,如果是你,你愿意new一个对象,还是用静态方法?
SilentHunter460 2020-03-09
  • 打赏
  • 举报
回复
引用 8 楼 qq_39936465 的回复:
[quote=引用 5 楼 qq_16774199 的回复:] 如下两句的效果是一样: text.setFont(Font.font("Times New Roman", 35)); //利用Font类的静态方法,我觉得比较符合我的习惯思维。 text.setFont(new Font("Times New Roman", 35)); //要new一个实例对象来设置字体字号,总觉得小题大作。 [/code]
font这个是Font类的构造法,不是Font方法,请先理解构造法。而且静态方法为Font的类所共有,那么问题就来了,你无法用静态方法来表示不同的字体大小和字体类型。[/quote] 你好。 JavaFx的Font类确实有一个叫font的方法,而且这个方法有好几个重载。 构造方法我知道,构造方法名字必须和类名一样包括大小写。 如下图:
SilentHunter460 2020-03-09
  • 打赏
  • 举报
回复
引用 7 楼 qybao 的回复:
Font.font没有这样的方法,Font.decode
我是这个javafx.scene.text.Font。 你说的可能是这个java.awt.Font。
qq_39936465 2020-03-09
  • 打赏
  • 举报
回复
引用 5 楼 qq_16774199 的回复:
如下两句的效果是一样: text.setFont(Font.font("Times New Roman", 35)); //利用Font类的静态方法,我觉得比较符合我的习惯思维。 text.setFont(new Font("Times New Roman", 35)); //要new一个实例对象来设置字体字号,总觉得小题大作。 [/code]
font这个是Font类的构造法,不是Font方法,请先理解构造法。而且静态方法为Font的类所共有,那么问题就来了,你无法用静态方法来表示不同的字体大小和字体类型。
SilentHunter460 2020-03-08
  • 打赏
  • 举报
回复
在现实中,看得见摸得着的物体、动物、女朋友可以叫作对象,看不见摸不着的东西比如时间、无线电波、光线也硬是把它们叫作对象,不觉得怪怪的吗?

62,628

社区成员

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

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