当前位置 »威客网 » 新闻中心 »面向对象编程——Java实现函数

面向对象编程——Java实现函数

2017年12月5日来源:bd5029685ef27cfa2be3e91ccdf9a34f威客网小分类:[$-小分类-$]

新闻摘要:虑到大多数看到标题的学生都已经学习了Java,我使用Java来逐步地分析问题,采用面向对象的思想。
面向对象编程——Java实现函数的派生

首先说一点,主要介绍的是面向对象(OO)的思想,顺便说一下,关于函数式编程,而不是教你如何在Java中精确和科学地,以及在派生中的函数。


Def d(f):
Def calc(x):
DxΔx = 0.000001 #说无穷小
返回(f(x + dx)- f(x))/ dx #。
注意,这里引用了外部作用域的变量f
返回calc#这里是返回值的函数(f(f)的导数)
F(x)= x2 + x + 1
F = x:x **2 + x + 1号,在代码中表示二次函数
F1是f的一阶导数。
注意,导数仍然是一个函数
我们算出x的斜率等于3
F1(3)
二阶导数
F2 = d(f1)
首先,我要做一点python代码,我想让你们弄明白代码是什么。
请不要被这段代码吓倒,你不必担心它的语法,只是理解它的推导。

上面的代码引用了“为什么我推荐Python[4]:Python作为一种函数式编程语言,”这个博客是我写文章的主要原因。

博主说:“如果你不使用FP,而不是使用OOP,你如何实现它呢?”
我认为,在OOP中,代码大多是丑陋和难闻的。

我持怀疑态度,所以我尝试用面向对象的Java来尝试,但最后我没有太多代码。
如果您使用Java 8或更高版本,那么代码就更少了。

请考虑一个问题,以及如何用面向对象的方法重写这个程序。
请仔细考虑,并试着编一个程序继续阅读。

考虑到大多数看到标题的学生都已经学习了Java,我使用Java来逐步地分析问题,采用面向对象的思想。



我在文章的开头已经做了一个声明,这不是讨论数学,但是它只是一个例子,用来说明物体的方向。

如果您已经忘记了代码开头的派生,那么回过头来看看python是如何被区别开来的。

我确信,如果你听说过导数,你可以一眼就看出,代码的开头是导数的导数。



代码只无穷小Δx大概算是一个更小的值为0.000001。



/ /自定义函数
公共类函数{
/ /功能:f(x)= 3 x ^ 3 + 2 x ^ 2 + x + 1
公共双f(双x){
返回3乘以x乘以x乘以x加上2乘以x乘以x加上x加1;
}
}
/ / 1函数的导数
公开课DerivedFunction {
/ /表示无穷小Δx
私有静态final double DELTA_X = 0.000001;
/ /函数的导数
私有函数功能。

Public DerivedFunction Function(Function){
封闭函数=函数;
}

/ * *
在点x处求函数的导数
* @param x是这个点的导数
* @返回导数
* /
公共双(双x){
(函数返回。
F(x + DELTA_X)-函数。
F(x))/ DELTA_X;
}
}
公开课主要{
公共静态void main(String[]args){
/ /一阶导数
派生函数的导数=新的DerivedFunction(新函数());
在x = 2处的/ / print函数的导数
系统。
离开。
Println(导数。
(2));
}
}
为了发表一份声明,考虑到博客的长度,我使用了一个不规范的代码注释,我希望你不会被我误导。

我想如果你仔细想想,你至少应该想想。
我不打算解释代码,但是我只是在文章的开始用Java重写了python代码并做了简单的翻译工作。
请考虑上述代码。

在开始的时候,我想到了构建一个名为Function的类,并使用了一个名为f的方法。
但是考虑到每次你要求一个新的函数导数时,你必须改变这个f方法的实现,它显然不利于扩展,这违反了开放和封闭的原则。

据估计,一些学生没有听说过这个词,我将解释:“对象(类、模块、函数等)应该对扩展开放,但对修改关闭。”

所以我没有把它写下来,但是当我写这个博客给你一种直觉的时候,我就这么做了。

考虑重构代码以解决可伸缩性问题。



一个初步的想法
 
估计研究面向对象的社会认为改变函数类的接口或抽象类,每次添加一个新函数之后只是重写接口或抽象类f的方法,这是面向接口编程,依赖倒置原则,下面的代码就是这么做的。

再一次,考虑到页面的长度,我将把代码留在前面的代码中,在那里我不理解它,并在一个想法中看到代码。

/ /美元函数
公共接口函数{
双f(x)两倍;
}
/ /自定义函数
公共类MyFunction实现函数{
@覆盖
公共双f(双x){
返回3乘以x乘以x乘以x加上2乘以x乘以x加上x加1;
}
}
公开课DerivedFunction {
私有静态final double DELTA_X = 0.000001;
私有函数功能。

Public DerivedFunction Function(Function){
封闭函数=函数;
}

公共双(双x){
(函数返回。
F(x + DELTA_X)-函数。
F(x))/ DELTA_X;
}
}
公开课主要{
公共静态void main(String[]args){
/ /派生功能:f(x)= 9 x ^ 2 + 4 x + 1
派生函数的导数= new DerivedFunction(新MyFunction());
系统。
离开。
Println(导数。
(2));
}
}
我喜欢看到学生们可能发现一个严重的问题,我的翻译没有达到指定的位置,python代码的开始也很容易找到二阶导数函数的导数(导数),代码和我不能。

事实上,只要稍微修改一下上面的代码就可以很容易地实现二阶导数,请思考一下。



这个想法之后



当我写上面的代码时,我觉得它完全是消极的,“对OOP的衍生工具,大部分是丑陋和臭的”。
但我不能求二阶导数,我有点不情愿。

我要把它写出来,我要把它写成关于一阶导数和二阶导数的定义,我想要考虑这两种东西之间的区别和联系,我把导数函数看作是一个函数。

DerivedFunction的get方法与函数f方法参数和返回值相同,而DerivedFunction可以实现函数接口,产生如下代码。

公共接口函数{
双f(x)两倍;
}
Public类DerivedFunction实现函数{
私有静态final double DELTA_X = 0.000001;
私有函数功能。

Public DerivedFunction Function(Function){
封闭函数=函数;
}

@覆盖
公共双f(双x){
(函数返回。
F(x + DELTA_X)-函数。
F(x))/ DELTA_X;
}
}
公开课主要{
公共静态void main(String[]args){
函数f1 = new DerivedFunction(新函数(){)
@覆盖
公共双f(双x){
返回3乘以x乘以x乘以x加上2乘以x乘以x加上x加1;
}
});
系统。
离开。
Println(f1)f(2));
/ /二阶导函数:f (x)= 18x + 4
函数f2 = new DerivedFunction(f1);
/ /打印函数f(x)= 3 x ^ 3 + 2 x ^ 2 + x + 1 x = 2的二阶导数
系统。
离开。
Println(f2)f(2));
}
}
考虑到有些人还没有学习Java 8或以上的知识,上面的代码并没有使用java8函数式编程的新特性。

如果您已经接触过Java 8,请考虑如何重写上面的代码以使它更简洁。



过去认为



Public类DerivedFunction实现函数< Double,Double > {
私有静态final double DELTA_X = 0.000001;
Private Function(Double,Double > Function;

Public DerivedFunction(函数< Double,Double >函数){
封闭函数=函数;
}

@覆盖
公共双应用(双x){
(函数返回。
应用(x + DELTA_X)-函数。
应用(x))/ DELTA_X;
}
}
公开课主要{
公共静态void main(String[]args){
在x = 2处的/ / print函数的二阶导数
新的DerivedFunction(新的DerivedFunction(x -> 3 * x * x + 2 * x + 1))。
}
}
以前的思想被用来扩展函数接口,使用外部类、匿名类或内部类。

你应该对物体方向有更直观的理解。
在面向对象编程中,所有对象和抽象概念都是类。
基本特性包括封装、继承和多态性,您可以返回到my
在我第一次学习Java的时候,我现在只能想到这么多了。
如果你有更好的想法或感觉我有问题,请发表意见,我希望你能给我建议。

这是我的第一个科技博客,我希望我能说清楚。
如果它对你有帮助,请给我一个帮助或评论,给我继续工作的动力。