Board logo

标题: java编程思想有一个例子没看懂,求指点。。。 [打印本页]

作者: shixn    时间: 2017-7-6 09:48     标题: java编程思想有一个例子没看懂,求指点。。。

posted by wap, platform: Android
就是这段代码

不明白DirFilter类的accept()是怎么被调用的?

书上说是list()可以回调accept(),没看懂是什么原理。。。
作者: 总是注册不成功    时间: 2017-7-6 09:56

posted by wap, platform: 小米5
accept是FilenameFilter接口定义的一个方法,DirFilter类实现了FilenameFilter接口,当它的实例被传给path.list方法时,accept方法会被调用多次。
你书看得太快了,还是从头看起吧,基础打稳先。
作者: yfl2    时间: 2017-7-6 10:00

posted by wap, platform: Android
是File类的list方法
作者: shixn    时间: 2017-7-6 10:13

posted by wap, platform: Android
引用:
原帖由 @总是注册不成功  于 2017-7-6 09:56 发表
accept是FilenameFilter接口定义的一个方法,DirFilter类实现了FilenameFilter接口,当它的实例被传给path.list方法时,accept方法会被调用多次。
你书看得太快了,还是从头看起吧,基础打稳先。
就是说自动调用?

刚才又翻了翻接口那一章。。还是没理解。。
作者: shixn    时间: 2017-7-6 10:20

posted by wap, platform: Android
引用:
原帖由 @yfl2  于 2017-7-6 10:00 发表
是File类的list方法
list方法会去调用accept?

这部分代码是封装好的没显示出来?
作者: 安卓爱好者    时间: 2017-7-6 10:27

posted by wap, platform: iPhone
你的目的是打印某个目录下符合某命名规则的文件或目录。

public String[] list(FilenameFilter filter)
这个函数返回指定目录下,符合Filter的文件或文件夹的名字。

然后你定义了一个DirFilter,这个类实现了filter的API accept()。那你这个accept当然会被执行咯。
作者: 总是注册不成功    时间: 2017-7-6 10:28

posted by wap, platform: 小米5
很简单的道理,你把它传给path.list方法,path.list肯定要调它的方法啊,要不然有什么用?至于怎么调,java源代码都有,想看进去看就是了。
作者: 安卓爱好者    时间: 2017-7-6 10:30

posted by wap, platform: iPhone
public String[] list(FilenameFilter filter)

会对这么目录下的每一个文件都用Accept()进行检测,满足则放入数组输出。
作者: cf3b5    时间: 2017-7-6 10:36

File类就好像一个施工队,施工队里头有流程是筛沙(accept),原来有专人干这事,而且干这事需要有筛沙证(接口)!
现在有个新项目,要求有新的筛沙工艺,所以包工头(码农,就是你),找了个新人回来,名字叫DirFilter,你先让他考个筛沙证(继承接口),并让他学会新的筛沙工艺(实现accept方法),最后你把新人换掉原本的那个筛沙的哥们(path.list(new DirFilter()))
这样干活的时候,前一个环节的哥们把粗沙丢给这个新人,然后对他吼“筛沙”(调用accept),负责筛沙的新人就老老实实的按照他学的筛沙工艺筛沙,筛完的沙给下一个工人(return)……
这里头最大的优点就是,其实包工头也不需要知道施工流程究竟是怎样的,反正他知道,只要找个有筛沙证的哥们,并且告诉他新的筛沙工艺(实现accept),这包工队就会像以前那样工作!
其实面向对象开发里头,处处都是这种结构,简单来说,为什么要面向对象开发,要的就是这个目的!


[ 本帖最后由 cf3b5 于 2017-7-6 10:45 编辑 ]
作者: yfl2    时间: 2017-7-6 10:38

posted by wap, platform: Android
引用:
原帖由 @shixn  于 2017-7-6 10:20 发表
list方法会去调用accept?

这部分代码是封装好的没显示出来?
你直接拿File来用,哪里来的代码?
作者: shixn    时间: 2017-7-6 10:51

posted by wap, platform: Android
File类难道不是java封装好的吗?!
import java.io.*了啊

list()方法不就类似于C语言的fopen(),fclose()之类的,我给他传参,不用关心内部实现。。。是这意思吧。。。?

只不过list()函数接收一个接口对象,然后内部调用接口对象的accept(),至于具体怎么调用,不必关心,是这意思吧。。。
作者: yfl2    时间: 2017-7-6 10:54

posted by wap, platform: Android
你可以关心,看它怎么调用的accept,这个过程本身的原理有啥疑问?

本帖最后由 yfl2 于 2017-7-6 10:55 通过手机版编辑
作者: cf3b5    时间: 2017-7-6 10:56

引用:
原帖由 shixn 于 2017-7-6 10:20 发表
posted by wap, platform: Android
list方法会去调用accept?

这部分代码是封装好的没显示出来?
确实不用显示,accept这本来就是file类里头的细节,你通过文档了解到有这个环节就行了,细节不用去关心!
实话说我觉得要学好OO,首先就要习惯不要每个环节都去挖代码,本来oo目的就是为了封装之后屏蔽这些细节的,要养成抽象的去思考问题
本来一个项目随随便便几十万上百万的代码,没这个抽象的概念,老是去挖代码,还搞个P啊……

作者: 土豆茄子    时间: 2017-7-6 10:56

引用:
原帖由 cf3b5 于 2017-7-6 10:36 发表
File类就好像一个施工队,施工队里头有流程是筛沙(accept),原来有专人干这事,而且干这事需要有筛沙证(接口)!
现在有个新项目,要求有新的筛沙工艺,所以包工头(码农,就是你),找了个新人回来,名字叫DirF ...
挺有意思
作者: hourousha    时间: 2017-7-6 11:13

简而言之,LZ不但需要搞清楚接口的定义,同时也要搞清楚接口这东西诞生的目的和使用原则。
作者: shixn    时间: 2017-7-6 11:19

posted by wap, platform: Android
引用:
原帖由 @yfl2  于 2017-7-6 10:54 发表
你可以关心,看它怎么调用的accept,这个过程本身的原理有啥疑问?

本帖最后由 yfl2 于 201776 10:55 通过手机版编辑
明白了。。。

因为书上没有直接写list函数到原型,且后面的文字提到了“回调”,然后又去找回调相关的概念,看的一头雾水

其实归根到底就是不知道list()内部调用了accept()而已。。。
作者: shixn    时间: 2017-7-6 11:46

posted by wap, platform: Android
引用:
原帖由 @cf3b5  于 2017-7-6 10:36 发表
File类就好像一个施工队,施工队里头有流程是筛沙(accept),原来有专人干这事,而且干这事需要有筛沙证(接口)!
现在有个新项目,要求有新的筛沙工艺,所以包工头(码农,就是你),找了个新人回来,名字叫DirFilter,你先让他考个筛沙证(继承接口),并让他学会新的筛沙工艺(实现accept方法),最后你把新人换掉原本的那个筛沙的哥们(path.list(new DirFilter()))
这样干活的时候,前一个环节的哥们把粗沙丢给这个新人,然后对他吼“筛沙”(调用accept),负责筛沙的新人就老老实实的按照他学的筛沙工艺筛沙,筛完的沙给下一个工人(return)……
这里头最大的优点就是,其实包工头也不需要知道施工流程究竟是怎样的,反正他知道,只要找个有筛沙证的哥们,并且告诉他新的筛沙工艺(实现accept),这包工队就会像以前那样工作!
其实面向对象开发里头,处处都是这种结构,简单来说,为什么要面向对象开发,要的就是这个目的!
这个意思我倒是能明白,但是自己设计的时候往往不太会写,想不到应该这么用。。。

还要多练习
作者: jjx01    时间: 2017-7-6 11:50

虚拟内存的职业素养还是不错的
作者: yfl2    时间: 2017-7-6 11:52

posted by wap, platform: Android
引用:
原帖由 @shixn  于 2017-7-6 11:19 发表
明白了。。。

因为书上没有直接写list函数到原型,且后面的文字提到了“回调”,然后又去找回调相关的概念,看的一头雾水

其实归根到底就是不知道list()内部调用了accept()而已。。。
所有我觉得莫名其妙,书上有没有让你定义File而是直接引用,你当然不可能看到list中的代码,你会奇怪为什么没有看到String的代码吗
作者: shixn    时间: 2017-7-6 12:28

posted by wap, platform: Android
之前用cpp和CS

string这种比较熟了,不用说也知道是java封装的

File只知道一些基本的,list第一次见。。其实只要多介绍一句也就明白了。。。而且后面的“回调”真的有点误导我了。。。(其实我现在也不太明白java的回调,java貌似没有委托,回头再琢磨吧)
作者: yzh    时间: 2017-7-6 13:45

觉得很复杂是吗?放弃java吧骚年,投入php怀抱吧,拥抱世界上最好的语言:D
作者: hourousha    时间: 2017-7-6 13:50

引用:
原帖由 shixn 于 2017-7-6 12:28 发表
posted by wap, platform: Android
之前用cpp和CS
string这种比较熟了,不用说也知道是java封装的
File只知道一些基本的,list第一次见。。其实只要多介绍一句也就明白了。。。而且后面的“回调”真的有点误导 ...
说实话,您问的和File类本身没多大关系,而和OOP的基础知识有关。C#自不用说,plain c++里虽然没有显式的interface,但可以用全是纯虚函数的抽象类替代。所以恕我直言,您可能需要加强一下OOP的理解。比如基类继承和接口使用原则之类的基础概念。

java和c#语法有类似但也有不同。java没有委托,一般通过传入实现interface的类实例等方式来进行诸如回调等操作,在语法上可以使用local class/anonymous class来简化程序编写(类似c#里的匿名方法或lambda表达式)。所以从这个角度讲,java对interface的使用也许比c#更频繁一些。

[ 本帖最后由 hourousha 于 2017-7-6 17:11 编辑 ]
作者: cf3b5    时间: 2017-7-6 13:50

posted by wap, platform: iPhone
引用:
原帖由 @yzh  于 2017-7-6 13:45 发表
觉得很复杂是吗?放弃java吧骚年,投入php怀抱吧,拥抱世界上最好的语言:D
任何语言都要懂这个!
作者: jun4rui    时间: 2017-7-6 13:53

posted by wap, platform: Chrome
这本书虽然还有点用,但是真不如看现在的很多在线教程,我国的网络教育确实突飞猛进,很多概念都吃得很透了,而且理论结合实际,我觉得很不错。这本书你在十年前看用来入门还行,现在看可能感觉懂了,实际上动手就觉得不行了,有点像20年前的谭浩强系列
作者: hourousha    时间: 2017-7-6 13:56

引用:
原帖由 jun4rui 于 2017-7-6 13:53 发表
posted by wap, platform: Chrome
这本书虽然还有点用,但是真不如看现在的很多在线教程,我国的网络教育确实突飞猛进,很多概念都吃得很透了,而且理论结合实际,我觉得很不错。这本书你在十年前看用来入门还行,现 ...
比谭浩强之流还是强的,起码不会出什么‘数组名就是指针’这种错误。
作者: shixn    时间: 2017-7-6 14:01

posted by wap, platform: Android
引用:
原帖由 @hourousha  于 2017-7-6 13:50 发表
说实话,您问的和File类本身没多大关系,而和OOP的基础知识有关。C#自不用说,plain c++里虽然没有显式的interface,但可以用全是纯虚函数的抽象类替代。所以恕我直言,您可能需要加强一下OOP的理解。比如基类继承和接口使用原则之类的基础概念。

java和c#语法有类似但也有不同。java没有委托,使用interface之类的来进行回调,此时可以使用local class来简化程序编写(类似c#里的匿名方法或lambda表达式)。所以从这个角度讲,java对interface的使用也许比c#更多一些。
没事,慢慢来。。

工作中写代码纯粹是当计算器用,几乎用不到oop。。。
作者: shixn    时间: 2017-7-6 14:03

posted by wap, platform: Android
其实我都不敢说自己会编程,充其量就是会写点代码。。。
作者: cf3b5    时间: 2017-7-6 14:06

posted by wap, platform: iPhone
引用:
原帖由 @shixn  于 2017-7-6 14:03 发表
其实我都不敢说自己会编程,充其量就是会写点代码。。。
你也不用太谦虚,我见过不少在这行干了3,5年的照样不懂这些!纯粹就是拼代码…
作者: 安卓爱好者    时间: 2017-7-6 15:20

posted by wap, platform: iPhone
引用:
原帖由 @shixn  于 2017-7-6 12:28 发表
之前用cpp和CS

string这种比较熟了,不用说也知道是java封装的

File只知道一些基本的,list第一次见。。其实只要多介绍一句也就明白了。。。而且后面的“回调”真的有点误导我了。。。(其实我现在也不太明白java的回调,java貌似没有委托,回头再琢磨吧)
你可以认为Java的Interface里的每一个方法声明就是C里的函数指针。
你写一个Class实现这个Interface就是让这个函数指针指向函数实体。
作者: 安卓爱好者    时间: 2017-7-6 15:23

posted by wap, platform: iPhone
当你了解到Java的强大后你就知道安卓虚拟机是多么牛逼了,加油~
作者: zy450    时间: 2017-7-6 15:27

现在在转行学java后端,感觉框架根本学不完,而且技术淘汰更新还快。。。

请教各位大佬,编程应该怎么学?最好的方法就是多写代码吗?
作者: EraserKing    时间: 2017-7-6 15:28

接口已经有人讲清楚了
真正意义上的回调不是你说的那个东西 回调是一个专有名词 Callback

比方说你去买书,发现书店里书还没到,然后你告诉老板书到了打我电话!
打我电话这事就是一个回调
一般就是告诉别的程序/函数/其它什么东西一个函数/功能之类的,要求对方在(指定的条件下)调用这个功能……
作者: 蓝蓝的天    时间: 2017-7-6 15:42

引用:
原帖由 jun4rui 于 2017-7-6 13:53 发表
posted by wap, platform: Chrome
这本书虽然还有点用,但是真不如看现在的很多在线教程,我国的网络教育确实突飞猛进,很多概念都吃得很透了,而且理论结合实际,我觉得很不错。这本书你在十年前看用来入门还行,现 ...
这本书其实适合工作了一两年了再拿来看,不是为了单纯的入门,而是为了增强对java的认识。
作者: cf3b5    时间: 2017-7-6 15:52

引用:
原帖由 zy450 于 2017-7-6 15:27 发表
现在在转行学java后端,感觉框架根本学不完,而且技术淘汰更新还快。。。

请教各位大佬,编程应该怎么学?最好的方法就是多写代码吗?
框架其实都是差不多的,特性细节有差别而已,真正理解了一个框架,其它的框架很快就会了!
其实我觉得写程序关键是要习惯抽象思维,想问题要学会从上至下,从大至小的想问题,俗话说面向接口编程!
还有要习惯不要老去扒细节,一个框架动不动就是几十万上百万行代码,你扒细节扒到何年何月去了!
一旦习惯了这种模式,你会发现,无论是自己写的代码,还是看别人的代码,编写和学习效率都是杠杠的
因为这行专业的大家都是差不多这样子思考的,大家的思路一对头,看两下就知道别人写的是什么,为什么要这么写,自己该怎么用了!
我见过很多开发,很多都是一上来就喜欢扒细节,需求一讲完就开始写实现代码,按都按不住!
新人还好,你讲他还听,慢慢他有感觉了他就知道你说的没错!
最怕就是有些在别的地方干了3、5年的所谓高级开发,TMD你和他说他还和你怼,最后无论是质量还是效率都TMD一塌糊涂,还以为自己很牛逼似的……

作者: jun4rui    时间: 2017-7-6 17:00

posted by wap, platform: Chrome
引用:
原帖由 @蓝蓝的天  于 2017-7-5 19:42 发表
这本书其实适合工作了一两年了再拿来看,不是为了单纯的入门,而是为了增强对java的认识。
现在啥情况不知道,当年我好想是看的初版还是第二版入门的,我那个时候要想找点中文的面向对象入门有名的书也就这本了。

现在面向对象都不会就能玩java了?
作者: BlackGod    时间: 2017-7-6 17:22

posted by wap, platform: Chrome
这是接口的典型使用场景 并不是callback……
list方法接收filter接口参数 然后你传入一个实现了filter接口的类 最后在运行时绑定到真正的实现类上
内在思想就是解耦
作者: cc0128    时间: 2017-7-6 18:07

posted by wap, platform: Chrome
java在语法上挺sb的.这几年才有lambda..
这种接口就一个method挺扯淡的.

本帖最后由 cc0128 于 2017-7-6 18:09 通过手机版编辑
作者: cf3b5    时间: 2017-7-6 18:25

引用:
原帖由 cc0128 于 2017-7-6 18:07 发表
posted by wap, platform: Chrome
java在语法上挺sb的.这几年才有lambda..
这种接口就一个method挺扯淡的.

本帖最后由 cc0128 于 2017-7-6 18:09 通过手机版编辑  
其实你不能说他SB,java优点也就在SB上,要知道工业化的语言其实SB一点有好处,毕竟一大帮人一起开发,太灵活了其实就是坑的开始……
这几年火起来的语言,我多少有点感觉是个人英雄主义的味道,基本是几个人一个小团队就能搭一个大架子这种,所以很多地方要多灵活有多灵活,省事最关键!
其实我觉得java确实有点老了,但是特别大的项目来说还是他比较合适。
作者: hourousha    时间: 2017-7-6 20:25

引用:
原帖由 cf3b5 于 2017-7-6 18:25 发表

其实你不能说他SB,java优点也就在SB上,要知道工业化的语言其实SB一点有好处,毕竟一大帮人一起开发,太灵活了其实就是坑的开始……
这几年火起来的语言,我多少有点感觉是个人英雄主义的味道,基本是几个人一个 ...
有些问题确实是由于语言产生比较老而产生的遗留性问题。
但比如java的半吊子泛型,怎么说也谈不上老,出来也就十来年而已,这只能说是设计者打一开始就没想好。
作者: asac    时间: 2017-7-6 21:13

引用:
原帖由 cc0128 于 2017-7-6 18:07 发表
posted by wap, platform: Chrome
java在语法上挺sb的.这几年才有lambda..
这种接口就一个method挺扯淡的.

本帖最后由 cc0128 于 2017-7-6 18:09 通过手机版编辑  
函数式接口
java8的lambda表达式有用武之地
作者: 000月    时间: 2017-7-7 17:42

这是多态啊,楼主搜点向上转型相关的例子,多看看就懂了




欢迎光临 TGFC Lifestyle (http://club.tgfcer.com/) Powered by Discuz! 6.0.0