1.static的学习:
package com.learn.one; /* * 常量:通常使用大写字母 * (1)必须要在常量声明对其进行初始化,否则会出现编译错误。常量一旦初始化,就无法在对这个常量进行赋值 * (2)final关键字不仅可用来修饰基本数据类型的常量,还可以用来修饰后续章节讲到的“对象引用或方法” * * final 数据类型 常量类型 [=值] * * static关键字的使用: * 1.static是静态属性 * 2.static类型的变量时所有对象共享的内存空间,也就是说无论最终有多少个对象产生,也都只有一个static属性。 * 3.定义方法: * 注意:在类中声明了一个static类型的属性,则此属性既可以在非static类型的方法中使用,也可以在static类型的方法 * 中使用。若要用static类型的方法调用非static类型的属性,就会出现错误。 * 4.静态代码块:static{}优先于静态方法,由此可以知道 静态代码块可以对静态属性初始化 * * * * public static void main(String[] args){} * public:表示是公共方法 * static:表示此方法为一静态方法,可以由类名直接调用 * void:表示此方法无返回值 * main:系统定义的方法名称 * String[] args:接受运行时的参数 */ public class Demo1 { // 定义常量 static final int YEAR =365; public static void main(String[] args){ System.out.println("两年是:"+2*YEAR); Person p1=new Person("you",12); Person p2=new Person("ou",15); Person p3=new Person("u",18); // 修改前的信息 System.out.println("未改前:"); System.out.println(p1.talk()); System.out.println(p2.talk()); System.out.println(p3.talk()); // 修改后的信息 // p1.city="mg"; Person.city="mg"; // 所有对象都指向同一个city属性,只要当中有一个对象修改了city属性的内容,则所有的对象都会被同时修改 System.out.println("改之后"); System.out.println(p1.talk()); System.out.println(p2.talk()); System.out.println(p3.talk()); // 注意:用static方式声明的属性,也可以用类名直接访问 // 所以也可以使用:Person.city="mg"; //结果: // 未改前: // 我是you来自zg年龄12 // 我是ou来自zg年龄15 // 我是u来自zg年龄18 // 改之后 // 我是you来自mg年龄12 // 我是ou来自mg年龄15 // 我是u来自mg年龄18 Person.setCity("hahaha"); System.out.println("使用了静态方法"); System.out.println(p1.talk()); System.out.println(p2.talk()); System.out.println(p3.talk()); // 结果: // 使用了静态方法 // 我是you来自hahaha年龄12 // 我是ou来自hahaha年龄15 // 我是u来自hahaha年龄18 } } class Person{ private String name; private int age; static String city="zg"; public Person(String name,int age){ this.name=name; this.age=age; } // 声明了一个talk()方法 public String talk(){ return "我是"+this.name+"来自"+this.city+"年龄"+this.age; } //声明了静态方法: public static void setCity(String c){ city=c; } } //结果: //两年是:730 //未改前: //我是you来自zg年龄12 //我是ou来自zg年龄15 //我是u来自zg年龄18 //改之后 //我是you来自mg年龄12 //我是ou来自mg年龄15 //我是u来自mg年龄18
public class Text{ // 静态代码块 static { System.out.println("Text的静态代码块被调用了"); } // 主方法: public static void main(String[] args) { System.out.println("程序开始执行"); new Person(); new Person(); } } class Person { public Person(){ System.out.println("1.public Person"); } // 静态代码块 static { System.out.println("Person类的静态代码块被调用"); } } //Text的静态代码块被调用了 //程序开始执行 //Person类的静态代码块被调用 //1.public Person //1.public Person /* 可见静态代码块先执行 静态代码块优先于静态方法 (Text类中可以看出) 而且只执行一次 :Person类的静态方法只执行一次 */
2.
static注意事项
1、静态只能访问静态。
2、非静态既可以访问非静态的,也可以访问静态的。关于详细:
3.变量:
1)声明变量
1.指定在内存中分配空间大小(编译程序会在内存里开辟一块足以容纳此变量的内存空间给它)
2.规定这个变量所能接受的运算
2)变量的命名规则
变量也是一种标识符:
1变量名可由任意顺序的大小写字母、数字、下划线和美元符号
2变量名不能以数字开头
3变量名不可以是java 的保留关键字
3)变量的作用范围(作用域)
在java中,在方法(函数)内定义的变量,其作用范围(包括方法的参数)是从它定义的地方开始,到它所作用范围终结的位置处结束。
1.成员变量
//成员变量:在类替中定义的是成员变量。作用范围是整个类, //也就是整个类都可以访问到定故意的这个成员变量 public class Text { // 定义成员变量 static int v=1; public static void main(String[] args) { System.out.println("成员变量:"+v); // 成员变量:1 } }
2.局部变量
//局部变量:在一个函数(或称方法)或函数内代码块中定义的变量,这个变量就是局部变量 //局部变量在函数或代码块被执行时创建,在函数或代码块结束时被销毁。 //注意:局部变量在进行取值操作前必须被初始化或赋值操作,否则会出现编译错误 public class Text { public static void main(String[] args) {//main方法桉树列表定义的局部变量args // main方法体内定义的局部变量sum int sum =0; for (int i=0;i<5;i++){ // for循环体内定义的局部变量i sum=sum+i; System.out.println("i=" +i+",sum="+sum); } } } //i=0,sum=0 //i=1,sum=1 //i=2,sum=3 //i=3,sum=6 //i=4,sum=10
java存在块级作用域,在程序中任意大括号包装的代码块中定义的变量,它的生命仅仅存在于程序运行该代码块时。在循环里声明的变量只要跳出循环,这个变量便不能再使用了,也就是,方法或方法的参数列表里定义的局部变量,当跳出方法体之外,该变量就不能再使用了。public class Text { public static void main(String[] args) { int outer=1; { int inner=2; // int outer=1;会报错 可见java中作用域是不可以嵌套的 所以在方法的开始处定义了outer这个变量 // 那么直到该方法接收处都不能再定义另外一个同名的变量outer System.out.println("inner="+inner); System.out.println("outer="+outer); } // System.out.println("inner="+inner);这里会报错 int inner=3; // 但是在这里出现了inner 是因为在for循环中的inner在for的{}结束后 它也结束了 只是不能在for循环中再出现inner // 但是出了这个for就可以再定义inner System.out.println("inner="+inner); System.out.println("outer="+outer); System.out.println("x="+x); } static int x=10; } // inner=2 // outer=1 // inner=3 // outer=1 // x=10
//在java中,类与方法之间作用域是可以嵌套的,可以把整个类看做一个大的作用域, // 它定义的字段(或称数据成员)可被方法中的同名字段所屏蔽。 public class Text { public static void main(String[] args) { int x=1; System.out.println("x="+x); } private int x; } /* 第5行所定义的x,作为Text.class 的数据成员,它的作用域是整个类,也就是 从第3到第8 之间,也就是包括了main方法,而其内部定义了x这个变量,在这个范围中,第8行的x被第5行定义的 x所覆盖 结果:x=1 */
数据类型:
1.基本数据类型:数值型:整数型(int、 byte、short、long )浮点型(float、double)
字符型(char)用于存储单个字符 占用16位 (两个字节)
必须要用' ' 例如:'a' 单引号表示的字符 而双引号表示的是字符串
布尔型(boolean)
long长整型:64位,8个字节 int整型:32位,4个字节
short短整型:16位,2个字节 char字符:16位,2个字节
byte字节:8位,1个字节 boolean布尔值:1位
float单精度:32位,4个字节,double双精度:64位,8个字节
(若使用float型小数,则需要在小数后面添加f或F,如果没有添加会被认为是double类型 double类型不加d或D是没有出错的)
package Test1028; public class Test1 { public static void main(String[] args) { char word ='d'; char word2='@'; int p=23045; int p2 =45123; // java是采用unicode编码的 System.out.println("d在unicode中的编码的顺序位置是:"+(int)word); System.out.println("@在unicode中的编码的顺序位置是:"+(int)word2); System.out.println("23045在unicode中的编码是:"+(char)p); System.out.println("45123在unicode中的编码是:"+(char)p2); } }
2.引用数据类型:类(class)、接口(interface)、数组(array)
3.数据类型的转换:
1.自动转换
注意:boolean类型是不可能与其他任何数据类型进行转换。
整数与浮点数亦是兼容的,所以可以相互转换
转换后的数据类型的表示范围不小于转换前的类型。(扩大转换)
字符与整数是可使用自动类型转换的
byte->short->int->long->float->double
2.强制转换
public class Text { public static void main(String[] args) { int a=55; int b=9; float g,h; System.out.println("a="+a+"b="+b); g=a/b; System.out.println("a/b="+g); // 因为这里a/b是整数的 后面的小数点会被清除为0,而又因为g是float所以输出的g是要有小数点 所以是6.0 System.out.println("a="+a+"b="+b); h=(float)a/b; System.out.println("a/b="+h); // 而这里是因为a被强制为float 所以a/b是float了 所以这个时候的结果是有小数 } } // a=55b=9 // a/b=6.0 // a=55b=9 // a/b=6.111111
public class Text { public static void main(String[] args) { System.out.println("输出Long的最大和最小"); System.out.println(Long.MAX_VALUE); System.out.println(Long.MIN_VALUE); System.out.println("输出Integer的最大和最小"); System.out.println(Integer.MAX_VALUE); System.out.println(Integer.MIN_VALUE); System.out.println("输出Character的最大和最小"); System.out.println(Character.MAX_VALUE); System.out.println(Character.MIN_VALUE); System.out.println("输出Long的最大和最小"); System.out.println(Float.MAX_VALUE); System.out.println(Float.MIN_VALUE); System.out.println("输出Double的最大和最小"); System.out.println(Double.MAX_VALUE); System.out.println(Double.MIN_VALUE); System.out.println("输出Byte的最大和最小"); System.out.println(Byte.MAX_VALUE); System.out.println(Byte.MIN_VALUE); System.out.println("输出Short的最大和最小"); System.out.println(Short.MAX_VALUE); System.out.println(Short.MIN_VALUE); //输出Long的最大和最小 //9223372036854775807 //-9223372036854775808 //输出Integer的最大和最小 //2147483647 //-2147483648 //输出Character的最大和最小 // // //输出Long的最大和最小 //3.4028235E38 //1.4E-45 //输出Double的最大和最小 //1.7976931348623157E308 //4.9E-324 //输出Byte的最大和最小 //127 //-128 //输出Short的最大和最小 //32767 //-32768 } }
3.
1.一元运算符
public class Text { public static void main(String[] args) { int b =125; boolean a=false; System.out.println("b="+b); System.out.println("~b="+(~b));//~是去补码的意思 System.out.println("b++="+(b++)+"b="+b); System.out.println("b--="+(b--)+"b="+b); System.out.println("-b="+(-b));//取负号 System.out.println("a="+a); System.out.println("!a="+(!a));//取反 } } // b=125 // ~b=-126 // b++=125b=126 // b--=126b=125 // -b=-125 // a=false // !a=true
2.算术运算符
(+ - * / %(取余))
3.逻辑运算符 (只对布尔型操作数进行运算并返回一个布尔型数据)
&& or &与 (两个曹操作数必须是真,结果才是真)
|| or | 或 (两个操作数只要一个是真,结果就为真)
!非(返回的是与操作数相反的布尔值)
public class Text { // 1/0==0 是非法的操作 public static void main(String[] args) { if (1==2&&1/0==0){//(false&错误) //这里是不会报错的 因为&&只需要看第一个操作数 false 所以1/0这个是非法的操作被忽略了 System.out.println("1.1111111"); } // if (1==2 & 1/0==0){ (false&错误) Exception in thread "main" java.lang.ArithmeticException: / by zero at jichu.Text.main(Text.java:8) 这里编译出错 // System.out.println("2222222222"); // } // 1/0==0 是非法的操作 而& 是两个操作数都要看的 if (1==1||1/0==0){//(ture||错误) System.out.println("成功"); } //成功 // //这里是不会报错的 因为&&只需要看第一个操作数 ture 所以1/0这个是非法的操作被忽略了 // if (1==1|1/0==0){//(ture||错误) // System.out.println("成功"); // } // Exception in thread "main" java.lang.ArithmeticException: / by zero // at jichu.Text.main(Text.java:20) // 1/0==0 是非法的操作 而| 是两个操作数都要看的 } }
4.赋值运算符
5.位运算符
& :按位与 |:按位或 ^:按位异或
~ :按位取反 << :左移位 >>:带符号右移位 >>>:无符号右移位
6.三元运算符
“x>y?x:y”
7.关系运算符 > < >= <= == !=
8.递增与递减运算符 ++ --
9.括号运算符 () 其优先级最高
4.表达式
1.算术表达式
2.关系表达式
3.逻辑表达式
4.赋值表达式
public class Text { public static void main(String[] args) { System.out.println(" ---算术运算符"); // 算术运算符 int x=123456789,y=9; System.out.println("x*y="+x*y); System.out.println("------关系运算符"); // 关系运算符 int a =5,b=8; boolean t1=a>b; boolean t2 =a<b; System.out.println("a>b="+t1); System.out.println("a<b="+t2); System.out.println("-----逻辑运算符"); // 逻辑运算符 boolean t3=(1+1==2)&&(1+2==3); System.out.println("(1+1==2)&&(1+2==3)="+t3); System.out.println("------赋值运算符"); // 赋值运算符 int z; z=x+y; System.out.println("x+y="+z); // 递增符号 System.out.println("a="+a+"b="+b); a+=b; System.out.println("a+=b后的"+"a="+a+"b="+b); } } // ---算术运算符 //x*y=1111111101 //------关系运算符 //a>b=false //a<b=true //-----逻辑运算符 //(1+1==2)&&(1+2==3)=true //------赋值运算符 //x+y=123456798 //a=5b=8 //a+=b后的a=13b=8
类型转换:
(1)占用字节较少的数据类型转换占用字节较多的数据类型
(2)字符类型会转换int类型
(3)int类型会转换成float类型
(4)表达式中若有某个操作数的类型为double,则另外一个操作数也会转换成double类型
(5)布尔类型不能转换成其他类型
5.语句
空语句:虽然不完成任何功能,但同样会额外占用计算机资源
(1)一条java语句后面可以跟多个分耗吗?如int i;;
是可以的 。事实上,由于多个java语句可以处于同一行,那么int i;;就可以解读为 int i;
这条语句和另外一个空语句“ ; ” 共处于一行之上。int i 后面即使有10个分号也是合法的。
(2)
public class Text { public static void main(String[] args) throws IOException { // 空语句 int i;; // 声明语句 int a;//声明一个变量 int x,b;//声明多个变量 int y =1;//声明变量的同时,直接为变量赋值 } }