一,变量的访问原则和this关键字
- 变量的访问原则:就近原则
- 全局变量和局部变量如果有同名的变量:在方法中优先使用局部变量
- 全局变量和局部变量允许有同名的变量
- 相同的大阔号里面【作用域】不允许出现同名的变量
- 方法中的局部变量不提供给其他方法使用只供给自己使用
二,this关键字
- 定义:代表当前调用对象。 this本质是对象
- 用于区分局部变量和成员变量同名的情况。使用this.属性名称的一定是成员变量,没有使用this.的变量,根据就近原则来确定使用哪个变量。
- this他不是一个固定的对象。他一定代表的是类的一个对象。
代码示例
book1.setPrice(200);//book1在调用方法 this就代表book1
book2.setPrice(400);//book2在调用方法 this就代表book2
book3.setPrice(600);//book3在调用方法 this就代表book3
public void setPrice(double price) {
this.price = price;
}
谁当下来调用 setPrice(double price)this就代表谁
三,静态
- 概述:静态就是static ;
- static是一个关键字,静止的,在java表示资源共享的。
- 为什么要使用静态?
1、比如人都有国籍属性,中国人的国籍的值一样的,创建对象的时候需要在每个对象的空间中开辟对应的国籍属性空间,所有对象的值都一样这样浪费空间。
2、如果把所有对象的属性值一样的属性共享,只开辟一块空间来存储所有的对象共享这个空间值就可以了。
3、对象依托类来的,可以把共享的资源放到类中,所有的对象使用的时候到类中来找就可以了;这样节省空间而且提升了代码的执行效率,使用也方便。
4、使用static关键字对类描述的属性进行修饰,加载类信息的时候在方法区中单独开辟一块空间来存放静态的资源供所有对象来共享,这块空间叫静态区【存在于方法区内】
- 静态体现方式:
1、被static修饰的资源就是静态的体现。
- 静态有什么特点:【需要大家去记忆 面试题】
1、属于类,优先于对象存在于内存中
2、随着类的加载而加载【类的加载他就初始化】
3、使用类名直接调用 【类名.属性名】
4、静态修饰的资源只能访问静态的资源
5、非静态的资源可以访问静态的资源
- 修饰元素:变量、 方法。
四,静态变量
- 静态的东西属于类,静态变量在类当中。
- 被 static 修饰的变量就是静态变量
- 特点:
1、属于类不属于单独的对象,但是被对象共享
2、随着类的加载而加载,随着类的消失而消失
3、优先于对象而存在【提前存在于方法区中】
- 访问:
方式一:类名.属性名
方式二:对象名.属性名【不推荐使用】
代码示例
public class GrilFriend_Test {
public static void main(String[] args) {
//优先于对象存在
System.out.println(GrilFriend.getSex());//lady
System.out.println(GrilFriend.sex);//lady
GrilFriend gf1 = new GrilFriend();
GrilFriend gf2 = new GrilFriend();
String sex = gf1.sex;//lady 开发中不推荐使用
System.out.println(sex);
String sex2 = gf2.sex;
System.out.println(sex2);//lady
//System.out.println(GrilFriend.get);
//System.out.println(GrilFriend.sex);
}
public void show () {
//定义一个静态变量
//static int a = 10;编译报错 方法中不可以定义静态变量的
System.out.println(sex+","+age);//静态的变量可以被非静态的方法使用
}
}
注意事项:
- 静态变量不能定义在方法中
- 静态的变量可以被非静态的方法调用
五,静态变量和非静态变量的区别
1、所属不同:
静态变量:属于类
非静态变量:
全局变量:属于对象
局部变量:属于方法
2、内存中的位置不同
静态变量:存储在方法区的静态区
非静态变量:
全局变量:堆空间的对象空间里
局部变量:栈空间的方法中中
3、声明周期不一样:
静态变量:随着类的加载而加载,随着类的消失而消失
非静态变量:
全局变量:随着对象的创建而创建,随着对象的消失而消失
局部变量:随着方法的调用而产生,随着方法的执行完毕就消失
4、访问方式不一样
静态变量:类名.属性名 或者 类名.getter和setter方法
非静态变量:
全局变量:对象名.属性名或者对象名.getter和setter方法,或者直接使用使用
局部变量:直接使用变量名使用
六, 静态方法
- 概述:被static修饰的方法就是静态方法 比如:main方法就是一个静态方法
- 静态方法的格式:修饰符 static 返回值类型 方法名(形式参数){方法体或者return语句}
- 特点:
- 属于类不属于对象;被所有的对象共享
- 优先对象存在
- 随着类的加载就加载到静态区【普通方法加载到方法区的普通区】
- 不需要使用对象调用,可以直接被类名调用
说白点:静态方法不需要创建对象就可以被类名调用执行 - 只能使用静态资源 说白点:静态方法中只能使用静态变量,只能调用其他的静态方法,普通变量和普通方法不能被使用
- 调用格式:
类名.方法名(实际参数)
对象名.方法名(实际参数)【方式不推荐使用】
代码示例
public class Demo01 {
int a = 10 ;//普通变量
static int b = 50;//静态变量
//普通方法
public void show() {
System.out.println(a);//10
System.out.println(b);//50
//普通方法调用静态方法可以的
print();//变量50
//普通方法调用普通方法可以的
run();
}
public void run() {
System.out.println("我跑得快");
}
//静态方法
public static void print() {
//System.out.println("变量"+a);a是普通变量 不能够被使用
System.out.println("变量"+b);
}
//静态方法
public static void main(String[] args) {
//show();报错,show方法是一个普通方法在静态方法中调用不了普通方法
/*Demo01 demo01 = new Demo01();
demo01.show();
print();
demo01.print();//不建议使用
*/
Demo01 demo01 = new Demo01();
demo01.show();
}
}
注意事项:
1、普通方法可以使用普通变量和静态变量;静态方法只能使用静态变量
2、静态方法只能直接调用静态方法;而不能直接调用普通方法;
3、静态方法如果想要调用普通方法,先要创建该方法所在类的对象,再使用对象调用该方法
4、普通方法可以调用静态方法和普通方法写代码的时候:
静态的资源就使用类名来调用
普通资源必须先创建对象,再使用对象来访问使用
七,工具类
工具类的编写
- 概述:没有任何的成员属性,只有静态方法的类叫做工具类
- 自定义工具类:
- 名称:ArrayTool
- 作用:可以提供操作数组数据的各种功能
- 功能:
数组的遍历
获取数组的最大值
获取数组的最小值
数组元素的交换
数组元素反转
代码
public class ArrayTool {
//数组的遍历
public static void printArr(int[] arr) {
String a = "[";
for (int i = 0; i < arr.length; i++) {
if (i== arr.length-1) {
a+=(arr[i]+"]");
}else {
a+=(arr[i]+",");
}
}
System.out.println(a);
}
//获取数组的最大值
public static int getMax (int[] arr) {
//假设初始擂主
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (max < arr[i]) {
//更换擂主
max = arr[i];
}
}
return max ;
}
//获取数组的最小值
public static int getMin (int[] arr) {
//假设初始擂主
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (min > arr[i]) {
//更换擂主
min = arr[i];
}
}
return min ;
}
//数组元素的交换
public static int[] changeArr(int[] arr,int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
return arr;
}
//数组元素反转
public static int[] reverse(int[] arr) {
for (int i = 0,j = arr.length-1; i <= j; i++,j--) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
return arr;
}
}
//定义测试类
public class ArrayTool_Test {
public static void main(String[] args) {
int[] arr = {12,34,547,688,987,0,-8,-98};
int[] arr1 = {12,3423,5447,66488,94687,0,-48,-498};
ArrayTool.printArr(arr);
ArrayTool.printArr(arr1);
int max = ArrayTool.getMax(arr);
System.out.println(max);
int min = ArrayTool.getMin(arr);
System.out.println(min);
int[] arr2 = ArrayTool.changeArr(arr, 3, 6);
ArrayTool.printArr(arr2);
ArrayTool.printArr(arr);
int[] is = ArrayTool.reverse(arr);
ArrayTool.printArr(is);
ArrayTool.printArr(arr);
}
}
java中工具类很多都是jdk给写好了,我们只需要直接去使用。
八,帮助文档的制作
- 概述:工具类准备好之后,编译成.class的字节码文件,外界就无法看懂,别人想使用这个工具无法使用;所以需要编写工具类的程序员,准备一份工具类的帮助文档;
- 如何生成帮助文档?
- jdk里面提供的程序 javadoc结合文档注释以及相关的注解一起完成帮助文档的制作。
- 注解:
- @author :作者是谁谁谁 用在类上
- @version : 版本号是什么 用在类上
- @since : 从哪个版本开始 用在类上
- @param : 参数的解释 用在方法
- @return : 返回值得解释 用在方法
- 生成帮助文档,利用命令来生成:【在黑窗口中执行】
javadoc -d 生成帮助文档的文件夹名称 -author -version java代码文件名【带后缀名 .java】
- eclipse中有对应功能:
Project ===> Generate javadoc ===>在弹出的页面中选择要生成的帮助文档路径【必须是空文件夹,如果不存在会自动创建】==>点击finish就ok了
代码:
/**
* @author Xiaozhanfeng[肖占锋]
* @version 1.0.0.0.1
* @since jdk8开始
*
* */
public class ArrayTool {
//数组的遍历
/**
* @param arr 这是方法要打印的数组
* */
public static void printArr(int[] arr) {
String a = "[";
for (int i = 0; i < arr.length; i++) {
if (i== arr.length-1) {
a+=(arr[i]+"]");
}else {
a+=(arr[i]+",");
}
}
System.out.println(a);
}
//获取数组的最大值
/**
* @param arr 这是方法要操作的数组
* @return 返回值是数组元素的最大值
* */
public static int getMax (int[] arr) {
//假设初始擂主
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (max<arr[i]) {
//更换擂主
max = arr[i];
}
}
return max ;
}
/**
* @param arr 这是方法要操作的数组
* @return 返回值是数组元素的最小值
* */
//获取数组的最小值
public static int getMin (int[] arr) {
//假设初始擂主
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (min>arr[i]) {
//更换擂主
min = arr[i];
}
}
return min ;
}
//数组元素的交换
/**
* @param arr 这是方法要操作的数组
* @param a 互换元素的第一个索引值
* @param b 互换元素的第二个索引值
* @return 返回值是互换元素后的数组【原数组】
* */
public static int[] changeArr(int[] arr,int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
return arr;
}
//数组元素反转
/**
* @param arr 这是方法要操作的数组
* @return 返回值是反转元素后的数组【原数组】
* */
public static int[] reverse(int[] arr) {
for (int i = 0,j = arr.length-1; i <= j; i++,j--) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
return arr;
}
}
在黑窗口使用户命令生成
在eclipse中生成对应的文档
九,帮助文档的使用
- jdk提供文档的使用
- 在线帮助文档:http://www.matools.com/api/java8
- 离线的帮助文档:
1、打开文档
2、点击显示
3、点击索引
4、搜索需要的类型
5、阅读说明、说明中的示例代码
6、查看构造方法,判断是否可以创建对象
7、查看每个方法的返回值类型,判断是否是自己需要的方法
8、查看每个方法是否静态,判断是否可以使用类名直接调用
9、方法名称
10、方法的详细解释和参数列表
十,Math使用
- 练习: 猜数字小游戏完成
- 生成一个1-100之间的随机数,作为要猜的数字
- 定义一个循环,不断的让用户猜测数字,并且提示“大了”、“小了”或者是“中了”
- 分析:
- 随机数怎么生成?两种方式:
1.1 Math类当中的功能random():可以随机的生成0到1之间的小数不会包含1,包含0
1.2 使用Random类中的nextInt(实参):随机生成0到实参之间的整数,含0 不含实参。
2. 死循环里面键盘录入,录入的数字和生成数字对比,相等了,猜中了循环停止【break】
Math类:是一个工具类。他的所有功能都可以类名直接调用。
Random类:
代码
math: import java.util.Scanner; public class Demo02 { public static void main(String[] args) { double d = Math.random();//生成的数含0.0 不含1.0的 //num就是要猜的数字 int num = (int)(d*100+1);//d扩大100倍变为0到100【不含】的小数再加一 System.out.println(num); Scanner sc = new Scanner(System.in); while(true) { System.out.println("请输入您猜的数字【1到100】:"); int guess_num = sc.nextInt(); if (guess_num == num ) { System.out.println("恭喜您猜对了,可以获得100万"); break; } else if(guess_num > num){ System.out.println("您猜的数字大了"); }else { System.out.println("您猜的数字小了"); } } } } random: public class Demo02 { public static void main(String[] args) { //Method01(); //使用random 必须县创建对象 使用空参 Random random = new Random(); //调用相关方法生成随机数 int num = random.nextInt(100)+1;//0到99的数字 //加的数就是要生成的数的开始值 最大范围值 = 指定值-1+开始值 98 = 指定值-1+2 Scanner sc = new Scanner(System.in); while(true) { System.out.println("请输入您猜的数字【1到100】:"); int guess_num = sc.nextInt(); if (guess_num == num ) { System.out.println("恭喜您猜对了,可以获得100万"); break; } else if(guess_num > num){ System.out.println("您猜的数字大了"); }else { System.out.println("您猜的数字小了"); } } } }
十一,Arrays使用【操作数组的】
- Arrays.binarySearch(int[] arr, int key):查找数组arr中key值出现的索引值
使用有前提:要求数组必须升序排列好
- Arrays.sort(int[] arr)【常用】: 给数组arr进行升序排列
- Arrays.toString(int[] arr)【常用】: 展示数组中的内容的
代码
import java.util.Arrays;
public class Demo03 {
public static void main(String[] args) {
int[] arr = {1,2,3,4,54,48,5,2};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
int i = Arrays.binarySearch(arr, 54);
System.out.println(i);//4 实际得到的是-9
}
}