JAVA笔记03 变量和运算符 面试题以及笔记
标识符的命名规则需要注意哪几点?
定义
就是给类,接口,方法,变量等起名字的字符序列
组成规则
- 英文大小写字母
- 数字
- $和_
注意事项
- 不能以数字开头
- 不能是java中的关键字
- 区分大小写
常见的命名规则(见名知意)
A:包全部小写
单级包:小写
- 举例:liuyi,com
多级包:小写,并用.隔开
- 举例:cn.itcast,com.baidu
B:类或者接口
一个单词:首字母大写
- 举例:Student,Demo
多个单词:每个单词首字母大写
- 举例:HelloWorld,StudentName
C:方法或者变量
一个单词:首字母小写
- 举例:name,main
多个单词:从第二个单词开始,每个单词首字母大写
- 举例:studentAge,showAllNames()
D:常量
全部大写
一个单词:大写
- 举例:PI
多个单词:大写,并用_隔开
- 举例:STUDENT_MAX_AGE
基本数据类型有哪几类?包含String吗?
Java的数据类型分两种:
1.基本类型:int,byte,float,double,char
2. 对象类型(类): Integer,Byte,Float,Double,Char,String,其它一切java提供的,或者你自己创建的类。
其中Integer又叫 int的包装类。而Byte和Float也类似,一般包装类的名字首写是数值名的大写开头。
String类你可以理解成 char[]数组去想就明白了。因为数组是一个类,所以String也就是一个类了。它不是基本数据类型。
或者你还可以这样想, java分为
1。数据;
2。类对象
两种类型,数据是运算的基本单元,这些运算一般类似+ - * % 等数学运算,而类对象的运算是必须你定义的。或者系统有帮你定义的。这些运算一般都是一些函数如set和get方法。
什么叫包装类?
在java中有时候的运算必须是两个类对象之间进行的,不充许对象与数字之间进行运算。所以需要有一个对象,这个对象把数字进行了一下包装,这样这个对象就可以和另一个对象进行运算了。
比如我们也可以定义一个类:
class Integer{
int i=0;
public Integer(int i){
this.i=i;
}
}
这样这个Integer就是一个包装类,他包装了一个整数值,然后可以在里面写一些运算符重载的方法使它支持某些运算。这个时候可以赋值:
Integer it=new Integer(10);
现在变量it就是一个对象,不是一个数字。
每种基本数据类型都定义一个变量。
//这里偷懒了,变量名尽量不要这么定义,值得注意的就是float类型后要加后缀
private
byte
bb =
1
;
private
short
s =
2
;
private
int
i =
1
;
private
long
l =
2
;
private
float
f =
0
.5f;
private
double
d =
0.05
;
private
char
c =
'a'
;
private
boolean
b =
false
;
写出基本数据类型自动转化的流程图。
整型默认的是什么类型,浮点型(实数型)默认的是什么类型?
在基本JAVA类型中,如果不明确指定,整数型的默认是int类型,带小数的默认是double类型
对于包名,类名接口名,变量名和函数名,常量名我们习惯如何格式来命名?
Java包的名字都是由小写单词组成。但是由于Java面向对象编程的特性,每一名Java程序员都可以编写属于自己的Java包,为了保障每个Java包命名的唯一性,在最新的Java编程规范中,要求程序员在自己定义的包的名称之前加上唯一的前缀。由于互联网上的域名称是不会重复的,所以程序员一般采用自己在互联网上的域名称作为自己程序包的唯一前缀。
例如: net.frontfree.javagroup
类的名字必须由大写字母开头而单词中的其他字母均为小写;如果类名称由多个单词组成,则每个单词的首字母均应为大写例如TestPage;如果类名称中包含单词缩写,则这个所写词的每个字母均应大写,如:XMLExample,还有一点命名技巧就是由于类是设计用来代表对象的,所以在命名类时应尽量选择名词。
例如: Circle
interface RasterDelegate;
interface Storing;
方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头。
例如: sendMessge
变量(Variables) 除了变量名外,所有实例,包括类,类常量,均采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。变量名不应以下划线或美元符号开头,尽管这在语法上是允许的。
变量名应简短且富于描述。变量名的选用应该易于记忆,即,能够指出其用途。尽量避免单个字符的变量名,除非是一次性的临时变量。临时变量通常被取名为i,j,k,m和n,它们一般用于整型;c,d,e,它们一般用于字符型。 char c;
int i;
float myWidth;
实例变量(Instance Variables) 大小写规则和变量名相似,除了前面需要一个下划线 int _employeeId;
String _name;
Customer _customer;
常量的名字应该都使用大写字母,并且指出该常量完整含义。如果一个常量名称由多个单词组成,则应该用下划线来分割这些单词。
例如: MAX_VALUE
定义一个变量需要注意什么?
/*
* 定义变量的注意事项:
* 1)定义一个变量,变量不能重复定义,否则报错
* 2)定义变量,变量的作用域的范围,在当前的这个方法中有效的
* 3)在同一行上是可以定义多个变量,但是不建议
* 4)定义变量,不能以数字开头
* */
public class DataTypeDemo2 {
public static void main(String[] args) {
//定义变量
int a = 10 ;
//重复定义
// int a = 20 ;//错误
// int m = 10,n = 20 ,z = 30 ;//在同一行上可以定义多个变量
int m = 10 ;
int n = 20 ;
int z = 30 ;
//不能以数字开头
// int 1y = 20 ;//错误
}
/*public static void add(){
//类的成员方法
}*/
}
强制类型转化可能出现的问题
让我意识到这个问题是做了一道求标准差的题目,本来题目要求精度不高,答案却总是相差一些。和室友进行比较,发现大致思路一样,并不是很麻烦要用高精度算法求解的。
先上代码:
#include <stdio.h>
#include <math.h>
int main (void)
{
int num,sum,i;
int a[100];
double pro,sum1;
sum = sum1 = 0; //定义并初始化变量
scanf ("%d",&num);
for (i=0; i<num; i++)
{
scanf ("%d",&a[i]);
sum = (double)sum + a[i]; //求和 14行
}
ave = (double)sum / num; //求平均数 16行
for (i=0; i<num; i++)
{
sum1 = sum1 + pow (pro - a[i],2); //求方差
}
printf ("%f\n",sqrt (sum1 / num)); //求标准差并输出
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
上面的代码是可以输出正确答案的,一开始我不是用double来把sum给强制类型转换的,我是用1.0*sum来转换的。其实这两种方法的结果是一样。
现在有个问题:
因为第14行已经对sum进行强制类型转换,那么是不是第16行的类型转换可以省略了,反正ave已经定义为double型了
答案是:错误!
第14行对sum进行的强制类型转换只对右边的sum生效,后边得出的值为浮点型,但是把这个浮点型数值赋值给左边的整型sum,则后面的小数部分会丢失。所以第16行的double不能省!
但是这也是有巧合存在,因为第14行运算的输入的数都为整型,所以小数部分丢不丢失无所谓,更严谨一些应该把sum定义为浮点型。
(同样把整型数赋值给浮点型数,也只是在整型数后面补0而已)
为抵抗洪水,战士连续作战89小时,编程计算共多少天零多少小时?
今天是周二,100天以后是周几?
考查运算符的优先级
写出输出的结果.
class Demo{
public static void main(String[] args){
int x=0,y=1;
if(++x==y-- & x++==1||--y==0)
System.out.println("x="+x+",y="+y); //x = 2,y = 0;
else
System.out.println("y="+y+",x="+x);
}
}
插入代码,实现n和m值的交换
//方式一:
int n = 5,m = 13;
//int temp = n;
//n = m;
//m = temp;
System.out.println("n="+n+",m="+m);
//方式二:
//n = n + m;
//m = n - m;
//n = n - m;
System.out.println("n="+n+",m="+m);
//方式三:
n = n ^ m;
m = n ^ m ;
n = n ^ m;
System.out.println("n="+n+",m="+m);
如何手动实现整型数值60的二进制到十六进制的转换
//方式一:自动实现
String str1 = Integer.toBinaryString(60);
String str2 = Integer.toHexString(60);
//方式二:手动实现
int i1 = 60;
int i2 = i1&15;
String j = (i2 > 9)? (char)(i2-10 + 'A')+"" : i2+"";
int temp = i1 >>> 4;
i2 = temp & 15;
String k = (i2 > 9)? (char)(i2-10 + 'A')+"" : i2+"";
System.out.println(k+""+j);
根据运算符的功能,我们把运算符分成哪几类?
运算符按照其要求的操作数数目来分,可以有单目运算符、双目运算符和三目运算符,它们分别对应于1个、2个、3个操作数。运算符按其功能来分,有算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符和其他运算符。
算术
单目:+(取正)-(取负) ++(自增1) - -(自减1)
双目:+ - * / %(取余)
三目:a>b?true:false 说明:当a大于b的时候,为true(也就是冒号之前的值),否则为false;这整个运算符包括一个关系运算符(可以是“>”"<""!="等等),一个“?”,一个“:”,冒号前后需要有两个表达式或者是值或者是对象。
关系
都是双目运算符
等于符号:==,不等于符号:!= ,大于符号:>, 小于符号:<,大于等于符号:>= ,小于等于符号:<= 。
位与逻辑
位运算符 与(&)、非(~)、或(|)、异或(^)
&:双目运算符,运算时均把运算数转换为二进制再做比较,规则:当相同的位上均为1时结果为1,否则结 果为0.如:1010&1101,转为二进制:10001001101&1111110010比较结果为:1000000转为十进制: 64所以1010&1101=64;
| :当两边操作数的位有一边为1时,结果为1,否则为0。如1100|1010=1110
~:0变1,1变0
^:两边的位不同时,结果为1,否则为0.如1100^1010=0110
逻辑运算符
与(&&)、非(!)、或(||)
赋值
= += -= *= /= %= &= ^= |= <<= >>=
instanceof
该运算符是双目运算符,左面的操作元是一个对象,右面是一个类或接口。当左面的对象是右面的类(或右边类的子孙类)创建的对象、或者是右边接口的实现类(或实现类的子孙类)的对象时,该运算符运算结果是true,否则是false。
小明要到美国旅游,可是那里的温度是以华氏度为单位记录的。它需要一个程序将华氏温度(80度)转换为摄氏度,并以华氏度和摄氏度为单位分别显示该温度。
提示:摄氏度与芈氏度的转换公式为:摄氏度 = 5/9.0*(华氏度-32)
练习前++,后++,三元运算符
写出输出结果:
class Demo{
public static void main(String[] args){
int a=3,b=8;
int c=(a>b)?a++:b++;
System.out.println("a="+a+"\tb="+b+"\tc="+c); //
int d=(a>b)?++a:++b;
System.out.println("a="+a+"\tb="+b+"\td="+d); //
int e=(a<b)?a++:b++;
System.out.println("a="+a+"\tb="+b+"\te="+e); //
int f=(a<b)?++a:++b;
System.out.println("a="+a+"\tb="+b+"\tf="+f); //
}
}
----------------------------------------------------
比较 + 与 +=
short s1 = 1; s1 = s1 + 1;有什么错?
short s1 = 1; s1 += 1;有什么错
答:short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)
short s1 = 1; s1 += 1;(可以正确编译)
Java有没有goto
答:java中的保留字,现在没有在java中使用
用最有效率的方法算出2乘以8等于几
答:2 << 3
char型变量中能不能存贮一个中文汉字?为什么?
答:是能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,
所以放一个中文是没问题的
定义float f=3.4;是否正确?
答:不正确。精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4
String是最基本的数据类型吗
答:基本数据类型包括byte、int、char、long、float、double、boolean和short。
java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,
我们应该用StringBuffer类