java语法
1. java语句/语法解释
1 我所接触过的编程语言,基本都可以把字符串作为参数传入吧?(或者是字符数组),其实就是传值
2 这里"156".xxx属于特殊写法,java虚拟机会自动给一个独立字符串new一个String对象,然后实际上是类似于 String abc = new String("156"); abc.xxx,相当于这两步
2. java基础语法都有哪些
数据类型
语法结构:顺序 分支 循环
面向对象
数组 集合 异常 API
3. java语法基础,具体内容
Java基础——Java开发前奏
Java的特点
Java最主要的特点是:一次编译,到处运行(WriteOnce,RunAnywhere.)。
原理:Java源程序经编译后生成.class字节码文件,.class文件由Java虚拟机(JVM)解释执行。不同的操作系统下,只要有相应的Java字节码解释程序,.class文件就能够运行,这是Java跨平台性的根本。c和java编程与执行的过程如下图所示:
Java的内涵
1、是一种编程语言
2、是一套开发工具
3、是一个运行环境
Java应用平台
1、J2EE()——用于企业级应用程序的开发
2、J2SE(Java2PlatformStandardEdition)——用于普通标准应用程序的开发
3、J2ME(Java2PlatformMicroEdition)——用于小型消费类电子产品或嵌入式系统的开发
J2SE包括4部分——JVM、JRE、JDK与Java语言。
环境变量的设置
环境变量——在操作系统中定义的变量,可供操作系统上所有的应用程序使用。
1、查看环境变量
a.命令提示行:环境变量的命令——set(环境变量名)
b.窗口方式:我的电脑->属性->高级->环境变量
2、设置path环境变量
path环境变量的作用:设置操作系统寻找和执行应用程序的路径。
JAVA_HOME:C:ProgramFilesJavajdk1.6.0_14
path:%JAVA_HOME%in;%JAVA_HOME%jrein
3、设置classpath环境变量
classpath环境变量的作用:让Java执行环境找到指定的java程序(.class文件)。
classpath:.;%JAVA_HOME%libdt.jar;%JAVA_HOME%lib ools.jar
注意:a.%JAVA_HOME%前面有“.;”,“.”表示当前目录,两个路径之间用“;”隔开。
b.设置classpath的路径中不能有空格,也不能有中文字符。
JVM的运行过程
Java反编译工具——JAD、FrontEnd
Java开发工具
1、记事本
注意保存时文件名应为*.java。
2、UltraEdit、EditPlus
使用EditPlus编辑和编译Java程序,需要进行相应配置。选择“工具”->“参数选择”->“工具”->“用户工具”->“添加工具”->“应用程序”。首先设置“javac”的参数,具体如下图,其中“命令”为javac.exe文件的地址。
然后设置“java”的参数,如下图所示,其中“命令”为java.exe文件的路径。
设置好后默认“javac”工具的快捷键为Ctrl+1,“java”工具的快捷键为Ctrl+2。当编辑好Java源程序后,使用Ctrl+1即可对其进行编译,然后按Ctrl+2运行程序。如下图所示:
3、集成开发环境——Eclipse、MyEclipse、JBuilder等。
关于Eclipse和MyEclipse,刚用的时候感觉二者差不多,查了资料才知道Eclipse是基础,如同操作系统;而MyEclipse是在Eclipse上面运行的程序,不过进行了增强并提供了新功能。
以前用过Microsoft的VisualStudio2005,个人感觉VS2005是一个功能非常强大的集成开发环境,不过.NET和Java毕竟不是一家人,学Java还是要用Eclipse的。
JDK中的常用包
1、java.lang——包含一些Java语言的核心类,如String、Math、Thread、System、Integer类等。
2、java.awt——包含构成抽象窗口工具集的多个类,用来构建和管理应用程序的图形用户界面(GUI)。
3、java.applet——包含applet运行所需的一些类。
4、java.net——包含执行与网络相关操作的类。
5、java.io——包含能提供多种输入/输出功能的类。
6、java.util——包含一些实用工具类。
Java的命名习惯
1、包名中的字母一律小写。如:xxxyyyzzz。
2、类名、接口名应使用名词,每个单词的首字母大写。如:XxxYyyZzz。
3、方法名,第一个单词小写,后面每个单词的首字母大写。如:xxxYyyZzz。
4、变量名,第一个单词小写,后面每个单词的首字母大写。
5、常量名中的每个字母一律大写。如:XXXYYYZZZ。
Java基础——Java语法基础(1)
Java代码基本格式
Java中所有程序代码都必须存在于一个类中,用class关键字定义类,在class之前可以有一些修饰符。格式如下:
修饰符class类名
{
程序代码
}
注:
1、Java是严格区分大小写的。
2、Java程序中一句连续的字符串不能分开在两行中写。
Java程序的注释
Java里的注释有三种类型:
1、单行注释
在注释内容前面加“//”,格式为:
代码;//注释内容
2、多行注释
以斜杠加星号开头,以星号加斜杠结尾。
3、文档注释
以斜杠加两个星号开头,以一个星号加斜杠结束。
用这种方法注释的内容会被解释成程序的正式文档,并能包含进诸如javadoc之类的工具程序生成的文档里,用以说明该程序的层次结构及其方法。
补充:
1、多行注释中可以嵌套“//”注释,但不能嵌套多行注释符号。
2、程序注释一般占程序代码总量的20%-50%,“可读性第一,效率第二”。
Java中的标识符
Java中的包、类、方法、参数、变量的名字,可以由任意顺序的大小写字母、数字、下划线(_)、美元符号($)组成,但不能以数字开头,不能是Java中的保留关键字。
Java的关键字
1、用于类和接口的声明:class,extends,implements,interface
2、包引入和包声明:import,package
3、数据类型:byte,boolean,char,double,int,long,float,short
4、某些数据类型的可选值:flase,ture,null
5、流程控制:break,case,continue,default,do,else,for,if,return,switch,while
6、异常处理:catch,finally,throw,throws,try
7、修饰符:abstract,final,native,private,protected,public,static,synchronilzed,transient,volatitle
8、操作符:instanceof
9、创建对象:new
10、引用:this,supper
11、方法返回类型:void
12、保留字:const,goto
Java中的常量
1、整形常量
十进制
十六进制——以0x或0X开头
八进制——以0开头
长整形——以L(l)结尾
2、浮点数常量
单精度浮点数——后面加f(F)
双精度浮点数——后面加d(D)
注:
a.小数常量的默认类型是double型,所以float类型常量后一定要加f(F)。
b.浮点数常量可以用指数形式表示,如5.022e+23f
3、布尔常量
true或false
4、字符常量
由英文字母、数字、转义序列、特殊字符等的字符所表示,如'a'、' '等。
Java中的字符占两个字节,是用Unicode码表示的,也可以使用'u'加Unicode码值来表示对应字符,如'u0027'。
常用的转义字符有:
——表示接受键盘输入,相当于按了一下回车键
——表示换行
——表示制表符,相当于Tab键
——表示退格键,相当于BackSpace键
'——表示单引号
”——表示双引号
\——表示反斜杠“”
5、字符串常量
字符串常量用双引号括起来。
6、null常量
null常量表示对象的引用为空。
Java的变量类型
基本数据类型之间的转换
1、自动类型转换(隐式类型转换)
条件:
a.两种类型彼此兼容
b.目标类型的取值范围要大于源类型
2、强制类型转换(显示类型转换)
格式:目标类型常量=(目标类型)值
注:字符串可以使用加号“+”同其他的数据类型相连而形成一个新的字符串。
变量的作用域
代码块决定了变量的作用域,作用域决定了变量的可见性和存在时间。
局部变量
在一个函数或函数里面的代码块中定义的变量称为局部变量。
局部变量在进行取值操作前必须被初始化或进行过赋值操作。
函数
1、定义函数的格式
返回值类型函数名(参数类型形式参数1,参数类型形式参数2,...)
{
程序代码
return返回值;
}
2、函数的重载
函数的重载就是在一个类中可以同时存在一个以上的同名函数,只要它们的参数个数或类型不同即可。
Java基础——Java语法基础(2)——运算符
Java中的运算符
1、算术运算符
a.字符串+其他类型=字符串
b.如果对负数求余,可以把除数负号忽略不计,如5%-1=1。但如果被除数是负数就另当别论了。
2、赋值运算符
a.在Java中,可以把赋值语句连在一起,如:x=y=z=5;
b.x+=y相当于x=x+y
3、比较运算符
a.要注意比较运算符“==”和赋值运算符“=”的区别,特别是布尔型变量进行比较时。
b.可以将比较运算的表达式写为“false==变量”的形式,以防止误写为赋值运算。
4、逻辑运算符
a.逻辑运算符用于对boolean型结果的表达式进行运算,运算的结果都是boolean型。
b.“&”和“&&”的区别在于,如果使用前者连接,那么无论任何情况,“&”两边的表达式都会参与计算。如果使用后者连接,当“&&”的左边为false,则将不会计算其右边的表达式。“|”和“||”的区别与“&”和“&&”的区别一样。
5、位运算符
位运算——对数据按二进制位进行移位操作。
适用类型:byte,short,char,int,long
位运算包括:
&位与
|位或
^位异或
<<左移,左移n位相当于乘以2的n次方
>>右移,右移n位相当于除以2的n次方
>>>无符号右移
注:
a.位运算符也可以与“=”赋值运算符组合产生新的赋值运算符,如:&=,<<=等。
b.移位不会改变变量本身的值,如a>>1在一行语句中单独存在毫无意义。
c.对低于int型的操作数将先自动转换为int型再移位;对int型整数移位a>>b,系统先将b对32取模,得到的结果才是真正移位的位数;对于long型整数移位时则是先将移位位数对64取模。
运算符的优先级
编程技巧:
1、不要在一行中编写太复杂的表达式,可以将其分解为几条语句。
2、多用括号。
Java基础——Java语法基础(3)
程序控制流程
1、顺序结构
按顺序执行
2、if条件语句
a.if...
b.if...else...
可简写为:变量=布尔表达式?语句1:语句2;
c.if...elseif...else...
3、switch选择语句
switch(表达式)
{
case取值1:
语句块1;
break;
...
case取值n:
语句块n;
break;
default:
语句块n+1;
break;
}
4、while循环语句
while(条件表达式)
{
执行语句
}
5、dowhile循环语句
do
{
执行语句
}while(条件表达式)
6、for循环语句
for(初始化表达式;循环条件表达式;循环后操作表达式)
{
执行语句
}
7、增强for循环
for(循环变量类型循环变量名称:要被遍历的对象)
{
执行语句
}
8、break与continue语句
a.一个无标号的break语句会把控制传回当前最内层循环(while,do,for,switch)的下一条语句。
b.无标号的continue语句的作用是跳过当前循环的剩余语句块,接着执行下一次循环。
数组
1、数组的定义
如:int[]x=newint[100];
或intx[]=newint[100];
2、数组的静态初始化
如:int[]aa=newint[]{3,4,5};
3、多维数据
如:
int[][]xx=newint[3][];
xx[0]=newint[3];
xx[1]=newint[2];
4、一些与数组相关的函数
a.System.array(Objectsrc,intsrcPos,Objectdest,intdestPos,intlength)复制数组,将源数组srcPos开始的length个元素从目标数组的destPos位置开始存储。
b.Array.sort()数组升序排序
4. java里面<>的语法
这是JDK5的新特性,叫泛型,看看JDK5的文档吧
泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。
可以在集合框架(Collection framework)中看到泛型的动机。例如,Map类允许您向一个Map添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如String)的对象。
因为Map.get()被定义为返回Object,所以一般必须将Map.get()的结果强制类型转换为期望的类型,如下面的代码所示:
Map m = new HashMap();
m.put("key", "blarg");
String s = (String) m.get("key");
要让程序通过编译,必须将get()的结果强制类型转换为String,并且希望结果真的是一个String。但是有可能某人已经在该映射中保存了不是String的东西,这样的话,上面的代码将会抛出ClassCastException。
理想情况下,您可能会得出这样一个观点,即m是一个Map,它将String键映射到String值。这可以让您消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。
泛型的好处
Java 语言中引入泛型是一个较大的功能增强。不仅语言、类型系统和编译器有了较大的变化,以支持泛型,而且类库也进行了大翻修,所以许多重要的类,比如集合框架,都已经成为泛型化的了。这带来了很多好处:
· 类型安全。泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。
Java 程序中的一种流行技术是定义这样的集合,即它的元素或键是公共类型的,比如“String列表”或者“String到String的映射”。通过在变量声明中捕获这一附加的类型信息,泛型允许编译器实施这些附加的类型约束。类型错误现在就可以在编译时被捕获了,而不是在运行时当作ClassCastException展示出来。将类型检查从运行时挪到编译时有助于您更容易找到错误,并可提高程序的可靠性。
· 消除强制类型转换。泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。
尽管减少强制类型转换可以降低使用泛型类的代码的罗嗦程度,但是声明泛型变量会带来相应的罗嗦。比较下面两个代码例子。
该代码不使用泛型:
List li = new ArrayList();
li.put(new Integer(3));
Integer i = (Integer) li.get(0);
该代码使用泛型:
List<Integer> li = new ArrayList<Integer>();
li.put(new Integer(3));
Integer i = li.get(0);
在简单的程序中使用一次泛型变量不会降低罗嗦程度。但是对于多次使用泛型变量的大型程序来说,则可以累积起来降低罗嗦程度。
· 潜在的性能收益。泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的JVM 的优化带来可能。
由于泛型的实现方式,支持泛型(几乎)不需要JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。
泛型用法的例子
泛型的许多最佳例子都来自集合框架,因为泛型让您在保存在集合中的元素上指定类型约束。考虑这个使用Map类的例子,其中涉及一定程度的优化,即Map.get()返回的结果将确实是一个String:
Map m = new HashMap();
m.put("key", "blarg");
String s = (String) m.get("key");
如果有人已经在映射中放置了不是String的其他东西,上面的代码将会抛出ClassCastException。泛型允许您表达这样的类型约束,即m是一个将String键映射到String值的Map。这可以消除代码中的强制类型转换,同时获得一个附加的类型检查层,这个检查层可以防止有人将错误类型的键或值保存在集合中。
下面的代码示例展示了 JDK 5.0 中集合框架中的Map接口的定义的一部分:
public interface Map<K, V> {
public void put(K key, V value);
public V get(K key);
}
注意该接口的两个附加物:
* 类型参数 K 和 V 在类级别的规格说明,表示在声明一个 Map 类型的变量时指定的类型的占位符。
* 在 get()、put() 和其他方法的方法签名中使用的 K 和 V。
为了赢得使用泛型的好处,必须在定义或实例化Map类型的变量时为K和V提供具体的值。以一种相对直观的方式做这件事:
Map<String, String> m = new HashMap<String, String>();
m.put("key", "blarg");
String s = m.get("key");
当使用Map的泛型化版本时,您不再需要将Map.get()的结果强制类型转换为String,因为编译器知道get()将返回一个String。
在使用泛型的版本中并没有减少键盘录入;实际上,比使用强制类型转换的版本需要做更多键入。使用泛型只是带来了附加的类型安全。因为编译器知道关于您将放进Map中的键和值的类型的更多信息,所以类型检查从执行时挪到了编译时,这会提高可靠性并加快开发速度。
向后兼容
在 Java 语言中引入泛型的一个重要目标就是维护向后兼容。尽管 JDK 5.0 的标准类库中的许多类,比如集合框架,都已经泛型化了,但是使用集合类(比如HashMap和ArrayList)的现有代码将继续不加修改地在 JDK 5.0 中工作。当然,没有利用泛型的现有代码将不会赢得泛型的类型安全好处。
类型参数
在定义泛型类或声明泛型类的变量时,使用尖括号来指定形式类型参数。形式类型参数与实际类型参数之间的关系类似于形式方法参数与实际方法参数之间的关系,只是类型参数表示类型,而不是表示值。
泛型类中的类型参数几乎可以用于任何可以使用类名的地方。例如,下面是java.util.Map接口的定义的摘录:
public interface Map<K, V> {
public void put(K key, V value);
public V get(K key);
}
Map接口是由两个类型参数化的,这两个类型是键类型K和值类型V。(不使用泛型)将会接受或返回Object的方法现在在它们的方法签名中使用K或V,指示附加的类型约束位于Map的规格说明之下。
当声明或者实例化一个泛型的对象时,必须指定类型参数的值:
Map<String, String> map = new HashMap<String, String>();
注意,在本例中,必须指定两次类型参数。一次是在声明变量map的类型时,另一次是在选择HashMap类的参数化以便可以实例化正确类型的一个实例时。
编译器在遇到一个Map<String, String>类型的变量时,知道K和V现在被绑定为String,因此它知道在这样的变量上调用Map.get()将会得到String类型。
除了异常类型、枚举或匿名内部类以外,任何类都可以具有类型参数。
命名类型参数
推荐的命名约定是使用大写的单个字母名称作为类型参数。这与C++ 约定有所不同(参阅附录 A:与 C++ 模板的比较),并反映了大多数泛型类将具有少量类型参数的假定。对于常见的泛型模式,推荐的名称是:
* K —— 键,比如映射的键。
* V —— 值,比如 List 和 Set 的内容,或者 Map 中的值。
* E —— 异常类。
* T —— 泛型。
泛型不是协变的
关于泛型的混淆,一个常见的来源就是假设它们像数组一样是协变的。其实它们不是协变的。List<Object>不是List<String>的父类型。
如果 A 扩展 B,那么 A 的数组也是 B 的数组,并且完全可以在需要B[]的地方使用A[]:
Integer[] intArray = new Integer[10];
Number[] numberArray = intArray;
上面的代码是有效的,因为一个Integer是一个Number,因而一个Integer数组是一个Number数组。但是对于泛型来说则不然。下面的代码是无效的:
List<Integer> intList = new ArrayList<Integer>();
List<Number> numberList = intList; // invalid
最初,大多数 Java 程序员觉得这缺少协变很烦人,或者甚至是“坏的(broken)”,但是之所以这样有一个很好的原因。如果可以将List<Integer>赋给List<Number>,下面的代码就会违背泛型应该提供的类型安全:
List<Integer> intList = new ArrayList<Integer>();
List<Number> numberList = intList; // invalid
numberList.add(new Float(3.1415));
因为intList和numberList都是有别名的,如果允许的话,上面的代码就会让您将不是Integers的东西放进intList中。但是,正如下一屏将会看到的,您有一个更加灵活的方式来定义泛型。
package com.ibm.course.generics;
import java.util.ArrayList;
import java.util.List;
public class GenericsExample {
public static void main(String[] args) {
Integer[] integer = new Integer[5];
Number[] number = integer;
System.out.println(number[0]);// null
number[0] = new Float(7.65);
System.out.println(number[0]);
System.out.println(integer[0]);
List<Integer> list = new ArrayList<Integer>();
// Type mismatch: cannot convert from List<Integer> to List<Number>
// List<Number> listObj = list;
}
}
List<Number> listObj = list;导致编译错误:Type mismatch: cannot convert from List<Integer> to List<Number>
而System.out.println(number[0]);和System.out.println(integer[0]);导致运行时异常:
Exception in thread "main" java.lang.ArrayStoreException: java.lang.Float
at com.ibm.course.generics.GenericsExample.main(GenericsExample.java:15)
类型通配符
假设您具有该方法:
void printList(List l) {
for (Object o : l)
System.out.println(o);
}
上面的代码在 JDK 5.0 上编译通过,但是如果试图用List<Integer>调用它,则会得到警告。出现警告是因为,您将泛型(List<Integer>)传递给一个只承诺将它当作List(所谓的原始类型)的方法,这将破坏使用泛型的类型安全。
如果试图编写像下面这样的方法,那么将会怎么样?
void printList(List<Object> l) {
for (Object o : l)
System.out.println(o);
}
它仍然不会通过编译,因为一个List<Integer>不是一个List<Object>(正如前一屏泛型不是协变的 中所学的)。这才真正烦人——现在您的泛型版本还没有普通的非泛型版本有用!
解决方案是使用类型通配符:
void printList(List<?> l) {
for (Object o : l)
System.out.println(o);
}
上面代码中的问号是一个类型通配符。它读作“问号”。List<?>是任何泛型List的父类型,所以您完全可以将List<Object>、List<Integer>或List<List<List<Flutzpah>>>传递给printList()。
package com.ibm.course.generics;
import java.util.ArrayList;
import java.util.List;
public class GenericExample {
public static void main(String[] args) {
List<Integer> integer = new ArrayList<Integer>();
integer.add(new Integer(0));
integer.add(new Integer(1));
List<String> str = new ArrayList<String>();
str.add(new String("Hello"));
str.add(new String("World"));
List<?> li=integer;
li=str;
printList(integer);
printList(str);
}
public static void printList(List<?> l) {
for (Object o : l) {
System.out.println(o);
}
}
}
上面的例子程序没有警告也没有编译错误。
类型通配符的作用
前一屏类型通配符 中引入了类型通配符,这让您可以声明List<?>类型的变量。您可以对这样的List做什么呢?非常方便,可以从中检索元素,但是不能添加元素(可以添加null)。原因不是编译器知道哪些方法修改列表哪些方法不修改列表,而是(大多数)变化的方法比不变化的方法需要更多的类型信息。下面的代码则工作得很好:
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(42));
List<?> lu = li;
System.out.println(lu.get(0));
为什么该代码能工作呢?对于lu,编译器一点都不知道List的类型参数的值。但是编译器比较聪明,它可以做一些类型推理。在本例中,它推断未知的类型参数必须扩展Object。(这个特定的推理没有太大的跳跃,但是编译器可以作出一些非常令人佩服的类型推理,后面就会看到(在底层细节 一节中)。所以它让您调用List.get()并推断返回类型为Object。
另一方面,下面的代码不能工作:
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(42));
List<?> lu = li;
lu.add(new Integer(43)); // error
在本例中,对于lu,编译器不能对List的类型参数作出足够严密的推理,以确定将Integer传递给List.add()是类型安全的。所以编译器将不允许您这么做。
以免您仍然认为编译器知道哪些方法更改列表的内容哪些不更改列表内容,请注意下面的代码将能工作,因为它不依赖于编译器必须知道关于lu的类型参数的任何信息:
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(42));
List<?> lu = li;
lu.clear();
泛型方法
(在类型参数 一节中)您已经看到,通过在类的定义中添加一个形式类型参数列表,可以将类泛型化。方法也可以被泛型化,不管它们定义在其中的类是不是泛型化的。
泛型类在多个方法签名间实施类型约束。在List<V>中,类型参数V出现在get()、add()、contains()等方法的签名中。当创建一个Map<K, V>类型的变量时,您就在方法之间宣称一个类型约束。您传递给add()的值将与get()返回的值的类型相同。
类似地,之所以声明泛型方法,一般是因为您想要在该方法的多个参数之间宣称一个类型约束。例如,下面代码中的ifThenElse()方法,根据它的第一个参数的布尔值,它将返回第二个或第三个参数:
public <T> T ifThenElse(boolean b, T first, T second) {
return b ? first : second;
}
注意,您可以调用ifThenElse(),而不用显式地告诉编译器,您想要T的什么值。编译器不必显式地被告知 T 将具有什么值;它只知道这些值都必须相同。编译器允许您调用下面的代码,因为编译器可以使用类型推理来推断出,替代T的String满足所有的类型约束:
String s = ifThenElse(b, "a", "b");
类似地,您可以调用:
Integer i = ifThenElse(b, new Integer(1), new Integer(2));
但是,编译器不允许下面的代码,因为没有类型会满足所需的类型约束:
String s = ifThenElse(b, "pi", new Float(3.14));
为什么您选择使用泛型方法,而不是将类型T添加到类定义呢?(至少)有两种情况应该这样做:
* 当泛型方法是静态的时,这种情况下不能使用类类型参数。
* 当 T 上的类型约束对于方法真正是局部的时,这意味着没有在相同类的另一个 方法签名中使用相同 类型 T 的约束。通过使得泛型方法的类型参数对于方法是局部的,可以简化封闭类型的签名。
有限制类型
在前一屏泛型方法 的例子中,类型参数V是无约束的或无限制的类型。有时在还没有完全指定类型参数时,需要对类型参数指定附加的约束。
考虑例子Matrix类,它使用类型参数V,该参数由Number类来限制:
public class Matrix<V extends Number> { ... }
编译器允许您创建Matrix<Integer>或Matrix<Float>类型的变量,但是如果您试图定义Matrix<String>类型的变量,则会出现错误。类型参数V被判断为由Number限制。在没有类型限制时,假设类型参数由Object限制。这就是为什么前一屏泛型方法 中的例子,允许List.get()在List<?>上调用时返回Object,即使编译器不知道类型参数V的类型。
5. Java的基本语法
编写Java程序时,应注意以下几点: 大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的。 类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass。 方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写,例如myFirstJavaMethod。 源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记Java是大小写敏感的),文件名的后缀为.java。(如果文件名和类名不相同则会导致编译错误)。 主方法入口:所有的Java 程序由public static void main(String [] args)方法开始执行。
6. java语法有哪些
Java程序中的每个变量要么是基本数据类型(boolean, char, byte, short, int, long, float, double),要么是对对象的引用
C++有许多种基本类型,额外还有struct, union, enum, 数组和指针,C++指针可以指向对象,也可以不指向对象
Java没有枚举、联合类型,因为Java认为没有必要。将可有可无的语言元素去掉是Java对C/C++做出的一大改变,因此,普遍认为Java较C++更轻便,更精简
Java采用Unicode字符集,C++通常用ASCII字符集。但ASCII是Unicode的子集,对于习惯于ASCII的程序员感觉不到区别
Java中的boolean类型不能转换成其他类型,反之亦然。C++最近引进了bool类型,代表布尔类型,整型也作为逻辑判断
模板是一种“泛型编程思想”,它有别于“面向对象编程思想”。C++在很大程度上已经支持了这种新型编程方法,特别是STL的出现
Java目前仍未支持泛型编程,不过据说Sun公司有在Java中引入模板的计划
C++支持“运算符的重载”,这是它的一个很重要的多态特征,是数据抽象和泛型编程的利器。它允许直接对对象进行四则运算,正像基本数据类型那样
Java不支持这种多态机制,也是为降低复杂性
两种语言都支持方法重载(overloading)
在C++中,为了允许运行时动态决定哪个函数被调用,一个函数必须用virtual修饰。virtual关键字被自动继承,用以支持多态
凡是没有用virtual修饰的成员函数(包括static)都是静态绑定的,即在编译时决定调用哪个版本
而在Java中,除了static、final、private是静态绑定以外,所有方法一律按动态绑定处理
C++中有“拷贝构造函数”的概念,在三种情况下,自动调用它
用一个对象初始化另一对象
对象作实参进行函数调用
对象作函数的返回值
通常,当一个对象需要做“深拷贝”(钱能:《C++程序设计教程》)时,我们需要为它事先定义“拷贝构造函数”、“赋值运算符的重载函数”和“析构函数”;否则编译器将以“按位”的形式自动生成相应的缺省函数。倘若类中含有指针成员或引用成员,那么这三个默认的函数就隐含了错误
Java则没有这种语法结构和语义逻辑
C++支持inline函数,可以避免函数的堆栈调用,提高运行效率
Java无这种语义
C++中,构造函数的初始化列表是这样使用的:首先按继承顺序调用基类的构造函数构造基类对象,然后按声明顺序调用成员对象的构造函数构造成员对象,最后对列表中出现的成员变量做初始化
Java不采用初始化列表这种构造机制
它们的构造顺序基本一致:
静态变量初始化
静态初始化块(Java)
调用基类的构造函数构造基类对象
实例变量的初始化
构造函数的其余部分
Java使用abstract关键字修饰抽象方法或抽象类
C++的对等语法是“纯虚函数”和“抽象类”
两者都使用抽象类作为继承层次中的基类,提供一般概念,由子类实现其抽象方法,且抽象类都不能被直接实例化为对象
Java中有final关键字,修饰类、方法或变量
final类不能被继承
final方法不能被子类覆盖
final变量就是常量
C++中没有这个关键字,常量可以使用const或#define定义
const还可以修饰成员函数,即“常成员函数”,当一个const成员函数修改成员数据,或调用非const成员函数时,编译器会报错
我们应将不修改成员数据的函数声明为const
Java和C++中的static关键字语法和语义基本相同
static成员变量又叫类变量,被类的所有对象共享
A::x (C++):必须在类体外初始化
A.x (Java):必须在类体内初始化
static成员方法又叫类方法,访问static变量
A::f( ) (C++)
A.f( ) (Java)
两者都有内部类和局部类的语法和语义
Java中没有友元函数和友元类的概念,严格支持封装,不允许外部方法访问类的私有成员
而C++支持friend关键字,允许外部方法访问类的私有成员,因此不是一种纯面向对象的编程语言
Java中类或interface可以用public修饰,也可以不修饰;而C++类不能修饰
三种访问权限的语义相同,语法略有差别
C++中还有继承权限修饰符,Java则没有
class A: protected B, public C (C++)
7. java中的语法是什么意思
语法就是编程语言的规则啊, 例如java中定义一个整数类型的变量:
int i= 10;
而在javascript里是这样的
var i = 10;
例如在java中写个方法(函数)是这样的:
public int getNumber(){
return i;
}
javascript里是这样的:
function getNumber(){
reture i;
}
8. java的语法
1)Object s=e.getSource();//Object是什么意思?
Object,就是java世界中所有类的根类,就是所有类的祖先,其他类都实现object类里面的方法
2)if(s instanceof JButton){//instanceof是什么意思?
A instanceof B:判断A是否是B的实例(具体的一个例子)
举个例子就是:有的人是学生,有的人是老师,现在有个人想用学生的方法,但实例话这个人的时候实例化的是人,并不是学生(虽然你知道他是个学生),这怎么办呢?强转的话会报错,虚拟机认为不能把一个人强转成学生,这时候就应该用instanceof判断一下,看那个人是否是学生的实例,是的话,就可以强转,执行学生的方法.
例子有点绕,希望你能理解....
3) JButton b=(JButton)s;//JBtton加括号是什么意思?
如果s是JButton的实例(也就是说s是个JButton),则执行这行代码,将S强转成JButton
....
}
9. java中方法是什么
我们先来理解一下什么叫做方法,通俗一点来说:在我们的日常生活中,方法可以理解为要做某件事情,而采取的解决办法。如:小明同学在路边准备坐车来学校学习。这就面临着一件事情(坐车到学校这件事情)需要解决,解决办法呢?可采用坐公交车或坐出租车的方式来学校,那么,这种解决某件事情的办法,我们就称为方法。在java中,方法就是用来完成解决某件事情或实现某个功能的办法。方法实现的过程中,会包含很多条语句用于完成某些有意义的功能——通常是处理文本,控制输入或计算数值。
我们可以通过在程序代码中引用方法名称和所需的参数,实现在该程序中执行(或称调用)该方法。方法,一般都有一个返回值,用来作为事情的处理结果。
方法的语法格式
在Java中,声明一个方法的具体语法格式如下
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,......){
执行语句
………
return 返回值;
}