当前位置:   article > 正文

B站韩顺平学Java课程——个人笔记(第7章):方法,类,对象,递归。递归思维解决——斐波那契数,猴子吃桃,迷宫,汉诺塔等_b站java课程

b站java课程

1.简介

        俺就一小白,半途想记录一下,有错就改,这当自己的小笔记,知识点细小了一点,欢迎大家补充,同时愿自己坚持下来。很多知识点都在代码里面备注,为了方便自己就不一一拿出来了。主要内容:Java方法,类,对象,递归。递归思维解决——斐波那契数,猴子吃桃,迷宫,汉诺塔等。目录齐全。

来源:韩顺平 零基础30天学会Java

2.类和对象

类和对象:
    类是创建一个数据类型;
    对象就是一个具体的事物。
  1. public class Object_Base01 {
  2. /*
  3. 类和对象:
  4. 类是创建一个数据类型;int,char.double
  5. 对象就是一个具体的事物。
  6. */
  7. public static void main(String[] args) {
  8. /*
  9. 张老太养了两只猫猫:一只名家叫小白,今年3岁,白色。
  10. 还有一只叫小花,今年100岁,花色。请编写一个程序,
  11. 当用户输入小猫的名字时就显示该猫的名字,年龄,颜色。
  12. 如果用户输入的小猫名错误,则显示 张老太没有这只猫猫。
  13. */
  14. // //1.单独变量==》1)不利于数据的管理; 2)效率低下
  15. // String dog1Name = "小白";
  16. // String dog2Name = "花花";
  17. //
  18. // int dog1Age = 18;
  19. // int dog2Age = 38;
  20. //
  21. // //2.数组==》1)数据类型无法体现 2)只能通过下标表现出来
  22. // String dog1[] = {"小白", "18", "白色"};
  23. // String dog2[] = {"小花", "38", "花色"};
  24. //3.数组
  25. //实例化一个对象
  26. Cat cat1 = new Cat(); //创建一只猫,并赋值给 cat1
  27. cat1.name = "小白";
  28. cat1.age = 18;
  29. cat1.color = "白色";
  30. cat1.weight = 23.34;
  31. //cat2 是对象名(对象引用)
  32. //new Cat() 创建的对象空间才是真正的对象
  33. Cat cat2 = new Cat();
  34. cat2.name = "小花";
  35. cat2.age = 38;
  36. cat2.color = "花色";
  37. cat2.weight = 9.32;
  38. //怎么访问
  39. System.out.println("第一只猫" + cat1.name + "\t" + cat1.age
  40. + "\t" + cat1.color + "\t" + cat1.weight);
  41. System.out.println("第二只猫" + cat2.name + "\t" + cat2.age
  42. + "\t" + cat2.color + "\t" + cat2.weight);
  43. }
  44. }
  45. class Cat{
  46. // 属性/成员变量/字段
  47. String name;
  48. int age;
  49. String color;
  50. double weight;
  51. // 属性既可以是基本数据类型,也可以是引用类型(数组,对象)
  52. //创建空间的方法:
  53. // 1)直接创建;Cat cat = new Cat()
  54. // 2)先声明再创建: Cat cat; caty = new Cat()
  55. //访问属性:
  56. // 对象名.属性名
  57. //类与对象
  58. /*
  59. Java 内存的结构分析
  60. 1.栈:一般存放基本数据类型
  61. 2.堆:存放对象(Cat cat,数组等)
  62. 3.方法区L:常量区(常量,比如字符串),类加载信息
  63. 4.示意图[Cat(name,age,prince]
  64. */
  65. // Person p = new Person();
  66. // p.name = "jack";
  67. // p.age = 10;
  68. /*
  69. 创建对象流程简单分析:
  70. 1.先加载Person类信息
  71. 2.在堆中分配空间,进行默认初始化
  72. 3.把地址给p,p指向的对象
  73. 4.进行指定初始化 p.name = "jack"; p.age = 10;
  74. */
  75. }

3.方法

方法调用:
// 1.方法写好后,不去调用,不会输出
// 2.先创建一个对象,再去调用
方法调用小结:
//1.当程序执行到方法时,就会开辟一个独立的空间(栈空间)
//2.当方法执行完毕,或者执行到return语句时,就会返回
//3.返回到调用的地方
//4.返回后继续执行方法后的语句
  1. public class Method_02 {
  2. public static void main(String[] args) {
  3. //方法调用:
  4. // 1.方法写好后,不去调用,不会输出
  5. // 2.先创建一个对象,再去调用
  6. Person p1 = new Person();
  7. p1.name = "皓泽";
  8. p1.speak();
  9. p1.cal01();
  10. p1.cal02(5);
  11. int returnRes = p1.getSum(2,34); //调用getSum,同时进行赋值
  12. System.out.println("getSum返回值:" + returnRes);
  13. System.out.println(p1.name);
  14. }
  15. }
  16. class Person{
  17. String name;
  18. int age;
  19. // 1. public 表示方法是公开的
  20. // 2. void: 表示方法没有返回值
  21. // 3.speak() speak是方法名, ()形参列表
  22. // 4. {}方法体, 可以写物品,要执行的代码
  23. public void speak(){
  24. System.out.println("我是帅比");
  25. }
  26. //添加cal01 成员方法,计算1-1000的和
  27. public void cal01(){
  28. int res = 0;
  29. for (int i = 0; i <= 1000; i++) {
  30. res += i;
  31. }
  32. System.out.println("计算结果为:" + res);
  33. }
  34. //添加cal02 成员方法,计算1-n的和
  35. //解读:
  36. //1.(int n) 形式列表, 表示当前有一个形参 n,可以从用户输入
  37. public void cal02(int n){
  38. int res1 = 0;
  39. for (int i = 0; i <= n; i++) {
  40. res1 += i;
  41. }
  42. System.out.println("计算结果:" + res1);
  43. }
  44. //添加getSum成员的方法,可以计算两个数的和
  45. //解读:
  46. // 1.public 表示方法是公开的
  47. // 2.int :表示方法执行后,返回一个 int 值
  48. // 3.getSum 方法名
  49. // 4.(int num1, int num2) 形参列表,2个形参,可以接受用户传入的两个数
  50. public int getSum(int num1,int num2) {
  51. int res = num1 + num2;
  52. return res; //return语句
  53. //方法调用小结:
  54. //1.当程序执行到方法时,就会开辟一个独立的空间(栈空间)
  55. //2.当方法执行完毕,或者执行到return语句时,就会返回
  56. //3.返回到调用的地方
  57. //4.返回后继续执行方法后的语句
  58. }
  59. }

4.为什么需要成员方法

1.成员方法的好处:
//    提高代码的复用性
//    可以将实现的细节封装起来然后供其他用户来调用即可。
  1. public class Method_03 {
  2. //为什么需要成员方法
  3. public static void main(String[] args) {
  4. int map[][] = {{1,2,4},{3,5,9},{6,4,2}};
  5. Mytool tool = new Mytool();
  6. tool.printArr(map);
  7. tool.printArr(map);
  8. tool.printArr(map);
  9. }
  10. }
  11. class Mytool{ //类
  12. //定义一个输出数组方法
  13. public void printArr(int map[][]){
  14. for(int i = 0;i < map.length;i++){
  15. for (int j = 0; j < map[i].length; j++) {
  16. System.out.print(map[i][j] + "\t");
  17. }
  18. System.out.println();
  19. System.out.println("==========");
  20. }
  21. }
  22. }
  1. public class MethodDetail_04 {
  2. //1.一个方法最多有一个返回值 【思考:如何返回多个值:可以使用数组】
  3. public static void main(String[] args) {
  4. AA a = new AA();
  5. int res[] = a.getSumAndSub(6,4);
  6. System.out.println("和 = " + res[0]);
  7. System.out.println("差 = " + res[1]);
  8. }
  9. }
  10. class AA{
  11. //和 与 差
  12. public int[] getSumAndSub(int n1,int n2){
  13. int resArr[] = new int[2]; //创建一个数组
  14. resArr[0] = n1 + n2;
  15. resArr[1] = n1 - n2;
  16. return resArr;
  17. }
  18. //2..返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)
  19. // 看上述代码getSumAndSnb
  20. // 3.如果方法要求有返回数据类型,则方法体中最后的执行语句必须为return 值;而且要求返回值类型必须和return的值类型一致或兼容
  21. public double f1(){ //要求
  22. double d1 = 1.1 * 3;
  23. int a = 100;
  24. return a; //返回 //int->double 兼容
  25. }
  26. // 4.如果方法是void,则方法体中可以没有return语句,或者 只写 return;
  27. // 5.方法名遵循驼峰命名法,最好见名知义,表达出该功能的意思即可,比如 得到两个数的和 getsum,开发中按照规范
  28. /*
  29. 二.形参列表
  30. 1.一个方法可以有0个参数,也可以有多个参数,中间用逗号隔开,比如 getSum(int n1,int n2)
  31. 2.参数类型可以为任意类型,包含基本类型或引用类型,比如 printArr(int[][] map)
  32. 3.调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型 的参数!【getSum)
  33. 4.方法定义时的参数称为形式参数,简称形参;方法调用时的传入参数称为实际参数,简称实参
  34. 实参和形参的类型要一致或兼容、个数、顺序必须一致![演示]
  35. 方法体
  36. 里面写完成功能的具体的语句,可以为输入、输出、变量、运算、分支、循环、方法调用,
  37. 但里面不能再定义方法!即:方法不能嵌套定义。[演示]
  38. */
  39. /*
  40. 三.方法调用细节说明
  41. 1.同一类中可以直接调用
  42. 2.跨类的方法调用,需要通过对象名调用------类似于 main 调用 class 类
  43. 3.*跨类的方法调用和方法的访问修饰符相关(后面细讲)
  44. */
  45. }

练习题

  1. public class MethodExercise_05 {
  2. public static void main(String[] args) {
  3. BA b = new BA();
  4. boolean c = b.num(1);
  5. System.out.println(c); //接受return的返回值
  6. //BA d = new BA();
  7. b.print(4,32,'#');
  8. }
  9. }
  10. //编写一个类 AA,判断一个数是奇数还是偶数,返回boolean
  11. class BA{
  12. public boolean num(int a) {
  13. // if(a % 2 == 1){
  14. // return true;
  15. // }else{
  16. // return false;
  17. // }
  18. return (a % 2 == 1) ? true : false;
  19. }
  20. //按要求,输出对应的行和列的字符
  21. public void print(int row,int col,char c){
  22. for (int i = 0; i < row; i++) {
  23. for (int j = 0; j < col; j++) {
  24. System.out.print(c);
  25. }
  26. System.out.println();
  27. }
  28. }
  29. }
  1. import java.util.Scanner;
  2. public class MethodParameter_06 {
  3. //成员方法传参机制
  4. // 1.形参的任何变化都不会影响实参;
  5. // 2.引用类型传递的是地址,可以通过形参来影响实参;
  6. // 形参和实参指向同一个存储地址空间,因此,形参改变空间的内容,会对地址空间内容发生永久性变化
  7. //3.
  8. public static void main(String[] args) {
  9. Scanner myScanner = new Scanner(System.in);
  10. System.out.print("输入第一个数 = ");
  11. int a = myScanner.nextInt();
  12. System.out.print("输入第二个数 = ");
  13. int b = myScanner.nextInt();
  14. AAA c = new AAA();
  15. c.swap(a,b);
  16. }
  17. }
  18. class AAA{
  19. public void swap(int a,int b){
  20. System.out.println("交换前\n a = " + a + "\t" + "b = " + b);
  21. a = a + b;
  22. b = a - b;
  23. a = a - b;
  24. System.out.println("交换后\n a = " + a + "\t" + "b = " + b);
  25. }
  26. }

克隆方法

  1. public class MethodExercise_07 {
  2. //克隆对象:要求新对象与旧对象是两个独立的对象,且属性相同
  3. public static void main(String[] args) {
  4. Persons p = new Persons();
  5. p.name = "minhao";
  6. p.age = 19;
  7. MyTools tools = new MyTools(); //创建一个tools对象
  8. Persons p2 = tools.copyPersons(p);
  9. //到此 p 和 p2是person对象,但是是两个独立的对象,属性相同
  10. System.out.println("age1 = " + p.age + "\t" + "name1:" + p.name);
  11. System.out.println("age2 = " + p2.age + "\t" + "name2:" + p2.name);
  12. System.out.println("p == p2");
  13. }
  14. }
  15. class Persons{
  16. String name;
  17. int age;
  18. }
  19. class MyTools{
  20. public Persons copyPersons(Persons p){
  21. //创建一个新对象
  22. Persons p2 = new Persons(); //方法之间的调用
  23. p2.name = p.name;//把原来对象的名字赋给p2.name
  24. p2.age = p.age;//把原来对象的年龄赋给p2.age
  25. return p2;
  26. }
  27. }

5.递归

1)递归的重要规则

递归的重要规则:
1.执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
2.方法的局部变量是独立的,不会相互影响,比如n变量
3.如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.
4.递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError,死龟了:)
5.当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,
    同时当方法执行完毕或者返回时,该方法也就执行完毕。
  1. import java.util.Scanner;
  2. public class Recursion_08 {
  3. //递归:自己调用自己
  4. public static void main(String[] args) {
  5. T t1 = new T(); //定义一个对象t1
  6. t1.test(9);
  7. //Scanner myScanner = new Scanner(System.in);
  8. //int i = myScanner.nextInt();
  9. int res = t1.factorial(5);
  10. System.out.println("res=" + res);
  11. }
  12. }
  13. class T{
  14. public void test(int n){
  15. if (n > 2){
  16. test (n - 1);
  17. }
  18. System.out.println("n = " + n);
  19. }
  20. public int factorial(int n){ //阶乘
  21. if (n==1){
  22. return 1;
  23. }else{
  24. return factorial(n - 1) * n;
  25. }
  26. }
  27. }

2)斐波那契数(必备)

3)猴子吃桃(蓝桥杯)

  1. import java.util.Scanner;
  2. public class RecursionExercise_09 {
  3. public static void main(String[] args) {
  4. Scanner myScanner = new Scanner(System.in);
  5. System.out.println("你想知道第几个数的斐波那契数:");
  6. int n = myScanner.nextInt();
  7. M m1 = new M();
  8. //斐波那契数
  9. if(m1.fibonacci(n) != -1) {
  10. System.out.println("当n = " + n + "时对应的斐波那契数 = " + m1.fibonacci(n));
  11. }else{
  12. System.out.println("滚");
  13. }
  14. //猴子吃桃
  15. System.out.println("你想知道第几天的桃子数量:");
  16. int day = myScanner.nextInt();
  17. int peachNum = m1.peach(day);
  18. if(peachNum != -1){
  19. System.out.println("第"+ day + "天的桃子数量为" + m1.peach(day));
  20. }else{
  21. System.out.println("滚");
  22. }
  23. }
  24. }
  25. class M {
  26. /*递归写出斐波那契数:1,1,2,3,5,8,13......给你一个整数,求出他的值是多少
  27. 思路:
  28. 1.n = 1;斐波那契数 = 1
  29. 2.n = 2;斐波那契数 = 1
  30. 3.n = 3;斐波那契数 = 2
  31. 4.n = 4;斐波那契数 = 3
  32. */
  33. public int fibonacci(int n) {
  34. if (n >= 1) {
  35. if (n == 1 || n == 2) {
  36. return 1;
  37. } else {
  38. return fibonacci(n - 1) + fibonacci(n - 2);
  39. }
  40. } else {
  41. System.out.println("你的输入有误");
  42. return -1;
  43. }
  44. }
  45. /*
  46. 猴子吃桃子问题:有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!
  47. 以后每天猴子都吃其中的一半,然后再多吃一个。当到第10天时,想再吃时(即还没吃),
  48. 发现只有1个桃子了。问题:最初共多少个桃子?
  49. 思路:
  50. 1. 第10天,1个桃子
  51. 2. 第9天,(day10 + 1) * 2 = 4个桃子
  52. 3. 第8天,(day9 + 1) * 2 = 10个桃子
  53. */
  54. public int peach(int day){
  55. if(day == 10){
  56. return 1;
  57. }else if(day >= 1&&day <= 9){
  58. return (peach(day + 1) + 1) * 2;
  59. }else{
  60. System.out.println("day的范围不在规定内");
  61. return -1;
  62. }
  63. }
  64. }

4)迷宫

  1. public class MiGong_10 {
  2. public static void main(String[] args) {
  3. //思路:
  4. //1.创建八行其列的迷宫,用二维数组表示
  5. //2.先规定 map 数组的元素值: 0 表示可以走, 1 表示不能走
  6. int map[][] = new int[8][7];
  7. //3.将第一行和最后一行设置为 1
  8. for (int i = 0; i < 7; i++) {
  9. map[0][i] = 1;
  10. map[7][i] = 1;
  11. }
  12. //4.将最左边和最右边的设置为 1
  13. for (int i = 0; i < 8; i++) {
  14. map[i][0] = 1;
  15. map[i][6] = 1;
  16. }
  17. //5.剩余障碍物
  18. map[3][1] = 1;
  19. map[3][2] = 1;
  20. //输出当前地图
  21. for (int i = 0; i < map.length; i++) {
  22. for (int j = 0; j < map[i].length; j++) {
  23. System.out.print(map[i][j] + " ");
  24. }
  25. System.out.println();
  26. }
  27. //使用findway给老鼠找路
  28. G g1 = new G();
  29. g1.findway(map,1,1);//引用传递
  30. System.out.println("\n===========找路的情况==========");
  31. for (int i = 0; i < map.length; i++) {
  32. for (int j = 0; j < map[i].length; j++) {
  33. System.out.print(map[i][j] + " ");
  34. }
  35. System.out.println();
  36. }
  37. }
  38. }
  39. class G{
  40. //递归回溯思想解决问题
  41. // 回溯现象:
  42. // 扩展:求出最短路径 a.穷举法 b.图
  43. // 1.findway方法就是用来找出迷宫路径
  44. // 2.找到返回true 否则返回false
  45. // 3.map 就是二维数组,即表示迷宫
  46. // 4.i,j就是老鼠的位置,初始化位置【1.1】
  47. // 5.因为是递归找路,先规定要求
  48. // 0 表示可以走, 1 表示障碍物,2 表示可以走, 3 表示走过,但不能走通
  49. // 6.当map[6][5] = 2 时,就表明找到通路了,否则继续找
  50. // 7.选择合适的策略下-->右-->上-->左
  51. public boolean findway(int map[][], int i,int j){
  52. if(map[6][5] == 2){//说明已经找到路了
  53. return true;
  54. }else{
  55. if(map[i][j] == 0){//当前点为0,表示可以走,但还没走
  56. //假设能够走通
  57. map[i][j] = 2;
  58. //使用找路的策略,来确定该位置是否真的可以走通
  59. //下-->右-->上-->左
  60. // if(findway(map,i + 1,j)){//下
  61. // return true;
  62. // }else if(findway(map,i,j + 1)){//右
  63. // return true;
  64. // }else if(findway(map,i - 1,j)){//上
  65. // return true;
  66. // }else if(findway(map,i,j - 1)){//左
  67. // return true;
  68. // }else{
  69. // map[i][j] = 3;
  70. // return false;
  71. // }
  72. //上-->右-->下-->左
  73. if(findway(map,i - 1,j)){//上
  74. return true;
  75. }else if(findway(map,i,j + 1)){//右
  76. return true;
  77. }else if(findway(map,i + 1,j)){//下
  78. return true;
  79. }else if(findway(map,i,j - 1)){//左
  80. return true;
  81. }else{
  82. map[i][j] = 3;
  83. return false;
  84. }
  85. }else{//map[i][j] = 1,2,3
  86. return false;
  87. }
  88. }
  89. }
  90. }

5)汉诺塔

  1. public class HanoiTower_11 {
  2. public static void main(String[] args) {
  3. Tower tower = new Tower();
  4. tower.move(2,'A','B','C');
  5. }
  6. }
  7. class Tower{
  8. //方法
  9. //num 表示要移动的个数,a,b,c 分别表示A,B,C塔
  10. public void move(int num,char a,char b,char c){
  11. //如果 num = 1
  12. if (num == 1){
  13. System.out.println(a + "->" + c);
  14. }else{
  15. //如果有多个盘,可以看成两个, 最下面的和上面所有的盘
  16. //1)先移动上面所有的盘到 b,借助 c
  17. move(num - 1, a, c, b);
  18. //2)把最下面的这个盘移动到 c
  19. System.out.println(a + "->" + c);
  20. //3)再将 b塔上的所有盘,移动到 c,借助a
  21. move(num - 1,b, a, c);
  22. }
  23. }
  24. }

6.方法重载

  1. public class OverLoad_12 {
  2. public static void main(String[] args) {
  3. /*
  4. 方法重载:
  5. 1. 方法名相同
  6. 2. 形参列表:必须不同(个数不同,类型不同,顺序不同,参数名无要求)
  7. 3. 返回值,无要求
  8. */
  9. /*1.编写程序,类Methods中定义三个重载方法。方法名为m。三个方法分别接受一个int参数,两个int参数
  10. 一个字符串参数。分别执行平方运算并输出结果,相乘并输出结果,输出字符串信息。在主类main()方法中分别
  11. 用参数区别调用三个方法。
  12. */
  13. Methods methods = new Methods();
  14. methods.m(8);
  15. methods.m(6,9);
  16. methods.m("旧人已故");
  17. /*2.在Methods类,定义三个重载方法max(),第一个方法,返回两个int值中的最
  18. 大值,第二个方法,返回两个double值中的最大值,第三个方法,返回三个
  19. double值中的最大值,并分别调用三个方法。
  20. */
  21. methods.max(6,9);
  22. methods.max(10.01,9.6);
  23. methods.max(10.1,9.6,2.5);
  24. }
  25. }
  26. class Methods{
  27. public void m(int n){
  28. System.out.println("平方结果 = " + (n * n));
  29. }
  30. public void m(int n,int a){
  31. System.out.println("相乘结果 = " + (n * a));
  32. }
  33. public void m(String b){
  34. System.out.println("传入的String = " + b);
  35. }
  36. public void max(int a,int b){
  37. int max = a > b ? a : b;
  38. System.out.println("两者中的最大值 = " + max);
  39. }
  40. public void max(double a,double b){
  41. double max = a > b ? a : b;
  42. System.out.println("两者中的最大值 = " + max);
  43. }
  44. public void max(double a,double b,double c){
  45. double max = a > (b > c ? b : c) ? a : (b > c ? b : c);
  46. System.out.println("两者中的最大值 = " + max);
  47. }
  48. }

7.可变参数

  1. public class VarParamenter_13 {
  2. public static void main(String[] args) {
  3. /*可变参数
  4. 基本概念:
  5. java允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法就可以通过可变参数实现
  6. 基本语法:
  7. 访问修饰符 返回类型 方法名(数据类型.. 形参名){
  8. }
  9. */
  10. HspMethod m = new HspMethod();
  11. System.out.println(m.sum(100,50,10));
  12. System.out.println(m.sum(12,56,766));
  13. }
  14. }
  15. class HspMethod{
  16. // 1.int...表示接受的是可变参数,类型是int
  17. // 2.使用可变参数时,可以当作是数组
  18. public int sum(int... nums){
  19. System.out.println("接受的参数个数:" + nums.length);
  20. int res = 0;
  21. int sum = 0;
  22. for (int i = 0; i < nums.length; i++) {
  23. res += nums[i];
  24. }
  25. return res;
  26. }
  27. }

细节

  1. public class VarParamenterDetail_14 {
  2. public static void main(String[] args) {
  3. /*
  4. 注意事项:
  5. 1. 可变参数的实参可以为0个或任意多个
  6. 2. 可变参数的实参可以为数组
  7. 3. 可变参数的本质是数组
  8. 4. 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
  9. 5, 一个参数列表中只能出现一个可变参数
  10. */
  11. //细节: 可变参数的实参可以为数组
  12. int arr[] = {1,2,3};
  13. TT t = new TT();
  14. t.f1(arr);
  15. }
  16. }
  17. class TT{
  18. public void f1(int... nums){
  19. System.out.println(nums.length);
  20. }
  21. //细节: 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
  22. public void f2(double str,double... nums){
  23. System.out.println();
  24. }
  25. }

8.作用域

  1. public class VarScope_16 {
  2. public static void main(String[] args) {
  3. /*
  4. P237.
  5. (变量)作用域基本使用:
  6. 1. 全局变量:也就是属性,作用域为整个类体
  7. 2. 属性在定义时,可以直接赋值
  8. 3. 局部变量:一般是指变量方法中定义的变量,作用域为定义他的代码块
  9. 4. 全局变量(属性)可以不赋值,直接使用,因为有默认值,局部变量必须赋值后
  10. 才可以使用,因为没有默认值。
  11. */
  12. /*
  13. P238-P239
  14. 作用域使用细节 Detail
  15. 1. 属性和局部变量可以重名,访问时遵循就近原则
  16. 2. 在同一个作用域中,比如在同一个成员方法中,两个局部变量,不能重名。
  17. 3. 属性生命周期较长,伴随对象的创建而创建,伴随着对象的销毁而销毁。
  18. 局部变量,生命周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而销毁。
  19. 即在一次方法调用过程中
  20. 4. 作用域的范围不同:
  21. 全局变量/属性:可以被本类或其他类使用(通过对象调用)
  22. 局部变量:只能在本类中使用
  23. 5. 修饰符不同
  24. 全局变量/属性 可以加修饰符
  25. 局部变量 不可以加修饰符
  26. */
  27. }
  28. }

9.构造器/构造方法

构造器的细节

//构造器的细节:
//1. 一个类可以定义多个构造器,即构造器重载
Personn p1 = new Personn("minhao");
System.out.println("p1 name = " + p1.name);
// 2.构造器名要和类名一致
// 3.构造器没有返回值

// 4.构造器是完成对象的初始化,并不是创建对象
// 5.在创建对象时,系统自动的调用该类的构造方法
//eg:p1.name = ...      (错误)只能由系统调用
  1. public class Construuctor_17 {
  2. public static void main(String[] args) {
  3. /*
  4. P240
  5. 构造方法/构造器
  6. ●看一个需求
  7. 我们来看一个需求:前面我们在创建人类的对象时,是先把一个对象创建好后,
  8. 再给他的年龄和姓名属性赋值,如果现在我要求,在创建人类的对象时,
  9. 就直接指定这个对象的年龄和姓名,该怎么做?这时就可以使用构造器
  10. ● 基本语法
  11. ·[修饰符]方法名(形参列表){
  12. 方法体;
  13. }
  14. 老韩说明:
  15. 1)构造器的修饰符可以默认,也可以是public,protected,private
  16. 2)构造器没有返回值
  17. 3)方法名 和类名字必须一样
  18. 4)参数列表 和 成员方法-样的规则
  19. 5)构造器的调用,由系统完成
  20. 基本介绍:
  21. 构造方法又叫构造器,是类的一种特殊的方法,他的作用主要是
  22. 完成对新对象的初始化。特点如下:
  23. 1.方法名和类名相同
  24. 2.没有返回值
  25. 3.在创建对象是,系统会自动的调用和该类的构造器完成对对象的初始化
  26. */
  27. //P241构造器的快速入门
  28. //在构造人类对象时,直接定义这个对象的年龄和姓名
  29. Personn p = new Personn("haoze",18);
  30. System.out.println("p的信息如下");
  31. System.out.println(p.name);
  32. System.out.println(p.age);
  33. //P242-P243
  34. // 构造器的细节:
  35. //1. 一个类可以定义多个构造器,即构造器重载
  36. Personn p1 = new Personn("minhao");
  37. System.out.println("p1 name = " + p1.name);
  38. // 2.构造器名要和类名一致
  39. // 3.构造器没有返回值
  40. // 4.构造器是完成对象的初始化,并不是创建对象
  41. // 5.在创建对象时,系统自动的调用该类的构造方法
  42. //eg:p1.name = ... (错误)只能由系统调用
  43. // 6.如果程序员没有定义构造器,系统会自动给类生成一个默认无参构造器
  44. Dog dog = new Dog();
  45. // 7.一旦定义了自己的构造器,默认无参构造器就会被覆盖,不能使用,除非显式的定义一下
  46. //即: Dog(){}
  47. Dog dog1 = new Dog("zhaomin");
  48. }
  49. }
  50. class Dog{
  51. //如果程序员没有定义构造器,系统会自动给类生成一个默认无参构造器
  52. //javac 反编译
  53. /*
  54. 默认构造器
  55. Dog(){
  56. }
  57. */
  58. //一旦定义了自己的构造器,默认无参构造器就会被覆盖,不能使用,除非显式的定义一下
  59. public Dog(String dName){
  60. //...
  61. }
  62. Dog(){ //显式的定义一下
  63. }
  64. }
  65. class Personn{//此处用Personn是因为在同一文件夹下,我的Person已经定义过类了
  66. String name;
  67. int age;
  68. // 1.没有返回值,故没有void
  69. // 2.构造器的名称与类的名称一样,都为Personn
  70. // 3.(String pName,int pAge) 时构造器形参列表,规则与成员方法一样
  71. public Personn(String pName,int pAge){
  72. System.out.println("构造器被调用~~完成对象属性的初始化");
  73. name = pName;
  74. age = pAge;
  75. }
  76. public Personn(String pName){
  77. name = pName;
  78. }
  79. }

10.对象创建流程分析(面试题)

String 是引用类型 所以在常量区调用地址

Java 内存的结构分析
        1.栈:一般存放基本数据类型
        2.堆:存放对象(Cat cat,数组等)
        3.方法区L:常量区(常量,比如字符串),类加载信息

11.this

thisDetail

  1. public class ThisDetail_19 {
  2. public static void main(String[] args) {
  3. /*
  4. ThisDetail.java
  5. 1.this关键字可以用来访问本类的属性、方法、构造器
  6. 2.this用于区分当前类的属性和局部变量
  7. 3.访问成员方法的语法:this.方法名(参数列表);
  8. 4.访问构造器语法:this(参数列表);注意只能在构造器中使用(只能构造器中访问另一个构造器
  9. 5.this不能在类定义的外部使用,只能在类定义的方法中使用。
  10. */
  11. Tf t2 = new Tf();
  12. //3.访问成员方法的语法:this.方法名(参数列表);
  13. t2.f2();
  14. t2.f3();
  15. }
  16. }
  17. class Tf{
  18. String name = "tom";
  19. int num = 100;
  20. // 访问构造器语法:this(参数列表)
  21. // 4.访问构造器语法:this(参数列表);注意只能在构造器中使用(只能构造器中访问另一个构造器,必须放在第一条语句)
  22. //注意:访问构造器语法:this(参数列表);必须放在第一条语句(与继承有关)
  23. public Tf(){
  24. this("tom",12);//必须放在第一条语句
  25. System.out.println("Tf() 构造器");
  26. }
  27. public Tf(String name,int age){
  28. System.out.println("Tf(String name,int age) 构造器");
  29. }
  30. public void f3(){
  31. String name = "jack";
  32. int num = 99;
  33. //传统方法 就近原则
  34. System.out.println("name=" + name + "\t" + "num = " + num);
  35. //this调用 属性
  36. System.out.println("name=" + this.name + "\t" + "num = " + this.num);
  37. }
  38. //3.访问成员方法的语法:this.方法名(参数列表);
  39. public void f1(){
  40. System.out.println("f1()方法..");
  41. }
  42. public void f2(){
  43. System.out.println("f2()方法..");
  44. //调用f1
  45. //方法1:
  46. f1();
  47. //方法2:
  48. this.f1();//继承细讲
  49. }
  50. }

Exercise

  1. public class ThisExercise_20 {
  2. public static void main(String[] args) {
  3. /*
  4. 定义Person类,里面有name、age属性,并提供compareTo比较方法,用于判断是否和另一个人相等,
  5. 提供测试类TestPerson用于测试,名字和年龄完全-:一样,就返回true,否则返回false
  6. */
  7. Monkey m1 = new Monkey("monkey",20);
  8. Monkey m2 = new Monkey("monkey",18);
  9. System.out.println("m1和m2的比较结果 = " + m1.compareTo(m2));
  10. }
  11. }
  12. class Monkey{
  13. String name;
  14. int age;
  15. //构造器
  16. public Monkey(String name,int age){
  17. this.name = name;
  18. this.age = age;
  19. }
  20. //compareTo比较方法
  21. public boolean compareTo(Monkey p){
  22. return this.name.equals(p.name) && this.age == p.age;
  23. }
  24. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/986958
推荐阅读
相关标签
  

闽ICP备14008679号