1、昨日复习

  1. 面向对象思想编程内容的三条主线分别是什么
    ①类及类的成员:属性、方法、构造器;代码块、内部类
    ②面向对象的三大特征:封装、继承、多态
    ③其它关键字:this,super,abstract,interface,static,final,package,import

面向对象的编程思想?
(类、对象;面向对象的三大特征;。。。)
2. 谈谈你对面向对象中类和对象的理解,并指出二者的关系?
类:抽象的、概念上的内容
对象:实实在在存在的一个个体。
对象是由类派生出来的。
3. 面向对象思想的体现一:类和对象的创建和执行操作有哪三步?
①创建类
②类的实例化
③调用对象的结构:”对象.属性” “对象.方法”
4. 画出如下代码在执行时的内存分配情况
class Car{
String color = “red”;
int num = 4;
void show(){
int a = 10;
System.out.println(“color=”+color+”,num=”+num);
}
}
class CarTest {
public static void main(String[] args) {
Car c1 = new Car();
Car c2 = new Car();
c1.color = “blue”;
c1.show();
c2.show();
} }

  1. 类的方法内是否可以定义变量?是否可以调用属性?是否可以定义方法?是否可以调用方法?
    是;是;否;是

JVM内存结构
编译完源程序以后,生成一个或多个字节码文件。
我们使用JVM中的类的加载器和解释器对生成的字节码文件进行解释运行。意味着,需要将字节码文件对应的类加载到内存中,涉及到内存解析。
《JVM规范》
虚拟机栈,即为平时提到的结构,我们将局部变量存储在栈结构中
堆,我们将new出来的结构(比如:数组、对象)加载在堆空间中,补充:对象的属性(非static)加载在堆空间中。
方法区:类的加载信息、常量池、静态域。
QQ截图20211210143351.png

2、理解“万事万物皆对象”

1.JAVA语言范畴中,我们都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构
2.涉及到java语言与前端HTML、后端的数据库交互时,前后端的结构在java层面交互时,都体现为类、对象。

3、匿名对象的使用

没有定义对象名 new 类名().show(); 可以调用类的属性和方法。
开发中如何使用匿名对象?

4、再谈方法

4.1 方法的重载

重载的概念:
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。(两同一不同:同一类、相同方法名;参数列表不同)
跟方法的权限修饰符、返回值类型、形参变量、方法体都没有关系!
重载的特点︰
与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型)。调用时,根据方法参数列表的不同来区别。

  1. package com.atguigu.java;
  2. /*
  3. * 2.编写程序,定义三个重载方法并调用。方法名为mOL。 三个方法分别接收一个int参数、两个int参数、一个字符串参数。分别
  4. 执行平方运算并输出结果,相乘并输出结果,输出字符串信息。
  5. 在主类的main ()方法中分别用参数区别调用三个方法。
  6. 3.定义三个重载方法max(),第一个方法求两个int值中的最大值,第二个方
  7. 法求两个double值中的最大值,第三个方法求三个double值中的最大值,
  8. 并分别调用三个方法。
  9. */
  10. public class Exerr1 {
  11. public static void main(String[] args) {
  12. Method m = new Method();
  13. m.mOL(5);
  14. m.mOL(8, 5);
  15. m.mOL("我去吃饭了!!!");
  16. System.out.println(m.getMax(5, 9));
  17. System.out.println(m.getMax(5.7, 5.2, 9.6));
  18. }
  19. }
  20. class Method {
  21. public void mOL(int a) {
  22. System.out.println(a * a);
  23. }
  24. public void mOL(int a, int b) {
  25. System.out.println(a * b);
  26. }
  27. public void mOL(String s) {
  28. System.out.println(s);
  29. }
  30. public int getMax(int a, int b) {
  31. return a > b ? a : b;
  32. }
  33. public double getMax(double a, double b) {
  34. return a > b ? a : b;
  35. }
  36. public double getMax(double a, double b, double c) {
  37. return (a > b ? a : b) > c ? (a > b ? a : b) : c;
  38. }
  39. }

4.2 可变形参的方法

QQ截图20211210163909.png
1.具体使用:
1.1声明格式:方法名(参数的类型名 …参数名)
1.2可变参数:方法参数部分指定类型的参数个数是可变多个:0个,1个或多个
1.3可变个数形参的方法与同名的方法之间,彼此构成重载
1.4可变参数方法的使用与方法参数部分使用数组是一致的
1.5方法的参数部分有可变形参,需要放在形参声明的最后
1.6在一个方法的形参位置,最多只能声明一个可变个数形参
注意:可变形参和同一类型的数组不构成重载

4.3 方法参数的值传递机制

关于变量的赋值:
如果是基本数据类型,此时赋值的是变量所保存的数据值。
如果是引用数据类型,此时赋值的是变量所保存的数据的地址值。
形参:方法声明时的参数
实参:方法调用时实际传给形参的参数值
形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参
QQ截图20211211165344.png

4.4 递归方法

递归方法:一个方法体内调用它自身。
方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。
递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环。

  1. package com.atguigu.java;
  2. public class Practice3 {
  3. public static void main(String[] args) {
  4. // 已知有一个数列:f(0) = 1,f(1) = 4,f(n+2)=2*f(n+1) + f(n),其中n是大于0的整数,求f(10)的值。
  5. Practice3 p = new Practice3();
  6. // p.f(0);
  7. System.out.println(p.f(10));
  8. }
  9. public int f(int n) {
  10. if (n == 0) {
  11. return 1;
  12. } else if (n == 1) {
  13. return 4;
  14. } else if (n > 1) {
  15. return f(n - 2) + 2 * f(n - 1);
  16. } else {
  17. System.out.println("n的范围有误!!!");
  18. return -1;
  19. }
  20. }
  21. }
  1. package com.atguigu.java;
  2. public class Practice4 {
  3. public static void main(String[] args) {
  4. // 已知一个数列:f(20) = 1,f(21) = 4,f(n+2) =
  5. // 2*f(n+1)+f(n),其中n是大于0的整数,求f(10)的值。
  6. Practice4 p = new Practice4();
  7. // p.f(22);
  8. System.out.println(p.f(10));
  9. }
  10. public int f(int n) {
  11. if (n == 20) {
  12. return 1;
  13. } else if (n == 21) {
  14. return 4;
  15. } else {
  16. return f(n + 2) - 2 * f(n + 1);
  17. }
  18. }
  19. }
  1. package com.atguigu.java;
  2. /*
  3. * 输入一个数据n,计算斐波那契数列(Fibonacci)的第n个值
  4. 1 1 2 3 5 8 13 21 34 55
  5. 规律:一个数等于前两个数之和
  6. 要求:计算斐波那契数列(Fibonacci)的第n个值,并将整个数列打印出来
  7. */
  8. public class Practice5 {
  9. public static void main(String[] args) {
  10. Practice5 p = new Practice5();
  11. p.method(10);
  12. }
  13. public void method(int n){
  14. for(int i=1;i<=n;i++){
  15. System.out.print(f(i)+"\t");
  16. }
  17. }
  18. public int f(int n) {
  19. if (n == 1) {
  20. // System.out.print(1 + "\t");
  21. return 1;
  22. } else if (n == 2) {
  23. // System.out.print(1 + "\t");
  24. // f(n-1);
  25. return 1;
  26. } else if (n > 2) {
  27. // System.out.println(f(n-1)+f(n-2));
  28. return f(n - 1) + f(n - 2);
  29. } else {
  30. System.out.println("超出范围");
  31. return -1;
  32. }
  33. }
  34. }