类与对象
对象(属性、行为)
- 类是抽象的、概念的,代表一类事物,即它是数据类型
- 对象是具体的,实际的,代表一个具体事务,是实例
- 类是对象的模板,对象是类的一个个体,对应一个实例
对象在内存中的存在形式:
jdk1.8 常量池位置有所变动,不再深究。
- 属性=成员变量=field
- 属性是类的一个组成部分,一般是基本数据类型,也可以是引用类型(对象、数组)
属性注意事项和细节:
-
访问修饰符 属性类型 属性名;
public/private/protected/默认
-
属性的类型可以为任意类型,可以是基本数据类型,也可以是引用类型
-
对象的属性默认值,遵守数组规则。
Cat gaogao = new Cat();
//gaogao是对象名,也叫对象引用,new Cat()创建的对象空间(数据)才是真正的对象。
创建对象两种方法:
- 先声明再创建
Cat gaogao;
gaogao = new Cat();
- 直接创建
Cat gaogao = new Cat();
访问属性的基本语法:对象名.属性
类与对象的内存分配机制:
Person p1 = new Person();
...
Person p2 = p1;//此时是引用传递,地址拷贝,p2改变会影响p1
java内存结构分析:
-
栈:一般存放基本数据类型(局部变量)
-
堆:存放对象(类、数组等)
-
方法区:常量池(常量,比如字符串)类加载信息
可能版本有所更改
Java创建对象流程:
- 先加载Person类信息(属性和方法信息,只会加载一次)
- 在堆中分配空间,进行默认初始化
- 把地址付给p,p就指向对象
- 进行指定初始化,比如p.name=“jack”
成员方法调用机制分析:
- 当程序执行到方法时,就会开辟一个独立的空间(栈空间)
- 当方法执行完毕,或者执行到return语句时,就会返回
- 返回到调用方法的地方
- 返回后,继续执行方法后面的代码
- 当主方法(栈)执行完毕后,整个程序退出
成员方法的定义:
访问修饰符 返回数据类型 方法名 (形参列表){
语句;
return 返回值;
}
- 形参列表:表示成员方法的输入
- 返回数据类型:表示成员方法输出,void表示没有返回值
- 方法主体:表示为了实现某一功能的代码块
- return语句不是必须的,void就不用
方法的注意事项和细节:
- 访问修饰控制方法使用范围,四种,public,protected,private,默认
- 返回数据类型
- 一个方法最多有一个返回值,返回多个结果可以使用数组
- 返回类型可以是任意类型,基本数据类型和引用类型都可以
- 如果方法要求有返回数据类型,则方法体中最后的执行语句必须为return值,而且要求返回值类型和return的值类型一直或者兼容(自动类型转换)
- 如果方法是void,方法中可以不写return语句或者只写return语句(后面不要写值)
- 方法名遵循驼峰命名法,最好见名知意,表达出该功能的意思即可
- 形参列表
- 一个方法可以有0个参数,也可以有多个参数,中间用逗号隔开
- 参数类型可以是任意类型,包括基本数据类型和引用类型
- 调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数
- 方法定义时的参数成为形式参数(形参),方法调用时传入的参数实际参数(实参),形参和实参的类型要相同或兼容,个数、顺序必须一致
- 方法体:可以是输入、输入、计算、循环等,但是不能嵌套方法
- 方法调用
- 同一个类中的方法调用:直接调用即可;
- 跨类中的方法A类调用B类方法:需要通过对象名调用(先创建个对象,再调用方法);
- 跨类的方法调用和方法的访问修饰符相关
注意引用传递(传地址,可以通过形参影响实参)和值传递(不能通过形参影响实参)
class Person{
int age;
}
Person p = new Person();
p.age = 10;
System.out.println(p.age);
class B{
public void test(Person p){
p.age = 10000;//此时形参影响实参,输出10000
p = null;//此时只是形参的p指向null,实参不变,输出10
p = new Person();
p.age = 50;//此时形参的p指向新建的对象,实参的p还是指向原来的对象,输出10
}
}
方法递归调用:
-
递归重要规则
- 执行一个方法时,就创建一个新的受保护的独立空间 (栈空间)
- 方法的局部变量是独立的,不会相互影响
- 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据
- 递归必须向推出递归的添加逼近,否则就是无限递归,出现StackOverflowError
- 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时,当方法执行完毕或者返回时,该方法也就执行完毕。
-
老鼠出迷宫
-
汉诺塔
-
八皇后(一维数组可以完成)
方法重载:
java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致
重载的好处:
- 减轻了起名的麻烦
- 减轻了记名的麻烦
方法重载的注意事项和细节:
- 方法名必须相同
- 形参列表必须不同(形参类型、个数或者顺序至少一个不同)参数名并无要求
- 返回类型无要求
可变参数:
-
java允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法
-
基本语法:
访问修饰符 返回类型 方法名(数据类型 形参……)
public in sum(int n1,int n2){
return n1 + n2;
}
public in sum(int n1,int n2,int n3){
return n1 + n2 + n3;
}
public in sum(int n1,int n2,int n3,int n4){
return n1 + n2 + n3 + n4;
}
.........
//可以使用可变参数,封装成一个方法
public int sum (int... nums){
int res = 0;
for(int i = 0;i < nums.length;i++){
res += nums;
}
return res;
}
可变参数注意事项和细节:
- 可变参数的实参可以为0个或者任意多个
- 可变参数的实参可以为数组
- 可变参数的本质就是数组
- 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
- 一个形参列表中只能出现一个可变参数