1.数组
整数默认初始化值0
浮点数默认初始化值0.0
布尔类型默认初始化值false
字符类型默认初始化值\u0000
[I@7852e922
[有几个代表是几维数组
I代表是Int类型
@固定格式
7852e922代表的是十六进制的地址值
2.java内存分配及堆栈
堆:new出来的东西
栈:局部变量
方法区:代码
本地方法区:和系统相关
寄存器:给寄存器使用
栈小堆大
主方法在栈的最底部,栈先进后出
3.数组的一些问题
数组索引写在栈中,数组实际在堆中
当两个引用指向同一个数组,共同操作,共同改变。
数组的静态初始化
int[] arr = new int[]{1,2,3,4,5};
int[] arr2 = {1,2,3,4,5};
int[] arr ;
arr = new int[]{1,2,3,4,5};
第一种是正常的,第二种是简写。
正常的数组静态初始化可以先声明后赋值,简写的不行。
数组操作两个常见的错误
java.lang.ArrayIndexOutOfBoundsException
数组索引越界:索引0~n-1,超出自然取不到对应的值
java.lang.NullPointerException
空指针异常:在栈中数组找不到对应的在堆中的地址
4.数组的小功能实现
①实现遍历和求最大值。
②实现数组反转
for (int i = 0; i < arr.length / 2; i++) {
int temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
③查表法(根据索引,查找对应日期)(参数列表是int week 返回值是char(char数组里面的一个元素))
④基本查找(查找指定元素在数组中首次出现的索引)
public static int findIndex(int[] arr, int value) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == value) {
return i;
}
}
return -1;
}
5.二维数组
二维数组第一个数字代表有几个一维数组
第二个数字代表每个一维数组有几个元素
二维数组的arr[]代表的是第几个一维数组的地址,相当于一维数组的arr,想要输出对应数组的对应元素arr[][]。
一维数组int[]存放在栈中,指向存放在堆中的具体一维数组。二维数组int[][]存放在栈中,指向堆中的二维数组,二维数组的每个元素又指向堆中的另一个具体一维数组。
二维数组三种格式
①int[3][5] ②int[3][] 每个一维数组在后面再单独赋值 ③直接放入数字int[][] arr = {{1,2},{45,32,12},{1}}
二维数组遍历,外循环控制一维数组个数,内循环控制一维数组内的元素个数
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
面对实际生产环境中的各种分季度分月份的情况,二维数组每个值都遍历到了,可以完成4中一维数组的各种小功能
6.java中的参数传递问题
调用了方法,但是没有返回值。
基本数据类型的值传递,因为调用方法结束,方法就被弹栈,从栈中拿出来,局部变量随之消失,所以值不会改变。
引用数据类型的值传递,即使调用方法结束,方法被弹栈,堆内存中数组对象还在,还可以通过地址继续访问。
在java中到底是传值还是传址?
一种说法是基本数据类型传的是值,引用数据类型传的是址。
另一种是都会传递的是值,因为地址值也是值(java之父支持的)
7.编程思想
c面向过程
java面向对象
面向过程每一步都要自己做,强调过程,面向对象强调的是对象实现对应功能。
面向对象的开发:不断创建对象,适用对象的过程
面向对象的设计:管理和维护对象间的关系
8.类和对象
类是属性和行为的集合,对象是事物的具体体现
属性是描述
行为是动作
对象的内存图
类存放在方法区中。方法调用的时候放在栈中,new出来的放在堆中。方法调用结束会弹栈,调用时候会压栈。
9.成员变量和局部变量的区别
* A:在类中的位置不同
* 成员变量:在类中方法外
* 局部变量:在方法定义中或者方法声明上
* B:在内存中的位置不同
* 成员变量:在堆内存(成员变量属于对象,对象进堆内存)
* 局部变量:在栈内存(局部变量属于方法,方法进栈内存)
* C:生命周期不同
* 成员变量:随着对象的创建而存在,随着对象的消失而消失
* 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
* D:初始化值不同
* 成员变量:有默认初始化值
* 局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
* 注意事项:
* 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
* 基本数据类型变量包括哪些:byte,short,int,long,float,double,boolean,char
* 引用数据类型变量包括哪些:数组,类,接口,枚举
成员变量与局部变量有什么区别?
类的位置,内存位置,生命周期,初始化值
补充:调用方式不同,局部变量的调用,在方法内直接调用即可,成员变量的调用,需要使用对象.成员变量调用
在使用变量的过程中, 查找变量的顺序是什么?
就近原则
10.匿名对象
使用场景:
①方法仅仅调用一次
②调用方法的时候当做参数传递
好处:节省代码
匿名对象可以调用属性并赋值吗?
可以。但是每调用一次,都是一个新的new,调用多次属性并赋值,最后在堆中是分开的不同new对象,因为没有地址,无法使用赋值后的属性,所以没意义。
11.封装
三大特征:封装,继承,多态
封装:隐藏对象的属性和实现细节,仅提供公共访问方式。(插线板,有插口使用,不用研究零线,火线)
好处:
复用性+安全性
12.private
权限修饰符:可以修饰成员变量和成员方法。被其修饰的成员只能在本类中被访问。
private仅仅是封装的一种表现形式,不能说就是私有
成员变量用private修饰,此处引入set(),get()方法。
有set(),get()方法和一堆private修饰的变量的类就叫javaBean。
13.this
代表当前对象的引用
应用场景:区分成员变量和局部变量
public void setSort(Integer sort) {
this.sort = sort;
}
以此为例,如果不加this,代码为sort=sort。局部变量自己给自己赋值,方法调用完毕局部变量随着方法一起出栈销毁了,成员变量没值,那么这个方法就没了意义。加上this可以完成对应的赋值功能。
14.构造方法Constructor
作用:给对象数据进行初始化
命名格式:①方法名与类名完全一致 ②没有具体返回值,连void也没有 ③return没有具体的返回值
构造方法不能用对象调用,但是new对象的时候默认调用。(没有写构造方法,系统自动给一个无参构造方法。写了有参构造,系统也不提供无参构造!所以要写有参构造一定要自己写无参构造!)
有参构造new Person(string name,int age) 无参构造new Person()
有参构造的好处是可以动态的给对象赋值
有参构造也可以重载
15.给成员变量赋值时两种方式的区别
有参构造和set方法。在实际开发中,用set多,因为灵活,可以改名。
16.创建对象的步骤
①主方法所在的类.class和对象类.class加载斤内存中的方法区
②栈中声明一个对象类型的引用a
③在堆中创建对象
④给对象属性默认初始值
⑤属性进行显示初始化,将值赋过去(属性给的赋值,没有可以忽略这一步)
⑥构造方法在栈中对对象进行赋值,调用结束构造方法弹栈
⑦将对象的地址值赋给引用a
17.static
staic关键字的引入:
public class Practice {
public static void main(String[] args) {
Teacher t1 = new Teacher();
t1.name="钢铁侠";
t1.country="美国";
t1.speak();
Teacher t2 = new Teacher();
t2.name="葫芦娃";
t2.country="中国";
t2.speak();
Teacher t3 = new Teacher();
t3.name="孙悟空";
t3.speak();
}
}
class Teacher{
String name;
static String country;
public void speak(){
System.out.println("我叫"+name+",我的国籍是"+country);
}
}
输出结果:我叫钢铁侠,我的国籍是美国
我叫葫芦娃,我的国籍是中国
我叫孙悟空,我的国籍是中国
static修饰的是静态。改变以后所有new出来的对象该属性都会受到影响。
static修饰的变量,存放在方法区中对象类.class的静态区中,默认是该数据类型对应的默认值,一次赋值以后就不再改变,每次new新对象都会调用。
静态变量内存图:
18.static使用的注意事项
* a:在静态方法中是没有this关键字的
* 如何理解呢?
* 静态是随着类的加载而加载,this是随着对象的创建而存在。
* 静态比对象先存在。
* b:静态方法只能访问静态的成员变量和静态的成员方法
* 静态方法:
* 成员变量:只能访问静态变量
* 成员方法:只能访问静态成员方法
* 非静态方法:
* 成员变量:可以是静态的,也可以是非静态的
* 成员方法:可是是静态的成员方法,也可以是非静态的成员方法。
* 简单记:
* 静态只能访问静态。(访问非静态可能还没有创建对象,就无法访问)
19.静态变量和成员变量的区别(联系9成员变量和局部变量和上图)
* 静态变量也叫类变量 成员变量也叫对象变量
* A:所属不同
* 静态变量属于类,所以也称为为类变量
* 成员变量属于对象,所以也称为实例变量(对象变量)
* B:内存中位置不同
* 静态变量存储于方法区的静态区
* 成员变量存储于堆内存
* C:内存出现时间不同
* 静态变量随着类的加载而加载,随着类的消失而消失
* 成员变量随着对象的创建而存在,随着对象的消失而消失
* D:调用不同
* 静态变量可以通过类名调用,也可以通过对象调用(工具类的基础)
* 成员变量只能通过对象名调用
20.工具类
在类中写一些常用方法,就是工具类。
将所有方法写为static,直接类名.方法即可调用,需要注意的是这时候构造方法要写为private,可以防止其他类创建本类对象。
21.说明书
* @author(提取作者内容)
* @version(提取版本内容)
* javadoc -d 指定的文件目录 -author -version ArrayTool.java
* @param 参数名称//形式参数的变量名称 *@return 函数运行完返回的数据
参考链接:https://blog.csdn.net/minggeqingchun/article/details/55272005
22.Math
math入门api
static double | random() 返回带正号的 double 值,该值大于等于 0.0 且小于 1.0 。 |
使用math中的方法生成1-100随机数
System.out.println((int)(Math.random()*100)+1);(括号顺序一定不能变!会改变运算顺序,很大概率输出的是1!)
生成的数字在0.0000000-0.9999999
*100 0.0000000-99.9999999
int 0-99
+1 1-100
猜数字小游戏
Scanner sc = new Scanner(System.in);
System.out.println("下面请您猜一个1-100的随机数");
int number = (int)(Math.random()*100)+1;
while(true){
int guess = sc.nextInt();
if(guess==number){
System.out.println("奖励帕加尼一辆");
break;
}else if(guess<number){
System.out.println("你猜的数字小了");
}else{
System.out.println("你猜的数字大了");
}
}
从键盘获取数字写在死循环过程中的原因是:方便控制循环。可以确保每次在猜不对的情况下都可以重新输入,猜对的情况下直接跳出死循环。