什么是方法?[size=10.5000pt]* A:为什么要有方法
[size=10.5000pt] * 提高代码的复用性(可以将一个功能反复调用,不需要重复写很多次代码)
[size=10.5000pt]* B:什么是方法
[size=10.5000pt] [size=10.5000pt]* 完成特定功能的代码块。
[size=10.5000pt]* C:方法的格式
[size=10.5000pt]*
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]方法体语句;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]return 返回值;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]* D:方法的格式说明
[size=10.5000pt] [size=10.5000pt]* 修饰符:目前就用 public static。后面我们再详细的讲解其他的修饰符。
[size=10.5000pt] [size=10.5000pt]* 返回值类型:就是功能结果的数据类型。
[size=10.5000pt] [size=10.5000pt]* 方法名:符合命名规则即可。方便我们的调用。
[size=10.5000pt] [size=10.5000pt]* 参数:(根据实际需求,可以有参数,也可以无参数)
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 实际参数:就是实际参与运算的。
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 形式参数;就是方法定义上的,用于接收实际参数的。
[size=10.5000pt] [size=10.5000pt]* 参数类型:就是参数的数据类型
[size=10.5000pt] [size=10.5000pt]* 参数名:就是变量名
[size=10.5000pt] [size=10.5000pt]* 方法体语句:就是完成功能的代码。
[size=10.5000pt] [size=10.5000pt]* return:结束方法的。
[size=10.5000pt] [size=10.5000pt]* 返回值:就是功能的结果,由return带给调用者。
| [size=10.5000pt]class Demo1_Method {
[size=10.5000pt] [size=10.5000pt]public static void main(String[] args) {
[size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]/*
[size=10.5000pt] [size=10.5000pt]* C:方法的格式
[size=10.5000pt] [size=10.5000pt]*
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]方法体语句;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]return 返回值;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt] [size=10.5000pt]* D:方法的格式说明
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 修饰符:目前就用 public static。后面我们再详细的讲解其他的修饰符。
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 返回值类型:就是功能结果的数据类型。
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 方法名:符合命名规则即可。方便我们的调用。
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 参数:
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 实际参数:就是实际参与运算的。
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 形式参数;就是方法定义上的,用于接收实际参数的。
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 参数类型:就是参数的数据类型
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 参数名:就是变量名
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 方法体语句:就是完成功能的代码。
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* return:结束方法的。
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 返回值:就是功能的结果,由return带给调用者。
[size=10.5000pt] [size=10.5000pt]*/
[size=10.5000pt]}
| 如何写一个方法?[size=10.5000pt]/*
[size=10.5000pt]* A:如何写一个方法
[size=10.5000pt] * 1,明确返回值类型(要返回什么数据?这个功能到底要不要返回值?)
* 2,明确参数列表 (需要你传入什么数据?根据数据类型来写参数)
[size=10.5000pt]* B:案例演示
[size=10.5000pt] [size=10.5000pt]* 需求:求两个数据之和的案例
[size=10.5000pt]* C:方法调用图解
[size=10.5000pt]*/
[size=10.5000pt]class Demo2_Sum {
[size=10.5000pt] [size=10.5000pt]public static void main(String[] args) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]/*int a = 10;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]int b = 20;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]int sum = a + b;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(sum);
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]int c = 30;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]int d = 40;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]int sum2 = c + d;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(sum2);*/
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]int sum = add(10,20);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(sum);
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//add(30,40);[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//有返回值方法的单独调用,没有意义
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(add(30,40));[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//这样调用是可以,but如果需要用这个结果不推荐这样调用
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//盘子 = 炒菜(地沟油,苏丹红,镉大米,烂白菜);
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]/*
[size=10.5000pt] [size=10.5000pt]求两个整数的和
[size=10.5000pt] [size=10.5000pt]1,整数的和结果应该还是整数
[size=10.5000pt] [size=10.5000pt]2,有两个未知内容参与运算
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]如何写方法
[size=10.5000pt] [size=10.5000pt]1,明确返回值类型
[size=10.5000pt] [size=10.5000pt]2,明确参数列表
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]* 修饰符:目前就用 public static。后面我们再详细的讲解其他的修饰符。
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 返回值类型:就是功能结果的数据类型。
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 方法名:符合命名规则即可。方便我们的调用。
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 参数:
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 实际参数:就是实际参与运算的。
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 形式参数;就是方法定义上的,用于接收实际参数的。
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 参数类型:就是参数的数据类型
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 参数名:就是变量名
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 方法体语句:就是完成功能的代码。
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* return:结束方法的。
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 返回值:就是功能的结果,由return带给调用者。
[size=10.5000pt] [size=10.5000pt]*/
[size=10.5000pt] [size=10.5000pt]public static int add(int a,int b) {[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//int a = 10,int b = 20
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]int sum = a + b;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]return sum;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//如果有返回值必须用return语句带回
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]/*
[size=10.5000pt] [size=10.5000pt]盘子 炒菜(油,调料,米,菜) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]炒菜的动作
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]return 一盘菜;
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt] [size=10.5000pt]*/
[size=10.5000pt]
[size=10.5000pt]}
| 方法怎么调用的?[size=10.5000pt]* A:方法调用(有具体返回值)
* a:单独调用,一般来说没有意义,所以不推荐。
* b:输出调用,但是不够好。因为我们可能需要针对结果进行进一步的操作。
* c:赋值调用,推荐方案。
[size=10.5000pt]* B:案例演示
[size=10.5000pt] [size=10.5000pt]* a:方法不调用不执行
[size=10.5000pt] [size=10.5000pt]* b:方法与方法是平级关系,不能嵌套定义
[size=10.5000pt] [size=10.5000pt]* c:方法定义的时候参数之间用逗号隔开
[size=10.5000pt] [size=10.5000pt]* d:方法调用的时候不用在传递数据类型
[size=10.5000pt] [size=10.5000pt]* e:如果方法有明确的返回值,一定要有return带回一个值
| [size=10.5000pt]
[size=10.5000pt]/*
[size=10.5000pt]* A:案例演示
[size=10.5000pt] [size=10.5000pt]* 需求:键盘录入两个数据,返回两个数中的较大值
[size=10.5000pt]* B:案例演示
[size=10.5000pt] [size=10.5000pt]* 需求:键盘录入两个数据,比较两个数是否相等
[size=10.5000pt]*/
[size=10.5000pt]import java.util.Scanner;
[size=10.5000pt]class Test1_Method {
[size=10.5000pt] [size=10.5000pt]public static void main(String[] args) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]Scanner sc = new Scanner(System.in);[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//创建键盘录入对象
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println("请输入第一个整数:");
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]int x = sc.nextInt();[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//将键盘录入的整数存储在x中
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println("请输入第二个整数:");
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]int y = sc.nextInt();[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//将键盘录入的整数存储在y中
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//int max = getMax(x,y);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//System.out.println(max);
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]boolean b = isEquals(x,y);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(b);
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]/*
[size=10.5000pt] [size=10.5000pt]返回连个整数的较大值
[size=10.5000pt] [size=10.5000pt]1,明确返回值类型 int
[size=10.5000pt] [size=10.5000pt]2,明确参数列表 int a,int b
[size=10.5000pt] [size=10.5000pt]*/
[size=10.5000pt] [size=10.5000pt]public static int getMax(int a,int b) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]return a > b ? a : b;
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]/*
[size=10.5000pt] [size=10.5000pt]判断两个整数是否相等
[size=10.5000pt] [size=10.5000pt]1,明确返回值类型 boolean
[size=10.5000pt] [size=10.5000pt]2,明确参数列表 int a,int b
[size=10.5000pt] [size=10.5000pt]*/
[size=10.5000pt] [size=10.5000pt]public static boolean isEquals(int a,int b) {[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//isEquals 是否相等
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]return a == b;
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
| [size=10.5000pt]
return 关键字有什么用?[size=10.5000pt]作用一:写在方法里面,直接终止方法,方法不再往下执行代码.
[size=10.5000pt]作用二[size=10.5000pt]:如果用在返回值类型的方法上[size=10.5000pt],如果方法返回类型为void[size=10.5000pt],[size=10.5000pt]可以加可以不加,通常都不加,系统会默认给上.
[size=10.5000pt] 核心作用:一般用于有返回值的方法上,用于返回跟方法返回类型的值.
[size=10.5000pt]public static boolean isEquals(int a,int b) {[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//isEquals 是否相等
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]return a == b;
[size=10.5000pt] [size=10.5000pt]}
例如这个方法: 方法返回值类型是布尔类型,我们return语句跟的就是布尔类型的结果.
| [size=10.5000pt]
方法的形式参数是基本数据类型跟引用数据类型有何不同?[size=10.5000pt]/*
基本数据类型的值传递,不改变原值,因为调用后就会弹栈,局部变量随之消失
引用数据类型的值传递,改变原值,因为即使方法弹栈,但是堆内存数组对象还在,可以通过地址继续访问
[size=10.5000pt]
[size=10.5000pt]Java中到底是传值还是传址
[size=10.5000pt]1,既是传值,也是传地址,基本数据类型传递的值,引用数据类型传递的地址
[size=10.5000pt]2,java中只有传值,因为地址值也是值(出去面试都说这种,支持者是高司令(java之父))
[size=10.5000pt]*/
[size=10.5000pt]class Test3_Array {
[size=10.5000pt] [size=10.5000pt]public static void main(String[] args) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]/*int a = 10;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]int b = 20;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println("a:"+a+",b:"+b);[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//a = 10,b = 20
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]change(a,b);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println("a:"+a+",b:"+b);[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//?*/
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]int[] arr = {1,2,3,4,5};
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]change(arr);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(arr[1]);
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public static void change(int a,int b) {[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//a = 10, b= 20
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println("a:"+a+",b:"+b);[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//a = 10,b = 20
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]a = b;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//a = 20
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]b = a + b;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//b = 40
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println("a:"+a+",b:"+b);[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//a = 20, b = 40
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public static void change(int[] arr) {[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//1,4,3,8,5
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]for(int x=0; x<arr.length; x++) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]if(arr[x]%2==0) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]arr[x]*=2;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
| [size=10.5000pt]file:///C:\Users\ZHONGC~1\AppData\Local\Temp\ksohtml\wps6F75.tmp.jpg[size=10.5000pt]
| [size=10.5000pt]file:///C:\Users\ZHONGC~1\AppData\Local\Temp\ksohtml\wps6F85.tmp.jpg[size=10.5000pt]
| [size=10.5000pt]
方法的形式参数是类名的时候如何调用?[size=10.5000pt]* A:方法的参数是类名public void print(Student s){}//print(new Student());
[size=10.5000pt] [size=10.5000pt]* 如果你看到了一个方法的形式参数是一个类类型(引用类型),这里其实需要的是该类的对象。
| [size=10.5000pt]class Demo1_Student {
[size=10.5000pt] [size=10.5000pt]public static void main(String[] args) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]print(10);
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]Student s = new Student();[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//创建对象,并将对象的地址值赋值给s
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]print(s);
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public static void print(int x) {[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//基本数据类型当作形式参数
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(x);
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public static void print(Student stu) {[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//引用数据类型当作形式参数
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]stu.name = "张三";
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]stu.age = 23;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]stu.speak();
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt]/*
[size=10.5000pt]* A:方法的参数是类名public void print(Student s){}//print(new Student());
[size=10.5000pt] [size=10.5000pt]* 如果你看到了一个方法的形式参数是一个类类型(引用类型),这里其实需要的是该类的对象。
[size=10.5000pt]*/
[size=10.5000pt]class Student {
[size=10.5000pt] [size=10.5000pt]String name;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//姓名
[size=10.5000pt] [size=10.5000pt]int age;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//年龄
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public void speak() {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(name + "..." + age);
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
| [size=10.5000pt]• [size=10.5000pt] 如果[size=10.5000pt]你看到了一个方法的形式参数是一个类类型[size=10.5000pt]([size=10.5000pt]引用类型[size=10.5000pt])[size=10.5000pt],这里其实需要的是该类的对象。
| 什么是方法重载?[size=10.5000pt]/*
重载:方法名相同,参数列表不同,与返回值类型无关
[size=10.5000pt]重载的分类
1,参数个数不同
2,参数类型不同
[size=10.5000pt] 顺序不同
[size=10.5000pt]*/
[size=10.5000pt]class Demo4_Overload {[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//overload重载
[size=10.5000pt] [size=10.5000pt]public static void main(String[] args) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]double sum1 = add(10,20.1);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(sum1);
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]int sum2 = add(10,20,30);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(sum2);
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]double sum3 = add(12.3,13);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(sum3);
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]/*
[size=10.5000pt] [size=10.5000pt]求两个整数的和
[size=10.5000pt] [size=10.5000pt]1,返回值类型int
[size=10.5000pt] [size=10.5000pt]2,参数列表 int a,int b
[size=10.5000pt] [size=10.5000pt]*/
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public static double add(int a,double b) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]return a + b;
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]/*
[size=10.5000pt] [size=10.5000pt]求三个整数的和
[size=10.5000pt] [size=10.5000pt]1,返回值类型int
[size=10.5000pt] [size=10.5000pt]2,参数列表 int a,int b,int c
[size=10.5000pt] [size=10.5000pt]*/
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public static int add(int a,int b,int c) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]return a + b + c;
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]/*
[size=10.5000pt] [size=10.5000pt]求两个小数的和
[size=10.5000pt] [size=10.5000pt]1,返回值类型double
[size=10.5000pt] [size=10.5000pt]2,参数列表 double a,double b
[size=10.5000pt] [size=10.5000pt]*/
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public static double add(double a,int b) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]return a + b;
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
| 怎么写一个方法重载?(案例演示)[size=10.5000pt]/*
[size=10.5000pt]* A:案例演示
[size=10.5000pt] [size=10.5000pt]* 需求:比较两个数据是否相等。
[size=10.5000pt] [size=10.5000pt]* 参数类型分别为两个int类型,两个double类型,并在main方法中进行测试
[size=10.5000pt]
[size=10.5000pt]*/
[size=10.5000pt]class Test3_Overload {
[size=10.5000pt] [size=10.5000pt]public static void main(String[] args) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]boolean b1 = isEquals(10,10);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(b1);
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]boolean b2 = isEquals(10.5,10.5);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(b2);
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]/*
[size=10.5000pt] [size=10.5000pt]比较两个数据是否相等
[size=10.5000pt] [size=10.5000pt]1,返回值类型boolean
[size=10.5000pt] [size=10.5000pt]2,参数列表int a,int b
[size=10.5000pt] [size=10.5000pt]*/
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public static boolean isEquals(int a,int b) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]return a == b;
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]/*
[size=10.5000pt] [size=10.5000pt]比较两个数据是否相等
[size=10.5000pt] [size=10.5000pt]1,返回值类型boolean
[size=10.5000pt] [size=10.5000pt]2,参数列表double a,double b
[size=10.5000pt] [size=10.5000pt]*/
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public static boolean isEquals(double a,double b) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]return a == b;
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
| [size=10.5000pt]
什么是面向对象,什么是面向过程,区别是什么?[size=11.0000pt]面向对象是基于面向过程的。在开发过程中,要完成特定的功能就去找相应的对象,如果找不到就创建相应的对象,使用对象,维护完善对象。
[size=11.0000pt]面向对象和面向过程的区别
[size=11.0000pt]面向过程强调的是功能行为;
[size=11.0000pt]面向对象将功能封装成对象,强调的是具备功能的对象[size=11.0000pt],面向对象有三大特征:封装,继承,多态
| 面向对象的特点是什么,从哪几个角度去说面向对象?[size=10.5000pt]* a:[size=10.5000pt]是一种更符合我们思想习惯的思想[size=10.5000pt]
[size=10.5000pt] * b:[size=10.5000pt]可以将复杂的事情简单化[size=10.5000pt]
[size=10.5000pt] * c:[size=10.5000pt]将我们从执行者变成了指挥者[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] * [size=10.5000pt]角色发生了转换
| [size=10.5000pt]
什么是类?什么是成员变量?什么是成员方法?[size=10.5000pt]* A:我们学习编程是为了什么
[size=10.5000pt] [size=10.5000pt]* 为了把我们日常生活中实物用学习语言描述出来[size=10.5000pt],在java里面,我们学习用类去描述一个实体
[size=10.5000pt]* B:我们如何描述现实世界事物
[size=10.5000pt] [size=10.5000pt]* 属性[size=10.5000pt] [size=10.5000pt]就是该事物的描述信息(事物身上的名词)
[size=10.5000pt] [size=10.5000pt]* 行为[size=10.5000pt] [size=10.5000pt]就是该事物能够做什么(事物身上的动词)
[size=10.5000pt]* C:Java中最基本的单位是类[size=10.5000pt],Java中用class描述事物也是如此
[size=10.5000pt] [size=10.5000pt]* 成员变量[size=10.5000pt] [size=10.5000pt]就是事物的[size=10.5000pt]属性
[size=10.5000pt] [size=10.5000pt]* [size=10.5000pt]成员方法[size=10.5000pt] [size=10.5000pt]就是事物的行为
[size=10.5000pt]* D:定义类其实就是定义类的成员(成员变量和成员方法)
[size=10.5000pt] [size=10.5000pt]* a:成员变量[size=10.5000pt] [size=10.5000pt]和以前定义变量是一样的,只不过位置发生了改变。在类中,方法外。
[size=10.5000pt] [size=10.5000pt]* b:成员方法 和以前定义方法是一样的,只不过把static去掉,后面在详细讲解static的作用。
[size=10.5000pt]* E:类和对象的概念
[size=10.5000pt] * a:类:是一组相关的属性和行为的集合
[size=10.5000pt]
[size=10.5000pt]
| [size=10.5000pt]
什么是对象?创建对象有什么用?[size=10.5000pt]* b:对象:是该类事物的具体体现(类是抽象的,而对象是实际的,如人类是一种类,你是一个具体的人)
[size=10.5000pt] [size=10.5000pt]* c:举例:
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 类[size=10.5000pt] [size=10.5000pt] 学生类
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 对象[size=10.5000pt] [size=10.5000pt]具体的某个学生就是一个对象
作用:简单理解,创建对象出来一般用于调用类里面的成员方法,使用类里面的功能方法.
| [size=10.5000pt]
成员变量和局部变量有什么区别?[size=10.5000pt]* A:在类中的位置不同
[size=10.5000pt] [size=10.5000pt]* 成员变量:在类中方法外
[size=10.5000pt] [size=10.5000pt]* 局部变量:在方法定义中或者方法声明上
[size=10.5000pt]* B:在内存中的位置不同
[size=10.5000pt] [size=10.5000pt]* 成员变量:在堆内存(成员变量属于对象,对象进堆内存)
[size=10.5000pt] [size=10.5000pt]* 局部变量:在栈内存(局部变量属于方法,方法进栈内存)
[size=10.5000pt]* C:生命周期不同
[size=10.5000pt] [size=10.5000pt]* 成员变量:随着对象的创建而存在,随着对象的消失而消失
[size=10.5000pt] [size=10.5000pt]* 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
[size=10.5000pt]* D:初始化值不同
[size=10.5000pt] [size=10.5000pt]* 成员变量:有默认初始化值
[size=10.5000pt] [size=10.5000pt]* 局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
[size=10.5000pt]
[size=10.5000pt]* 注意事项:
[size=10.5000pt] [size=10.5000pt]* 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
[size=10.5000pt] [size=10.5000pt]* 基本数据类型变量包括哪些:byte,short,int,long,float,double,boolean,char
[size=10.5000pt] [size=10.5000pt]* 引用数据类型变量包括哪些:数组,类,接口,枚举
| [size=10.5000pt]class Demo2_Person {
[size=10.5000pt] [size=10.5000pt]public static void main(String[] args) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]Person p = new Person();
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]p.speak();
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
[size=10.5000pt]/*
[size=10.5000pt]* A:在类中的位置不同
[size=10.5000pt] [size=10.5000pt]* 成员变量:在类中方法外
[size=10.5000pt] [size=10.5000pt]* 局部变量:在方法定义中或者方法声明上
[size=10.5000pt]* B:在内存中的位置不同
[size=10.5000pt] [size=10.5000pt]* 成员变量:在堆内存(成员变量属于对象,对象进堆内存)
[size=10.5000pt] [size=10.5000pt]* 局部变量:在栈内存(局部变量属于方法,方法进栈内存)
[size=10.5000pt]* C:生命周期不同
[size=10.5000pt] [size=10.5000pt]* 成员变量:随着对象的创建而存在,随着对象的消失而消失
[size=10.5000pt] [size=10.5000pt]* 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
[size=10.5000pt]* D:初始化值不同
[size=10.5000pt] [size=10.5000pt]* 成员变量:有默认初始化值
[size=10.5000pt] [size=10.5000pt]* 局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
E:使用方式不一样
* 成员变量:对象名.成员变量 来调用
* 局部变量:直接调用。
[size=10.5000pt]
[size=10.5000pt]* 注意事项:
[size=10.5000pt] [size=10.5000pt]* 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
[size=10.5000pt] [size=10.5000pt]* 基本数据类型变量包括哪些:byte,short,int,long,float,double,boolean,char
[size=10.5000pt] [size=10.5000pt]* 引用数据类型变量包括哪些:数组,类,接口,枚举
[size=10.5000pt]*/
[size=10.5000pt]class Person {
[size=10.5000pt] [size=10.5000pt]String name;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//成员变量
[size=10.5000pt] [size=10.5000pt]int num;
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public void speak() {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]int num = 10;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//x和num都是局部变量
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(name);
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(num);
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
| [size=10.5000pt]
什么是栈内存,什么是堆内存?什么是方法区?[size=10.5000pt]/*
[size=10.5000pt]* A:栈(掌握)
[size=10.5000pt] [size=10.5000pt]* 存储局部变量 ,在main方法里面运行的方法需要进栈内存压栈
(特点:先进后出)
[size=10.5000pt] [size=10.5000pt]局部变量:定义在方法声明上(方法的参数里的变量)[size=10.5000pt]和方法中[size=10.5000pt]的变量
[size=10.5000pt]* B:堆(掌握)
[size=10.5000pt] [size=10.5000pt]* 存储new出来的数组或对象
[size=10.5000pt]* C:方法区
* 类(.class字节码文件)加载和静态成员变量和静态成员方法加载的地方
[size=10.5000pt]* D:本地方法区
[size=10.5000pt] [size=10.5000pt]* 和系统相关
[size=10.5000pt]* E:寄存器
[size=10.5000pt] [size=10.5000pt]* 给CPU使用
[size=10.5000pt]*/
[size=10.5000pt]class Demo3_Array {
[size=10.5000pt] [size=10.5000pt]public static void main(String[] args) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]int[] arr = new int[3];[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//动态初始化,创建3块连续的空间
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(arr);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]arr[0] = 10;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]arr[1] = 20;
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(arr[0]);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(arr[1]);
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
[size=10.5000pt]
| [size=10.5000pt]
什么是构造方法?[size=10.5000pt]* A:构造方法概述和作用
[size=10.5000pt] *作用:创建对象(new对象)时候调用,给对象的数据(属性)进行初始化
[size=10.5000pt]* B:构造方法格式特点
[size=10.5000pt] [size=10.5000pt]* a:方法名与类名相同(大小也要与类名一致)
[size=10.5000pt] [size=10.5000pt]* b:没有返回值类型,连void都没有
[size=10.5000pt] [size=10.5000pt]* c:没有具体的返回值return;
| [size=10.5000pt]class Demo1_Constructor {[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//Constructor构造
[size=10.5000pt] [size=10.5000pt]public static void main(String[] args) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]Person p = new Person();[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//在一创建对象的时候,系统就帮我调用了构造方法
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//p.Person();[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//构造方法不能用对象调用
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]p.show();
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]Person p2 = new Person();[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//再次创建对象
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]p2.show();
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt]/*
[size=10.5000pt]* A:构造方法概述和作用
[size=10.5000pt] [size=10.5000pt]* 给对象的数据(属性)进行初始化
[size=10.5000pt]* B:构造方法格式特点
[size=10.5000pt] [size=10.5000pt]* a:方法名与类名相同(大小也要与类名一致)
[size=10.5000pt] [size=10.5000pt]* b:没有返回值类型,连void都没有
[size=10.5000pt] [size=10.5000pt]* c:没有具体的返回值return;
[size=10.5000pt]*/
[size=10.5000pt]
[size=10.5000pt]class Person {
[size=10.5000pt] [size=10.5000pt]private String name;
[size=10.5000pt] [size=10.5000pt]private int age;
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]//构造方法
[size=10.5000pt] [size=10.5000pt]public Person() {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//System.out.println("Hello World!");
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//return;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//构造方法也是有return语句的,格式是return;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]name = "张三";
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]age = 23;
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public void show() {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(name + "..." + age);
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
| [size=10.5000pt]
为什么自己写了有参构造方法还要再写个无参构造方法?[size=10.5000pt]1,如果自己不写构造方法,系统会默认帮我们添加一个无参的构造方法(可以使用XJAD反编译工具看到)
[size=10.5000pt]2,[size=10.5000pt]如果自己写了有参构造或无参构造,系统将不会再帮我们提供无参构造方法.
[size=10.5000pt]3,开发中如果写了有参构造[size=10.5000pt],必须养成习惯自己写无参构造,因为底层在调用我们代码时候,会调用无参构造,后面知识点会涉及到.
| [size=10.5000pt]
什么是构造方法重载?[size=10.5000pt]* A:案例演示[size=10.5000pt]
[size=10.5000pt] * 构造方法的重载[size=10.5000pt](就是构造方法名称一样,参数个数或者类型不同,或者参数顺序不同[size=10.5000pt])[size=10.5000pt]
[size=10.5000pt] * 重载:方法名相同,与返回值类型无关(构造方法没有返回值),只看参数列表
[size=10.5000pt]* B:构造方法注意事项[size=10.5000pt]
[size=10.5000pt] * a:如果我们没有给出构造方法,系统将自动提供一个无参构造方法。[size=10.5000pt]
[size=10.5000pt] * b:如果我们给出了构造方法,系统将不再提供默认的无参构造方法。[size=10.5000pt]
[size=10.5000pt] * 注意:这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法
| [size=10.5000pt]class Demo2_Person {
[size=10.5000pt] [size=10.5000pt]public static void main(String[] args) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]Person p1 = new Person();
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]p1.show();
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println("---------------------");
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]Person p2 = new Person("张三",23);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]p2.show();
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println("---------------------");
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]Person p3 = new Person("李四",24);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]p3.show();
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
[size=10.5000pt]/*
[size=10.5000pt]* A:案例演示
[size=10.5000pt] [size=10.5000pt]* 构造方法的重载
[size=10.5000pt] [size=10.5000pt]* 重载:方法名相同,与返回值类型无关(构造方法没有返回值),只看参数列表
[size=10.5000pt]* B:构造方法注意事项
[size=10.5000pt] [size=10.5000pt]* a:如果我们没有给出构造方法,系统将自动提供一个无参构造方法。
[size=10.5000pt] [size=10.5000pt]* b:如果我们给出了构造方法,系统将不再提供默认的无参构造方法。
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 注意:这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法
[size=10.5000pt] [size=10.5000pt]
[size=10.5000pt]*/
[size=10.5000pt]class Person {
[size=10.5000pt] [size=10.5000pt]private String name;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//姓名
[size=10.5000pt] [size=10.5000pt]private int age;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//年龄
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public Person() {[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//空参构造
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println("空参的构造");
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public Person(String name,int age) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]this.name = name;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]this.age = age;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println("有参的构造");
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public void show() {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(name + "..." + age);
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
| [size=10.5000pt]
什么是封装? 为什么要封装?[size=10.5000pt]面向对象[size=10.5000pt]([size=10.5000pt]封装的概述[size=10.5000pt])
[size=10.5000pt]* A:封装概述
[size=10.5000pt] [size=10.5000pt]* 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式[size=10.5000pt]。(在java里面,对成员变量和成员方法使用private关键字就是一种封装形式的体现,用了private关键字修饰后的成员变量只能在本类中访问,不能在其他类访问,但是我们用private关键字修饰后,需要对外提供公共的访问方式,也就是对应的set/get方法,set方法主要是设置值作用,get方法主要是获取值作用[size=10.5000pt])
[size=10.5000pt]
[size=10.5000pt]* B:封装好处
[size=10.5000pt] [size=10.5000pt]* 隐藏实现细节,提供公共的访问方式
[size=10.5000pt] [size=10.5000pt]* 提高了代码的复用性
[size=10.5000pt] [size=10.5000pt]* 提高安全性。
[size=10.5000pt]* C:封装原则
[size=10.5000pt] [size=10.5000pt]* 将不需要对外提供的内容都隐藏起来。
[size=10.5000pt] [size=10.5000pt]* 把属性隐藏,提供公共方法对其访问。
| [size=10.5000pt]
Private关键字是什么?有什么用?[size=10.5000pt]* A:人类赋值年龄的问题
[size=10.5000pt]* B:private关键字特点
[size=10.5000pt] [size=10.5000pt]* a:是一个权限修饰符(是什么?)
[size=10.5000pt] [size=10.5000pt]* b:可以修饰成员变量和成员方法
[size=10.5000pt] [size=10.5000pt]* c:被其修饰的成员只能在本类中被访问
[size=10.5000pt]* C:案例演示
[size=10.5000pt] [size=10.5000pt]* 封装和private的应用:
[size=10.5000pt] [size=10.5000pt]* A:把成员变量用private修饰(有什么用?)
[size=10.5000pt] * B:提供对应的getXxx()和setXxx()方法
[size=10.5000pt] [size=10.5000pt]* private仅仅是封装的一种体现形式,不能说封装就是私有
| [size=10.5000pt]class Demo1_Person {
[size=10.5000pt] [size=10.5000pt]public static void main(String[] args) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]Person p1 = new Person();
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]p1.name = "张三";[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//调用姓名属性并赋值
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//p1.age = -17;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//调用年龄属性并赋值
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//p1.speak();[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//调用行为
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]p1.setAge(-17);
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(p1.getAge());
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt]class Person {
[size=10.5000pt] [size=10.5000pt]String name;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//姓名
[size=10.5000pt] private int age; //年龄
[size=10.5000pt]
[size=10.5000pt] public void setAge(int a) { //设置年龄
if (a > 0 && a < 200) {
age = a;
}else {
System.out.println("请回火星吧,地球不适合你");
}
}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public int getAge() {[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//获取年龄
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]return age;
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public void speak() {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(name + "..." + age);
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
| [size=10.5000pt]
为什么要有get/set方法,它有什么用?被封装后的成员变量和成员方法只能在本类中使用,其他类无法访问,我们既然做了封装,就应该对外提供公开的访问方式,所以我们提供了set和get方法来给其他类访问我们的成员变量或者成员方法.
[size=10.5000pt]S[size=10.5000pt]et方法有什么用?
[size=10.5000pt]主要用于设置成员变量值使用[size=10.5000pt],通过你传进来的值,对成员变量进行赋值使用
[size=10.5000pt]get方法有什么用[size=10.5000pt]?
[size=10.5000pt]主要用于获取成员变量的值使用[size=10.5000pt],调用这个方法可以获取到你调用set方法后赋的值.
[size=10.5000pt]顺序[size=10.5000pt]?应该先使用set方法,后使用get方法,这样才能获取到值
[size=10.5000pt]
| [size=10.5000pt]
[size=10.5000pt]class Demo1_Person {
[size=10.5000pt] [size=10.5000pt]public static void main(String[] args) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]Person p1 = new Person();
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]p1.name = "张三";[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//调用姓名属性并赋值
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//p1.age = -17;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//调用年龄属性并赋值
[size=10.5000pt] [size=10.5000pt] p1.setAge(-17); //先set方法赋值给成员变量
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] System.out.println(p1.getAge()); //后get方法来获取成员变量的值
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt]class Person {
[size=10.5000pt] [size=10.5000pt]String name;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//姓名
[size=10.5000pt] private int age; //年龄
[size=10.5000pt]
[size=10.5000pt] public void setAge(int a) { //设置年龄
if (a > 0 && a < 200) {
age = a;
}else {
System.out.println("请回火星吧,地球不适合你");
}
}
[size=10.5000pt]
public int getAge() { //获取年龄
return age;
}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public void speak() {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(name + "..." + age);
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
| [size=10.5000pt]
[size=10.5000pt]
构造方法初始化和set方法赋值有什么区别?[size=10.5000pt]* [size=10.5000pt]A:setXxx()方法[size=10.5000pt]
[size=10.5000pt] * [size=10.5000pt]修改属性值 (调用时机:在创建对象后,用对象名.方法名可以调用多次来修改值)
[size=10.5000pt]* [size=10.5000pt]B:构造方法[size=10.5000pt]
[size=10.5000pt] * [size=10.5000pt]给对象中属性进行初始化 (调用时机,在创建对象时候调用,并且只能在创建对象时调用一次)
| [size=10.5000pt]class Demo3_Person {
[size=10.5000pt] [size=10.5000pt]public static void main(String[] args) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]Person p1 = new Person("张三",23);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//p1 = new Person("张天一",23);[size=10.5000pt] [size=10.5000pt]//这种方式看运行结果貌似是改名了,其实是将原对象变成垃圾
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(p1.getName() + "..." + p1.getAge());
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println("--------------------");
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]Person p2 = new Person();[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//空参构造创建对象
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]p2.setName("李四");
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]p2.setAge(24);
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]p2.setName("李鬼");
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(p2.getName() + "..." + p2.getAge());
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
[size=10.5000pt]/*
[size=10.5000pt]构造方法
[size=10.5000pt] [size=10.5000pt]给属性进行初始化
[size=10.5000pt]setXxx方法
[size=10.5000pt] [size=10.5000pt]修改属性值
[size=10.5000pt] [size=10.5000pt]这两种方式,在开发中用setXxx更多一些,因为比较灵活
[size=10.5000pt]*/
[size=10.5000pt]class Person {
[size=10.5000pt] [size=10.5000pt]private String name;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//姓名
[size=10.5000pt] [size=10.5000pt]private int age;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//年龄
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public Person() {[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//空参构造
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public Person(String name,int age) {//有参构造
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]this.name = name;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]this.age = age;
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public void setName(String name) {[size=10.5000pt] [size=10.5000pt]//设置姓名
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]this.name = name;
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public String getName() {[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//获取姓名
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]return name;
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public void setAge(int age) {[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//设置年龄
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]this.age = age;
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public int getAge() {[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//获取年龄
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]return age;
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
| [size=10.5000pt]
构造方法和一般方法有什么区别?[size=10.5000pt]一[size=10.5000pt]般函数和构造函数的区别:
[size=10.5000pt]1、 [size=10.5000pt]从调用上来[size=10.5000pt]讲[size=10.5000pt]:
[size=10.5000pt] 一[size=10.5000pt]般函数,在创建对象[size=10.5000pt]之[size=10.5000pt]后,使用对象名调用
[size=10.5000pt] [size=10.5000pt]构造[size=10.5000pt]函数,在创建对象时,由[size=10.5000pt]JVM自动[size=10.5000pt]调用
[size=10.5000pt]2、 [size=10.5000pt]从[size=10.5000pt]调用次数上来[size=10.5000pt]讲[size=10.5000pt]:
[size=10.5000pt] 一[size=10.5000pt]般函数,在创建完对象后,可以使用对象[size=10.5000pt]名[size=10.5000pt]多次调用([size=10.5000pt]多[size=10.5000pt]次调用)
[size=10.5000pt] [size=10.5000pt] 构造[size=10.5000pt]函数,在创建对象时,[size=10.5000pt]由JVM调用[size=10.5000pt]一次([size=10.5000pt]一[size=10.5000pt]次调用)
[size=10.5000pt]3、 [size=10.5000pt]从作用[size=10.5000pt]上[size=10.5000pt]来[size=10.5000pt]讲:
[size=10.5000pt] 一[size=10.5000pt]般函数,用来描述事物中的行为的
[size=10.5000pt] [size=10.5000pt]构造[size=10.5000pt]函数,是用来初始化对象时使用的
[size=10.5000pt]
| [size=10.5000pt]
this关键字是什么?代表什么意思?有什么用?[size=10.5000pt]/*
[size=10.5000pt]* A:this关键字特点
* 代表当前对象的引用 (是什么?) 简单理解为代表”我”,谁调用成员方法(set/get方法等),this就代表哪个对象
[size=10.5000pt]* B:案例演示
[size=10.5000pt] [size=10.5000pt]* this的应用场景
[size=10.5000pt] [size=10.5000pt]* 用来区分成员变量和局部变量重名(作用之一)
[size=10.5000pt]*/
[size=10.5000pt]class Demo1_This {
[size=10.5000pt] [size=10.5000pt]public static void main(String[] args) {
[size=10.5000pt] [size=10.5000pt] Person p1 = new Person();
[size=10.5000pt] [size=10.5000pt] p1[size=10.5000pt].setName("张三");
[size=10.5000pt] [size=10.5000pt] p1[size=10.5000pt].setAge(23);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(p1.getName() + "..." + p1.getAge());
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] Person p2 = new Person();
[size=10.5000pt] [size=10.5000pt] p2[size=10.5000pt].setName("李四");
[size=10.5000pt] [size=10.5000pt] p2[size=10.5000pt].setAge(24);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(p2.getName() + "..." + p2.getAge()[size=10.5000pt]);
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt]class Person {
[size=10.5000pt] [size=10.5000pt]private String name;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//姓名
[size=10.5000pt] [size=10.5000pt]private int age;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//年龄
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public void setAge(int age) {[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//设置年龄
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]if (age > 0 && age < 200) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]this.age = age;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//System.out.println(age);
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]}else {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println("请回火星吧,地球不适合你");
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt] [size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public int getAge() {[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//获取年龄
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]return age;
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public void setName(String name) {[size=10.5000pt] [size=10.5000pt]//设置姓名
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]this.name = name;
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//System.out.println(name);
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public String getName() {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]return name;
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
| [size=10.5000pt]
Static关键字是什么?为什么要用static修饰成员变量?[size=10.5000pt]* [size=10.5000pt]A:案例演示[size=10.5000pt]
[size=10.5000pt] * [size=10.5000pt]通过一个案例引入static关键字。[size=10.5000pt]
[size=10.5000pt] * [size=10.5000pt]人类:Person。每个人都有国籍,中国。[size=10.5000pt]
[size=10.5000pt]
[size=10.5000pt]* [size=10.5000pt]B:画图演示[size=10.5000pt]
[size=10.5000pt] * [size=10.5000pt]带有static的内存图
| [size=10.5000pt]class Demo1_Static {
[size=10.5000pt] [size=10.5000pt]public static void main(String[] args) {
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]/*Person p1 = new Person();[size=10.5000pt] [size=10.5000pt]//创建对象
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]p1.name = "苍老师";[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//调用姓名属性并赋值
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]p1.country = "日本";[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//调用国籍属性并赋值
[size=10.5000pt] [size=10.5000pt]
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]Person p2 = new Person();
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]p2.name = "小泽老师";[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//调用姓名属性并赋值
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//p2.country = "日本";[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//调用国籍属性并赋值
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]p1.speak();
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]p2.speak();*/
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]Person.country = "日本";[size=10.5000pt] [size=10.5000pt]//静态多了一种调用方式,可以通过类名.
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(Person.country);
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
[size=10.5000pt]
[size=10.5000pt]class Person {
[size=10.5000pt] [size=10.5000pt]String name;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//姓名
[size=10.5000pt] [size=10.5000pt]static String country;[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//国籍
[size=10.5000pt]
[size=10.5000pt] [size=10.5000pt]public void speak() {[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]//说话的方法
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]System.out.println(name + "..." + country);
[size=10.5000pt] [size=10.5000pt]}
[size=10.5000pt]}
| [size=10.5000pt]file:///C:\Users\ZHONGC~1\AppData\Local\Temp\ksohtml\wps6FB5.tmp.jpg[size=10.5000pt]
| static关键字有什么用?[size=10.5000pt]* [size=10.5000pt]A:static关键字的特点[size=10.5000pt]([size=10.5000pt]开发中一般常用于写工具类修饰静态方法[size=10.5000pt])[size=10.5000pt]
[size=10.5000pt] * [size=10.5000pt]a:随着类的加载而加载[size=10.5000pt]
[size=10.5000pt] * [size=10.5000pt]b:优先于对象存在[size=10.5000pt]
* c:被类的所有对象共享[size=10.5000pt]
[size=10.5000pt] * [size=10.5000pt]举例:咱们班级的学生应该共用同一个班级编号。[size=10.5000pt]
[size=10.5000pt] * [size=10.5000pt]其实这个特点也是在告诉我们什么时候使用静态?[size=10.5000pt]
[size=10.5000pt] * 如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。
[size=10.5000pt] * [size=10.5000pt]举例:[size=10.5000pt]
[size=10.5000pt] * [size=10.5000pt]饮水机(用静态修饰)[size=10.5000pt]
[size=10.5000pt] * [size=10.5000pt]水杯(不能用静态修饰)[size=10.5000pt]
[size=10.5000pt] * [size=10.5000pt]共性用静态,特性用非静态[size=10.5000pt]
* d:可以通过类名调用[size=10.5000pt]
[size=10.5000pt] * [size=10.5000pt]其实它本身也可以通过对象名调用。[size=10.5000pt]
[size=10.5000pt] * [size=10.5000pt]推荐使用类名调用。[size=10.5000pt]
[size=10.5000pt] * [size=10.5000pt]静态修饰的内容一般我们称其为:与类相关的,类成员
[size=10.5000pt]* [size=10.5000pt]B:案例演示[size=10.5000pt]
[size=10.5000pt] * [size=10.5000pt]static关键字的特点
| [size=10.5000pt]
[size=10.5000pt]* A:static的注意事项
[size=10.5000pt] [size=10.5000pt]* a:在静态方法中是没有this关键字的
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 如何理解呢?
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 静态是随着类的加载而加载,this是随着对象的创建而存在。
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 静态比对象先存在。
* b:静态方法只能访问静态的成员变量和静态的成员方法
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 静态方法:
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 成员变量:只能访问静态变量
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 成员方法:只能访问静态成员方法
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 非静态方法:
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 成员变量:可以是静态的,也可以是非静态的
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 成员方法:可是是静态的成员方法,也可以是非静态的成员方法。
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 简单记:
[size=10.5000pt] [size=10.5000pt] [size=10.5000pt] [size=10.5000pt]* 静态只能访问静态。
[size=10.5000pt]* B:案例演示
[size=10.5000pt] [size=10.5000pt]* static的注意事项
| [size=10.5000pt]
类的加载过程是怎样的?[size=10.5000pt]类加载过程:
[size=10.5000pt]1、 [size=10.5000pt]在[size=10.5000pt]main[size=10.5000pt]方法中创建对象时,[size=10.5000pt]JVM[size=10.5000pt]会先去判断类[size=10.5000pt](class)[size=10.5000pt]在方法区下是否已经存在,如果存在则直接使用已经存在的[size=10.5000pt]class[size=10.5000pt]。如果不存在,则把类所对应的[size=10.5000pt].class[size=10.5000pt]文件加载到内存中的方法区
[size=10.5000pt]2、 [size=10.5000pt]在把[size=10.5000pt].class[size=10.5000pt]文件加载到方法区时,会分两部分加载:
[size=10.5000pt]从[size=10.5000pt].class[size=10.5000pt]文件头部依次加载内容,是静态的内容[size=10.5000pt]([size=10.5000pt]静态变量、静态方法、静态代码块[size=10.5000pt])[size=10.5000pt]就加载到方法区下的静态区域内;[size=10.5000pt] [size=10.5000pt]是非静态的内容[size=10.5000pt]([size=10.5000pt]成员变量、成员函数、构造函数、构造代码块[size=10.5000pt])[size=10.5000pt]全部加载到方法区下的非静态区域内
[size=10.5000pt]3、 [size=10.5000pt]在把[size=10.5000pt].class[size=10.5000pt]中的所有静态内容全部加载完成之后,会对所有的静态成员变量进行默认初始化
[size=10.5000pt]4、 [size=10.5000pt]在所有的静态成员变量默认初始化完成之后,在执行显式初始化
[size=10.5000pt]5、 [size=10.5000pt]在对所有的静态成员变量显式初始化完成之后,就会把静态代码块加载到栈中执行(如果有多个静态代码块时,按照书写顺序依次加载到栈中执行)
[size=10.5000pt]6、 [size=10.5000pt]所有的静态代码块全部执行完之后,整个类加载完成。
[size=10.5000pt]
| [size=10.5000pt]
对象的加载过程是怎样的?[size=10.5000pt]1、 [size=10.5000pt]当[size=10.5000pt]JVM[size=10.5000pt]执行[size=10.5000pt]new[size=10.5000pt]时,就会去堆中开辟一块空间
[size=10.5000pt]2、 [size=10.5000pt]在空间开辟后,给空间分配地址
[size=10.5000pt]3、 [size=10.5000pt]空间分配完后,就方法区下非静态区域中的类的成员加载到开辟的空间下
[size=10.5000pt]4、 [size=10.5000pt]所有成员全部加载到开辟的空间后,对空间下所有的成员变量进行默认初始化
[size=10.5000pt]5、 [size=10.5000pt]所有的成员变量默认初始化完成之后,调用相应的构造函数入栈执行
[size=10.5000pt]6、 [size=10.5000pt]在执行构造函数时,分为两部分执行:
[size=10.5000pt]6.1[size=10.5000pt]、[size=10.5000pt] [size=10.5000pt]先执行构造函数中隐藏的三步代码[size=10.5000pt](隐式三步[size=10.5000pt]):
[size=10.5000pt] 1[size=10.5000pt]、执行[size=10.5000pt]super() [size=10.5000pt](执行父类的构造函数也需要隐式三步)
[size=10.5000pt] 2[size=10.5000pt]、对所开辟空间下的成员变量进行显式初始化
[size=10.5000pt] 3[size=10.5000pt]、执行构造代码块
[size=10.5000pt]6.2[size=10.5000pt]、[size=10.5000pt] [size=10.5000pt]执行完隐式三步后,再执行构造函数中所书写的代码
[size=10.5000pt]
[size=10.5000pt]7、 [size=10.5000pt]在整个构造函数全部执行完成之后,表示对象创建完成。会把所开辟空间的地址赋给引用对象
[size=10.5000pt]
| [size=10.5000pt]
类里面可以写什么?[size=10.5000pt]class [size=10.5000pt] [size=10.5000pt]类{
[size=10.5000pt]非[size=10.5000pt]静态[size=10.5000pt]成员[size=10.5000pt]变量
[size=10.5000pt]静态[size=10.5000pt]成员变量
[size=10.5000pt]
[size=10.5000pt]非[size=10.5000pt]静态[size=10.5000pt]成员[size=10.5000pt]函数
[size=10.5000pt]静态[size=10.5000pt]成员函数
[size=10.5000pt]
[size=10.5000pt]构造[size=10.5000pt]函数
[size=10.5000pt]
[size=10.5000pt]构造[size=10.5000pt]代码块
[size=10.5000pt]静态[size=10.5000pt]代码块
[size=10.5000pt]}
[size=10.5000pt]
| [size=10.5000pt]
|
|