重点总结
1.Java中的参数传递问题
- 基本数据类型的值传递,不改变原值,因为调用方法后就会弹栈,局部变量随之消失
int a = 528;
System.out.println("改变前a的值:" + a);
change(a);
System.out.println("改变后a的值:" + a);
}
public static void change(int a){
a = 1688;
}
- 引用数据类型的值传递,改变原值,因为即使方法弹栈,但是堆内存数组或者对象还在,可以通过地址继续访问
/**
* 基本数据类型:int,byte,short,long,char,double,float,boolean
* 引用数据类型
* 什么是引用数据类型:数组、对象
* 变量存是的一个内存地址
* */
int[] arr = {1,2,3,4,5};
//arr[2] = 10;
System.out.println("改变前的数组的值:");
printArr(arr);
change(arr);//改变数组
System.out.println("改变后的数组的值");
printArr(arr);
}
//方法里改变数组某一个元素的值
public static void change(int[] arr){
arr[2] = 10;
}
//打印一个数组
public static void printArr(int [] arr){
for(int i=0;i<arr.length;i++){
System.out.print(arr[i] + ",");
}
2.面向对象思想
/我们学习Java编程学习什么?
声明类
声明成员变量(属性)
声明成员方法 (行为)
创建对象
给属性赋值
指挥对象干事/
3.类
- 类的第一个字母用大写
- 类名的第一个字母不能用数字
- 类名的第一个字母可以用下划线,但是不推荐使用
- 在同一个文件中,不能有2个public的class
- 同一个包内,不能有相同的类
- 在同一个文件中,不能有2个public的class
4.成员变量(属性)和局部变量的区别
- 成员变量和局部变量在类中的位置不同
成员变量(属性):在类中方法外
局部变量:在方法中定义 - 成员变量和局部变量在内存中的位置不同
成员变量:在堆内存(成员变量属于对象,对象进堆内存)
局部变量:在栈内存(局部变量属于方法,方法进栈内存) - 成员变量和局部变量的生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失 - 成员变量和局部变量初始化值不同成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。 - 成员变量和局部变量注意事项
局部变量名称可以和成员变量名称一样,在方法中使用的时候,
采用的是就近原则
5.方法的形式参数是类名的时候如何调用?
- 方法的参数是类名public static void print(Dog dog){}
如果你看到了一个方法的形式参数是一个类类型(引用类型)
调用方法的时候其实需要的是该类的对象。
public class Demo01 {
public static void main(String[] args) {
//1.创建对象
Dog dog = new Dog();
dog.name = "小黑";
dog.age = 1;
//2.调用print方法
//print(Dog);//Dog这是一个类
print(dog);//dog这是一个对象
print(new Dog());
}
//public static void printArr(int[] arr)//打印数组
public static void print(Dog dog){
//打印狗的名字和年龄
System.out.println(dog.name + ":" + dog.age);
}
}
class Dog{
String name;
int age;
}
6.匿名对象
public class Demo01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//匿名对象
//什么是匿名对象:没有给新创建的对象存储在一个变量里
GirlFriend gf = new GirlFriend();
gf.name = "苍老师";
gf.hometown = "日本东京";
gf.height = 1.68;
gf.say();
//直接打印一个对象,结果是lesson16.GirlFriend@15db9742【包名.类名@地址】
System.out.println(gf);
//new GirlFriend();//匿名对象
System.out.println(new GirlFriend());
}
}
class GirlFriend{
String name;
String hometown;//家乡
double height;//身高
public void say(){
System.out.println("我是" + name + " 来自" + hometown + " 身高" + height);;
}
}
7.匿名对象应用场景
public class Demo02 {
public static void main(String[] args) {
/*匿名对象应用场景
1.调用方法,仅仅只调用一次的时候。
那么,这种匿名调用有什么好处吗? 节省代码
注意:调用多次的时候,不适合。匿名对象调用完毕就是垃圾。可以被垃圾回收器回收。
2.匿名对象可以作为实际参数传递
*/
Computer comp = new Computer();
comp.brand = "小新";
comp.runScore();
new Computer().runScore();//匿名对象调用方法
print(comp);
//匿名对象可以作为实际参数传递
print(new Computer());//传参是就是匿名对象
}
//打印电脑的品牌
public static void print(Computer comp) {
System.out.println(comp.brand);
}
}
class Computer{
String brand;//品牌
//跑分
public void runScore() {
System.out.println(brand + "跑分是150000...");
}
}
8.关于内存分配进一步理解
- 局部变量放在栈区
- 引用类型(数组、对象)放在堆区
- 调用方法时,先将类的文件放到方法区生成.class文件
练习题
- 写出一个int数组的反转
//1.定义并初始化int数组
int[] arr = {1,3,5,6,7,9,2};
System.out.println("数组反转前:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+",");
}
//2.算出交换次数
int count = arr.length/2;
for (int i = 0; i < arr.length; i++) {
//3.left是左边的下标,right是左边的下标
int left = i;
int right = arr.length-1-i;
if (i<count) {//必须设置判断,不然又换回来了!
//4.通过数组下标交换值
int tem = arr[left];
arr[left] = arr[right];
arr[right] = tem;
}
}
System.out.println();
//5.遍历输出交换后的数组
System.out.println("数组反转后:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+",");
}
- int[][] arr = {{11,12},{21,22},{31,32,33}};遍历第二个数组怎么写?
int[][] arr = {{11,12},{21,22},{31,32,33}};
for (int i = 0; i < arr[1].length; i++) {
System.out.println(arr[1][i]);
}
- 用一个类描述一个事物
public class Demo48 {
public static void main(String[] args) {
//48题.用一个类描述一个事物(不能与课堂一样的案例)
Library library = new Library();
library.id = 101;
library.name = "平凡的世界";
library.address = "AJ-003";
library.jieShu();
library.huanShu();
}
}
class Library{
//图书馆成员属性
int id;//图书编号
String name;//图书名称
String address;//存放位置
//图书馆成员方法
public void jieShu() {
System.out.println("你借到了" + name + ",编号为" + id + ",位置在" + address);
}
public void huanShu() {
System.out.println("你还了" + name+",欢迎下次再来");
}
}
- A水池有154吨水,B水池有82吨水,两水池每小时都排出2吨水,多少个小时后,A水池的吨数是B水池的4倍。
int a = 154;
int b = 82;
int x = 0;
boolean flag = true;
while(flag){
int c = (int)(154-2*x)/(82-2*x);
if(c==4){
System.out.println(x+"小时后,A水池的吨数是B水池的4倍");
flag = false;
}
x++;
- 有一个小于500的三位数abc,对于这个三位数,甲乙丙丁有如下说法:
甲:这个三位数能被2整除3次
乙:这个三位数能被3整除2次
丙:这个三位数能被7整除
丁:这三个数的各个数字之和是15
一直甲乙丙丁有一个人说了谎,请问2a+b-c=多少?(有难度)
int i = 100;
while (i<500) {
//i的百位
int a = i/100;
//i的十位
int b = i%100/10;
//i的个位
int c = i%10;
//甲:这个三位数能被2整除3次
int jia = i%8;
//乙:这个三位数能被3整除2次
int yi = i%9;
//丙:这个三位数能被7整除
int bing = i%7;
//丁:这三个数的各个数字之和是15
int ding = a+b+c;
//判断,四种情况
if (yi==0&&bing==0&&ding==15) {//甲说慌
System.out.println("甲说慌");
}else if(jia==0&&bing==0&&ding==15){//乙说谎
System.out.println("乙说谎");
System.out.println("这个数是:"+i);
System.out.println("2a+b-c="+(2*a+b-c));
}else if(jia==0&&yi==0&&ding==15){//丙说谎
System.out.println("丙说谎");
}else if(jia==0&&yi==0&&bing==0){//丁说谎
System.out.println("丁说谎");
}
i++;
}
面试题
- Java中到底是传值还是传地址讲解
- 见重点总结1
易错点
- 短路&&
int x=4;
int y=6;
System.out.println(--x>3 && y++>5);//短路&&
System.out.println("x:"+x);
System.out.println("y:"+y);
- switch和++
public static void main(String[] args) {
int x=3;
switch (x) {
case 3:
x++;
case 4:
x++;
default:
x++;
}
System.out.println("x:"+x);
}
附件
-
数组内存解释