十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
从语言语法与原理上来讲,如出一辙,都是继承自C的风格,初学者一看到代码段就知道结构,但是未必认识关键字。
成都创新互联公司主营南木林网站建设的网络公司,主营网站建设方案,成都App制作,南木林h5小程序开发搭建,南木林网站营销推广欢迎南木林等地区企业咨询
因为从开发环境、框架上来讲,天壤之别,微软与SUN的开发环境不会融会贯通的,不敌对就不错了。C#所寄宿的Visaul Studio比起JAVA的MyEclpipse要好用得多,在国内,很多企业为了推销自己的产品过分鼓吹C#好或者Java好,其实都是主观的。
对产品用户来说,他们的好坏不在于使用C#开发还是JAVA开发,而是开发的是否合理。JAVA所谓的跨平台也是有条件的,要虚拟机。至于WEB项目,任何开发环境制作的WEB他都是跨平台的,这只和浏览器有关系,其实SUN和Microsoft都是做了一样的事情,JAVA用虚拟机,C#用Framework。
从开发难度来讲C#并不是比Java简单,而是比JAVA设计得好,你看下VS多么清晰好用,再去看下MyEclipse多凌乱,N多错误和翻墙下载链接。而且比较滑稽的是SUM鼓吹开源却到处都要Lisence,VS被说成高收费却网上大把下载终身免费。
从资源来讲,java有个宝库,实际上大部分公司还沉浸在java大潮里,像google、facebook比较牛的公司提供的技术支持偏向JAVA,使得java在网络编程中地位显著,C#反而像个毛头小子,框架很少,特别是手机框架。比如Android Studio,就要求JAVA功底,与微软背道而驰,微软wphone也做的可以,可是市场差劲,这个就是两者生存环境区别,C#比较生不逢时,处处得让着老大。
C#其实比JAVA好用,但程序员真心便宜,我打个比方:
我建立一个OA,导航和菜单按照JAVA的一贯做法是用Jquery+CSS控制滑动,整个布局下来,这种代码你废寝忘食去思考计算写出来至少要一天。高手见怪,反正我要,除非你到网上去下载个现成的一改动再使用,那就肯定快了,JAVA程序员伸手党其实不少。C#来编写就不一样了,比Java的AddControl功能更灵活,比如我要动态出现一排按钮
Java和C#都是编程的语言,它们是两个不同方向的两种语言
相同点:
他们都是面向对象的语言,也就是说,它们都能实现面向对象的思想(封装,继承,多态)
区别:
1.c#中的命名空间是namespace类似于Java中的package(包),在Java中导入包用import而c#中用using。
2.c#和Java都是从main函数入口的,但是c#中的main函数的首字母必须大写,它有四种写法如下:
static void Main(string args[]){}
static int Main(string args[]){}
static void Main(){}
static void Main(){}
而Java中只有一种形式:static void main(String [] args){}
3.数据类型:Java跟c#基本都差不多,但是Java的String类型的首字母必须大写,而c#中可以小写也可以大写,还有布尔型,Java中是boolean,c#中是bool。
4.变量的命名:Java中可以用$符号,而c#中不可以使用。
5.注释:Java比c#少一种"///"的文档注释。
6.输出:c#有三种方式输出:Cosole.WriteLine(); Cosole.WriteLine(要输出的值); Cosole.WriteLine("格式字符串",变量列表); 前两种的用法与Java中的ystem.out.println()方法的用法相同,第三种方式是根据占位符输出的,比Java更方便了。
7.控制流语句:c#跟Java类似,还有c#中的switch如果case后面有内容必须要有break;Java可以没有break;
8.数组:两种语言的声明都是用new关键字的。都可以在创建数组的同时初始化如:int a[]={1,2,3,5,5};但是c#比Java多两种初始化如:int a[]=new int[3]{1,2,3}; int a[]=new int[]{1,2,3};
9.方法中传递的参数:两种语言都使用值传递与引用传递。
C#的引用传递的关键字是ref与out,ref侧重于修改,out侧重于输出。而Java中都以传值方式;
10.访问修饰符:C#中的访问修饰符与Java中的基本对应,但多出了一个internal。简而言之,C#有5种类型的可访问性,如下所示:
public:成员可以从任何代码访问。 protected:成员只能从派生类访问。
internal:成员只能从同一程序集的内部访问。
protected:成员只能从同一程序集内的派生类访问。
private:成员只能在当前类的内部访问。
11.由于C#中不存在final关键词,如果想要某个类不再被派生,你可以使用sealed关键词密封。
12.集合:两种语言都有集合ArrayList,还有通过键访问值的Java中是HashMap而c#中是HashTable。c#比Java多泛型集合ListT与DictionaryK,V更容易了,无需拆箱装箱了,更安全了。
13.继承:Java中用关键字extends,c#只用":"就行了.调用父类的构造方法Java用super关键字,而c#用base关键字。
14.多态:抽象类和抽象方法两种语言都用abstract关键字。Java中另外一个类如果继承了它,实现直接重写此方法就可以了;而c#必须加上关键字override实现。C#还比Java多一种虚方法来实现多态。
15.接口:都用关键字interface定义,Java实现用关键字implements;c#用":"实现。在C#中,接口内的所有方法默认都是公用方法。在Java中,方法声明可以带有public修饰符(即使这并非必要),但在C#中,显式为接口的方法指定public修饰符是非法的。
16.C#中的is操作符与Java中的instanceof操作符一样,两者都可以用来测试某个对象的实例是否属于特定的类型。在Java中没有与C#中的as操作符等价的操作符。as操作符与is操作符非常相似,但它更富有"进取心":如果类型正确的话,as操作符会尝试把被测试的对象引用转换成目标类型;否则,它把变量引用设置成null。
17.枚举器即enum类型(java无),把它作为一个变量值的类型使用,从而把变量可能的取值范围限制为枚举器中出现的值。
18.结构(Struct)与类很相似,而结构是一种值类型,它存储在栈中或者是嵌入式的,结构可以实现接口,可以象类一样拥有成员,但结构不支持继承。
19.c#保留了指针。Unsafe。(C#使用指针不安全,最后这条有待考证)
有 4 个 java 文件,分别是 Shape.java,Square.java,Circle.java,ShapeTest.java。其内容如下:
Shape.java
package graphics;
interface class Shape {
double getArea();
double getPerimeter();
}
Square.java:
package graphics;
public class Square implements Shape {
private double x;
private double y;
private double width;
private double height;
public Square(double x, double y, double width, double height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
public Square(double x0, double y0, double x1, double y1) {
double xmin = x0 x1 ? x1 : x0;
double ymin = y0 y1 ? y1 : y0;
this.x = xmin;
this.y = ymin;
this.width = x0 + x1 - 2*xmin;
this.height = y0 + y1 - 2*ymin;
}
@Override
public double getArea() {
return this.width * this.height;
}
@Override
public double getPerimeter() {
return 2 * (this.width + this.height);
}
}
滑稽的回答:敲代码太苦逼,但是看别人苦逼敲代码不会
正经点:实施比较偏实地沟通及作为需求方跟程序员中间的桥梁,可以偏向发展自己的沟通能力,实地了解需求方的实际所求,让自己可以多方位了解需求,以后也可以往产品经理的方向进行努力和发展等
emm...问题...不少。
1、这个构造函数问题就很大:
你传递一个r数组进来,然后你又让this.v1=v1,this.v2=v2,那么这个r的意义到底是什么?你构造出来的这个向量的v1和v2也还是根本没有任何值。
2、这。。这块问题太多了,我都不知道该怎么说,就全都不应该这么玩,下面加法也是一样的我就不圈出来了。
首先,非常不建议用null来声明任何变量,你声明r[]数组为null,下面又在循环里使用r[i],r都不是一个东西(因为它是null,还真不是个东西 手动滑稽),r[i]必然导致万恶的空指针异常NullPointerException。然后前面第一点说了,你的v1和v2根本就没有值,其实他们也是null,所以v1.length也将产生空指针异常,你的for循环根本没法进行。好,就算假设你的v1和v2都声明为new double[0]了,他们不再是null了,那么你的这个方法最终有可能返回null,又来了又来了,不要随便使用null,一不小心可能导致你main方法中调用这个方法后再次造成空指针异常。所以你非要这样写的话也建议写成return new double[0];这样即使它是一个空的数组但最起码它已经是个对象了,不再是null了。
3、main方法中null又双叒来了:
null数组不能放任何东西进去,不然将导致空指针异常。
所以现在怎么办?我估计你也发现了,因为你不知道这个数组究竟有多少个数字所以无法准确地定义这个r的长度。
本来我认为最优的做法是利用java的几种数据结构来保存输入项就好了,但是我怕你还没学到,其中这几个数据结构都不需要指定长度就能保存数据,他们能保存的最大数据量为int的最大值:java.util.List(java的集合,特别好用)、java.util.Vector(没错,java本来就有向量这种数据结构,比你这个MyVector功能要多一些)、java.util.Stack(栈其实是继承了向量,是一种特殊的向量)、java.util.Queue(java的队列),常用的就这些。
另外一种方法就是指定r[]数组有一个较大的length,也就是一开始就声明的足够大,比如直接double[] r = new double[999]但是这种是非常不好的办法,一个是如果你最终只存储两三个数字,那么数组空间就浪费太多了,另外是如果超过了999个数字,又会导致数组溢出。
所有我下面采用了第三种直截了当的方法帮你改进为,一开始你要输入向量的长度,你要说明向量到底有多长,这样不就能准确地定义r[]数组了吗?look:
这样就稳得一批了。
4、再看你main方法的最后:
你这种设计方法根本没有体现出两个向量之间的运算关系啊,根本就是只有一个向量在这里。因此,你的运算函数应该修改为传入一个新的向量,也就是这样:
这样的话,main函数里就可以这样了:
看到没,是不是一眼就能看出是向量1和向量2相加、点积?
5、审题!审题!你的toString()方法呐?结果保留两位小数呐?see:
另外题目里还说要定义一个int n的成员变量表示维度。我没太明白这个维度是啥?这不就是一维向量吗?维度不就是1吗?
综上所述,代码被我整体修改为:
public class MyVector {
private double[] array;
private int n = 1;
public MyVector(double[] array) {
this.array = array;
}
public double[] getArray() {
return this.array;
}
public double[] MyVectorDott(MyVector myVector2) {
double[] array2 = myVector2.getArray();
double[] result = new double[this.array.length];
for (int i = 0; i this.array.length; i++) {
result[i] = this.array[i] * array2[i];
}
return result;
}
public double[] MyVectorAdd(MyVector myVector2) {
double[] array2 = myVector2.getArray();
double[] result = new double[this.array.length];
for (int i = 0; i this.array.length; i++) {
result[i] = this.array[i] + array2[i];
}
return result;
}
public String toString() {
String s = "(";
for (int i = 0; i this.array.length; i++) {
if (i this.array.length - 1) {
s += String.format("%.2f", this.array[i]) + ",";
} else {
s += String.format("%.2f", this.array[i]);
}
}
return s + ")";
}
public static void main(String[] args) {
System.out.print("请输入向量长度:");
Scanner input = new Scanner(System.in);
int length = input.nextInt();
double[] array1 = new double[length];
double[] array2 = new double[length];
System.out.print("请输入第一组向量值:");
input = new Scanner(System.in);
for (int i = 0; i length; i++) {
array1[i] = input.nextDouble();
}
System.out.print("请输入第二组向量值:");
input = new Scanner(System.in);
for (int i = 0; i length; i++) {
array2[i] = input.nextDouble();
}
input.close();
MyVector myVector1 = new MyVector(array1);
System.out.println("向量1为:");
System.out.println(myVector1.toString());
System.out.println("向量2为:");
MyVector myVector2 = new MyVector(array2);
System.out.println(myVector2.toString());
MyVector myVector3 = new MyVector(myVector1.MyVectorAdd(myVector2));
System.out.println("向量1与向量2求和为:");
System.out.println(myVector3.toString());
System.out.println("向量1与向量2点积为:");
MyVector myVector4 = new MyVector(myVector1.MyVectorDott(myVector2));
System.out.println(myVector4.toString());
}
}
运行结果:
代码老是会挤在一起,你自己整理一下