1.面向过程与面向对象

image.png

2.Java基本元素:类与对象

image.png
image.png

  1. package day08;
  2. /*
  3. *一、设计类,其实就是设计类的成员
  4. *
  5. * 属性 =成员变量 =field =域、字段
  6. *
  7. * 方法 =成员方法=函数=method
  8. *
  9. * 创建类的对象 =类的实例化 =实例化类
  10. *
  11. * 二、类和对象的使用(面向对象思想落地的实现)
  12. * 1、创建类,设计类的成员
  13. * 2.创建类的对象
  14. * 3.通过“对象.属性”或“对象.方法”调用对象的结构
  15. *
  16. *
  17. * 三、如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性,(非static的)
  18. 意味着,如果我们修改一个对象的属性A,则不影响另外一个对象属性A的值
  19. *
  20. * 四、对象的内存解析
  21. *
  22. *
  23. *
  24. */
  25. //测试类
  26. public class PersonTest {
  27. public static void main(String[] args) {
  28. //创建person类的对象
  29. Person p1=new Person();
  30. //调用对象的结构:属性、方法
  31. //调用属性:“对象。属性”
  32. p1.name="Tom";
  33. p1.isMale=true;
  34. System.out.println(p1.age);//1
  35. System.out.println(p1.name);//Tom
  36. //调用方法:“对象。方法”
  37. p1.eat();
  38. p1.sleep();
  39. p1.talk("Chinese");
  40. //******************************
  41. Person p2=new Person();
  42. System.out.println(p2.name);//null
  43. System.out.println(p2.isMale);//false
  44. //**********************************
  45. //讲p1变量保存的对象地址赋给p3,导致p1和p3指向了空间中的同一个对象实体
  46. Person p3=p1;
  47. System.out.println(p3.name);//Tom
  48. p3.age=10;
  49. System.out.println(p1.age);//10
  50. }
  51. }
  52. class Person{
  53. //属性
  54. String name;
  55. int age =1;
  56. boolean isMale;
  57. //方法
  58. public void eat(){
  59. System.out.println("人可以吃饭");
  60. }
  61. public void sleep(){
  62. System.out.println("人可以睡觉");
  63. }
  64. public void talk(String language){
  65. System.out.println("人可以说话,使用的是:"+language);
  66. }
  67. }

3.对象的创建和使用

image.png
说明:如果创建了一个类的多个对象,对于类中定义的属性,每个对象都拥有各自的一套副本,且互不干扰。

image.png

image.png
**

4.类的成员之一:属性

4.1 语法格式

image.png

4.2分类的变量:成员变量和局部变量

image.png

4.2.1 成员变量和局部变量的区别

image.png

4.3对象属性得到默认初始化赋值

image.png

4.4Java对象变量程序的基本应用实例

  1. package day08;
  2. /*
  3. *
  4. * 类中属性的使用
  5. *
  6. * 属性(成员变量) vs 局部变量
  7. * 1.相同点
  8. * 1-1定义变量的格式,数据类型 变量名=变量值
  9. * 1-2 先声明,后使用
  10. * 1-3 变量都有其对应的作用域
  11. *
  12. * 2.不同点
  13. * 2-1:在类中声明的位置不同
  14. * 属性:直接定义在类的一对{}内
  15. * 局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量
  16. *
  17. * 2-2 关于权限修饰符的不同
  18. * 属性:可以在声明属性时,指明其权限,使用权限修饰符
  19. * 常用的权限修饰符:private public 缺省(default) protect ---->封装性
  20. * 局部变量,不可以使用权限修饰符
  21. *
  22. * 2-3默认初始化值的情况
  23. * 属性:类的属性、根据其类型,都有默认初始化值
  24. * 整形(byte、short、int、long):0
  25. * 浮点型(float、double):0.0
  26. * 字符型(char)0或‘\u0000’
  27. * 布尔类型(boolean) :false
  28. *
  29. * 引用数据类型(类、数组、接口),null
  30. *
  31. * 局部变量: 没有默认初始化值。
  32. * 意味着,我们在调用局部变量之前,一定要显示赋值
  33. * 特别的:形参在调用的时候,我们赋值即可
  34. *
  35. * 2-4 在内存中加载的位置
  36. * 属性:加载到堆空间中(非static)
  37. * 局部变量加载到栈空间
  38. */
  39. public class UserTest {
  40. public static void main(String[] args) {
  41. User u1=new User();
  42. System.out.println(u1.name);
  43. System.out.println(u1.age);
  44. System.out.println(u1.isMale);
  45. u1.talk("日语");
  46. }
  47. }
  48. class User{
  49. //属性{或成员变量}
  50. String name;
  51. int age;
  52. boolean isMale;
  53. public void talk(String language){//language 形参
  54. System.out.println("我们使用"+language+"进行交流");
  55. }
  56. public void eat() {
  57. String food = "烙饼";//局部变量
  58. System.out.println("北方人喜欢吃"+food);
  59. }
  60. }

5.类的成员之二:方法

5.1什么是方法

image.png

5.2方法的声明格式

image.png

5.3方法的分类

  1. **按照是否有形参和返回值**<br />**![image.png](https://cdn.nlark.com/yuque/0/2020/png/1630970/1594617485498-653d0ee2-c67c-4830-93f7-e6adb3fe040b.png#align=left&display=inline&height=315&margin=%5Bobject%20Object%5D&name=image.png&originHeight=315&originWidth=1129&size=58222&status=done&style=none&width=1129)**

5.4注意

image.png

  1. package day08;
  2. /*
  3. * 类中方法的声明和使用
  4. *
  5. * 方法、描述类应该具有的功能
  6. * 比如:Math类 sqrt() random ....
  7. * Scanner类,nextXxx() ....
  8. * Array类:sort() binarySearch() toString() equals()
  9. *
  10. *
  11. * 1.举例:
  12. * public void eat(){}
  13. * public void sleep(int hour){}
  14. * public String getName(){}
  15. * public String getNation(String nation){}
  16. *
  17. *
  18. *2.方法的声明:
  19. * 权限修饰符 返回值类型 方法名(形参列表){
  20. * 方法体
  21. * }
  22. * 注意:static final abstract 来修饰的方法
  23. *
  24. * 3.说明:
  25. * 3.1关于权限修饰符: 关于权限修饰符,默认方法的权限修饰符先都使用public
  26. * Java规定的4种权限修饰符:private public 缺省 protected
  27. *
  28. * 3-2 返回值类型: 有返回值 vs 无返回值
  29. * 3.2.1 如果方法有返回值,则必须在方法声明时,指定返回值的类型
  30. * 同时,方法中,需要使用return 关键字来返回指定类型的变量或常量
  31. * 如果方法没有返回值,则方法声明时,使用void来表示,通常,在没有返回值的
  32. * 方法中,就可以不使用return ,但是如果使用的话,只能“return;”表示
  33. * 结束此方法的意思。
  34. *
  35. * 3.2.2我们定义方法该不该有返回值?
  36. * ①题目要求
  37. * ②凭经验 ,具体问题具体分析
  38. *
  39. * 3-3 方法名:属于标识符,遵循标识符的规则和规范,“见名知意”
  40. *
  41. * 3-4 形参列表:方法可以声明0个,1个或者多个形参
  42. * 3.4.1 格式 数据类型1 形参1,数据类型2 形参2,。。。。。
  43. *
  44. * 3.4.2 我们定义方法时,该不该定义形象?
  45. * ①题目要求
  46. * ② 凭经验 ,具体问题具体分析
  47. *
  48. * 3-5 方法体,方法功能的体现
  49. *
  50. *
  51. * 4. return 关键字的使用:
  52. * 1.使用范围,使用 在方法体中
  53. * 2. 作用:① 结束方法
  54. * ② 针对有返回值类型的方法,使用“return 数据”方法返回所要的数据
  55. * 3.注意点:return 后面不能声明执行语句
  56. *
  57. *
  58. * 5.方法的使用中,可以调用当前类的属性或方法
  59. * 既方法内部可以调用其他方法
  60. * 特殊的,方法A中调用了方法A就是递归调用
  61. *
  62. * 在方法中不能 定义新的方法
  63. */
  64. public class CustomerTest {
  65. public static void main(String[] args) {
  66. Customer cust1=new Customer();
  67. cust1.eat();
  68. int arr[]=new int[]{2,3,4};
  69. cust1.sort(arr);
  70. cust1.sleep(8);
  71. }
  72. }
  73. class Customer{
  74. //属性
  75. String name;
  76. int age;
  77. boolean isMale;
  78. //方法
  79. public void eat(){
  80. System.out.println("客户吃饭");
  81. return;
  82. // return 后面不可以声明表达式
  83. // System.out.println("hello");
  84. }
  85. public void sleep(int hour){
  86. System.out.println("休息了"+hour+"小时");
  87. eat();
  88. }
  89. public String getName(){
  90. return "Tom";
  91. }
  92. public String getNation(String nation){
  93. String info ="我的国籍是:"+nation;
  94. return info;
  95. }
  96. public void sort(int [] arr){
  97. }
  98. }

6.再谈方法

6.1 方法的重载

image.png

6.1.1方法的重载的具体应用

  1. package day09;
  2. /*
  3. * 方法的重载(overload) loading...
  4. *
  5. * 1.定义:在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不统即可
  6. *
  7. * 两同一不同:同一个类,相同方法名
  8. * 参数列表不同:参数个数不同,参数类型不同
  9. *
  10. * 2.举例:
  11. * Arrays类中重载的sort() /binarySearch
  12. *
  13. * 3.判断是否重载:
  14. * 跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系
  15. *
  16. * 4.在通过对象调用方法时,如何确定某一个指定的方法
  17. * 方法名----> 参数列表
  18. *
  19. *
  20. */
  21. public class OverLoadTest {
  22. public static void main(String[] args) {
  23. OverLoadTest test =new OverLoadTest();
  24. test.getSum(1, 2 );
  25. }
  26. //如下4个方法构成了重载
  27. public void getSum(int i,int j){
  28. System.out.println("1");
  29. }
  30. public void getSum(double d1,double d2){
  31. System.out.println("2");
  32. }
  33. public void getSum(String s,int i){
  34. System.out.println("3");
  35. }
  36. public void getSum(int i,String s){
  37. System.out.println("4");
  38. }
  39. //以下三个均是错误的重载
  40. // public void getSum(int i,int j){
  41. // return 0;
  42. // }
  43. // public void getSum(int m,int n){
  44. // return 0;
  45. // }
  46. // private void getSum(int i,int j){
  47. // return 0;
  48. // }
  49. }
  1. package day09exer;
  2. /*
  3. *
  4. *1.编写程序,定义三个重载方法并调用。方法名为mOL.
  5. *三个方法分别接收一个int参数、两个int参数、一个字符串参数。
  6. *分别执行平方运算并输出结果,相乘并输出结果,
  7. *输出字符串信息。在主类的main ()方法中分别用参数区别调用三个方法。
  8. *
  9. 2.定义三个重载方法max(),第一个方法求两个int值中的最大值,
  10. 第二个方法求两个double值中的最大值,
  11. 第三个方法求三个double值中的最大值,并分别调用三个方法
  12. *
  13. */
  14. public class OverLoadExer {
  15. public static void main(String[] args) {
  16. OverLoadExer ole =new OverLoadExer();
  17. ole.mOL(3);
  18. ole.mOL("我喜欢你");
  19. ole.mOL(2, 3);
  20. ole.max(2.3, 4.5);
  21. ole.max(6, 3);
  22. System.out.println(ole.max(3, 1, 7));
  23. }
  24. //如下三个方法构成重载
  25. public void mOL(int i){
  26. System.out.println(i*i);
  27. }
  28. public void mOL(int i ,int j){
  29. System.out.println(i*j);
  30. }
  31. public void mOL(String s){
  32. System.out.println(s);
  33. }
  34. public void max(int i,int j){
  35. System.out.println(i>j?i:j);
  36. }
  37. public void max(double d1,double d2){
  38. System.out.println(d1>d2?d1:d2);
  39. }
  40. public double max(double d1,double d2,double d3){
  41. double max=(d1>d2) ? d1 : d2;
  42. return (max >d3)?max:d3;
  43. }
  44. }

6.2 可变形参的方法

image.png
image.png

  1. package day09;
  2. /*
  3. *可变个数形参的方法
  4. *
  5. *1.JDK5.0新增的内容
  6. *2.具体使用
  7. * 2.1可变个数形参的格式,数据类型... 变量名
  8. * 2.2 当调用可变个数形参的方法时,传入的参数个数可以是0个,1个,2个...多个
  9. * 2.3 可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
  10. * 2.4 可变个数形参的方法与本类中方法名相同,形参也相同的方法不能共存
  11. * 2.5 可变个数形参在方法的形参中,必须声明在末尾
  12. * 2.6 可变个数形参在方法的形参中,做多只能声明一个可变形参
  13. */
  14. public class MethodArgsTest {
  15. public static void main(String[] args) {
  16. MethodArgsTest test =new MethodArgsTest();
  17. test.show("hello");
  18. test.show("hello","world");
  19. //1. test.show(new String[]{"aa","bb","cc"});
  20. //2. test.show("aa","bb","cc");
  21. //1和2两句均有相同的作用
  22. }
  23. // public void show(int i){
  24. //
  25. // }
  26. // public void show(String s){
  27. //
  28. // }
  29. //可变个数形参的格式
  30. public void show(String ...strs){
  31. System.out.println("show(String ...strs)");
  32. for(int i=0;i<strs.length;i++){
  33. System.out.println(strs[i]);
  34. }
  35. }
  36. public void show(int ...i){
  37. System.out.println("show(int ...i)");
  38. }
  39. // public void show(String[] args){
  40. //
  41. // }
  42. //The variable argument type String of the method show
  43. //must be the last parameter
  44. // public void show(String ...strs,int i){
  45. //
  46. // }
  47. public void show(int i,String ...strs){
  48. }
  49. }

6.3 方法参数的值传递机制

6.3.1基本数据类型和引用数据类型的赋值传递

  1. package day09exer;
  2. /*
  3. * 关于变量的赋值
  4. *
  5. * 如果变量是基本数据类型,此时赋值的是变量所保存的数据值。
  6. * 如果变量是引用数据类型,此时赋值的是变量所保存的数据的地址值。
  7. *
  8. */
  9. public class ValueTransferTest {
  10. public static void main(String[] args) {
  11. System.out.println("***********基本数据类型*******************");
  12. int m=10;
  13. int n=m;
  14. System.out.println("m= "+m+"n="+n);
  15. n=20;
  16. System.out.println("m= "+m+"n="+n);
  17. System.out.println("************引用数据类型******************");
  18. Order o1=new Order();
  19. o1.orderId=1001;
  20. Order o2=o1; //赋值以后,o1和o2的地址值相同,都指向了堆空间中的同一个对象实体
  21. System.out.println("o1.orderId="+o1.orderId+" o2.orderId="+o2.orderId);
  22. o2.orderId=1002;
  23. System.out.println("o1.orderId="+o1.orderId+" o2.orderId="+o2.orderId);
  24. }
  25. }
  26. class Order{
  27. int orderId;
  28. }

6.3.2值传递

image.png

  1. package day09exer;
  2. /*
  3. * 方法的形参的传递机制:值传递
  4. *
  5. * 1.形参:方法定义时,声明在小括号内的值
  6. * 实参:方法调用时,实际传递给形参的数据
  7. *
  8. * 2.值传递机制:
  9. * 如果参数是基本数据类型,此时实参赋给形参的是,实参真实存储的数据
  10. * 如果变量是引用数据类型,此时实参赋给形参的是实参存储数据的
  11. */
  12. public class ValueTransferTest1 {
  13. public static void main(String[] args) {
  14. int m=10;
  15. int n=20;
  16. //System.out.println("m="+m+" n="+n);
  17. //交换两个变量的值的操作
  18. // int temp =m;
  19. // m=n;
  20. // n=temp;
  21. ValueTransferTest1 test =new ValueTransferTest1();
  22. test.swap(m,n);
  23. System.out.println("1"+"m="+m+" n="+n);
  24. }
  25. public void swap(int m,int n){
  26. int temp =m;
  27. m=n;
  28. n=temp;
  29. System.out.println("m="+m+" n="+n);
  30. }
  31. }

6.4 递归方法

  1. package day09;
  2. /*
  3. *递归方法的使用(了解)
  4. * 递归方法:一个方法体内调用它自身。
  5.  方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。
  6.  递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环。
  7. *
  8. *
  9. *
  10. */
  11. public class RecrusionTest {
  12. public static void main(String[] args) {
  13. //例1:计算1-100之间所有自然数的和
  14. //方式一
  15. // int sum=0;
  16. // for(int i=1;i<=100;i++){
  17. // sum+=i;
  18. // }
  19. //
  20. RecrusionTest test =new RecrusionTest();
  21. int sum1= test.getSum(100);
  22. System.out.println(sum1);
  23. System.out.println("**********************");
  24. int f10=test.f(10);
  25. System.out.println(f10);
  26. }
  27. public int getSum(int n){
  28. if(n==1){
  29. return 1;
  30. }else {
  31. return n+getSum(n-1);
  32. }
  33. }
  34. //例3:已知有一个数列:f(0) = 1,f(1) = 4,f(n+2)=2*f(n+1) + f(n)
  35. // 其中n是大于0的整数,求f(10)的值。
  36. public int f(int n){
  37. if(n==0){
  38. return 1;
  39. }else if(n==1){
  40. return 4;
  41. }else{
  42. return 2*f(n-1)+f(n-2);
  43. }
  44. }
  45. }

7.OOP特征之一:封装与隐藏

image.png
image.png
image.png
image.png

  1. package day10;
  2. /*
  3. *面向对象的特征一:封装与隐藏
  4. *一、问题的引入
  5. * 当我们创建一个类的对象以后,可以通过“对象.属性”的方式,对对象的属性进行赋值
  6. * 这里,赋值操作要受到属性的数据类型和存储范围的制约。除此之外,没有其他制约条件
  7. * ,但是在实际问题中,我们往往需要给属性赋值,加入额外的限制条件,这个条件就不能在
  8. * 属性声明时体现,我们只能通过方法进行限制条件的添加(比如 setLegs())
  9. * 同时,我们需要避免用户载使用“对象.属性”的方式对属性进行赋值,则需要将属性声明为
  10. * 私有的(private)
  11. * ------>此时,针对于属性就体现了封装性
  12. *
  13. * 二、封装性的体现
  14. * 我们将类的属性xxx私有化(private),同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)此属性的值
  15. *
  16. * 拓展:封装性的体现:①如上 ②不对外暴露的私有的方法 ③ 单例模式 ...
  17. *
  18. *三、封装性的体现,需要权限修饰符来配合。
  19. * 1.Java规定的4种权限:private、缺省(default)、protected、public
  20. * 2.4种权限可以用来修饰类及类的内部结构:属性、方法、构造器、内部类
  21. * 3.具体的,4种权限都可以用来饰类及类的内部结构:属性、方法、构造器、内部类
  22. * 修饰类的话,只能使用缺省、public
  23. *
  24. */
  25. public class AnimalTest {
  26. public static void main(String[] args) {
  27. Animal a =new Animal();
  28. a.name="大黄";
  29. a.setAge(1);
  30. //a.legs=4;//The field Animal.legs is not visib
  31. a.setLegs(-6);
  32. a.show();
  33. }
  34. }
  35. class Animal{
  36. String name;
  37. private int age;
  38. private int legs;//腿的个数
  39. public void setLegs(int l){
  40. if(l>=0 && l%2== 0){
  41. legs=l;
  42. }else{
  43. legs=0;
  44. //抛出一个异常(暂时没有讲)
  45. }
  46. }
  47. public int getLegs(){
  48. return legs;
  49. }
  50. public void eat(){
  51. System.out.println("动物进食");
  52. }
  53. public void show(){
  54. System.out.println("name= "+name+",age= "+age+",legs= "+legs);
  55. }
  56. public int getAge() {
  57. return age;
  58. }
  59. public void setAge(int age) {
  60. this.age = age;
  61. }
  62. }

8.类的成员之三:构造器

8.1构造器重载

image.png
image.png

8.2javaBean

image.png

  1. package day10java1;
  2. /*
  3. *
  4. * JavaBean是一种Java语言写成的可重用组件。
  5.  所谓javaBean,是指符合如下标准的Java类:
  6. >类是公共的
  7.  >一个无参的公共的构造器
  8.  >有属性,且有对应的get、set方法
  9. *
  10. *
  11. */
  12. //***************满足以下条件的就是javaBean******************
  13. //*******************类是公共的********************
  14. public class Customer {
  15. //********************有属性*********************
  16. private int id;
  17. private String name;
  18. //****************一个无参的公共的构造器**************
  19. public Customer(){
  20. }
  21. //*******************有对应的get、set方法***************
  22. public int getId() {
  23. return id;
  24. }
  25. public void setId(int id) {
  26. this.id = id;
  27. }
  28. public String getName() {
  29. return name;
  30. }
  31. public void setName(String name) {
  32. this.name = name;
  33. }
  34. }

8.3 UML类图

image.png

9.关键字:this

image.png
image.png
image.png

10.关键字:package、import

image.png
image.png

image.png

  1. package day10;
  2. import java.lang.reflect.Field;
  3. import java.text.FieldPosition;
  4. import java.util.*;
  5. import day10exer3.Account;
  6. import day10exer3.Bank;
  7. import static java.lang.System.*;
  8. import static java.lang.Math.*;
  9. /**
  10. *一、 package关键字的使用
  11. * 1. 为了更好地实现项目中类的管理,提供包的概念
  12. * 2.使用package声明类或接口所属的包,声明在源文件的首行
  13. * 3.包,属于标识符,遵循标识符的命名规则、规范、“见名知意”
  14. * 4.每“.”一次,就代表一层文件目录。
  15. *
  16. *补充:同一个包下,不能命名同名的接口、类
  17. * 不同的包下,可以命名同名的接口、类
  18. *
  19. *二、import关键字的使用
  20. * import:导入
  21. * 1.在源文件中显示的使用import结构导入指定包下的类、接口
  22. * 2.声明在包的声明和类之间
  23. * 3.如果需要导入多个结构,则并列写出即可
  24. * 4.可以使用“XXX.*”的方式,表示可以导入XXX包下的所有结构
  25. * 5.如果使用的类或接口是java.lang包下定义的,则可以省略import结构
  26. * 6.如果使用的类或接口是本包下定义的,则也可以省略import结构
  27. * 7.如果在源文件中,使用了不同包下的同名的类,则必须至少有一个类,需要用全类名的方式进行显示
  28. * 8.如果我们使用“xxx.*”的方式表明调用xxx包下的所有结构。但是如果使用的是xxx子包下的结构,仍需要导包
  29. * 9.import static:导入指定类或接口中的静态结构
  30. */
  31. public class PackageImportTest {
  32. public static void main(String[] args) {
  33. String info =Arrays.toString(new int[]{1,2,3});
  34. Bank bank =new Bank();
  35. ArrayList list =new ArrayList();
  36. Scanner scanner=null;
  37. System.out.println("hello");
  38. Person person=new Person();//本包内导入的
  39. Account acct =new Account(1);
  40. //全类名形式
  41. day10exer2.Account acct1 =new day10exer2.Account(1000,2000,0.231);
  42. Date date =new Date();
  43. Field field=null;
  44. out.println("hello");//省略System
  45. out.println(round(123.4));//省略System 和 Math
  46. }
  47. }