面向过程:【强调步骤】当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节 面向对象:【强调对象】当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我做事儿


Java的类与对象【重点】

  • :类是一个模板,它描述一类对象的行为和状态
    1. 属性:就是该事物的状态信息。 名字、体重、年龄、颜色
    2. 行为:就是该事物能够做什么。 走、跑、叫
  • 对象对象是类的一个实例

类与对象的关系

  • 类是对一类事物的描述,是抽象的。
  • 对象是一类事物的实例,是具体的。
  • **类是对象的模板,对象是类的实体**

    类的结构:

    一个类由属性方法构成。

    属性 ,方法,构造器,代码块,内部类


类的定义格式

定义类 : 成员变量、成员方法

  1. public class ClassName {
  2. //成员变量
  3. //成员方法
  4. }

成员变量:成员变量是定义在类中方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
成员方法:去掉static

类变量:声明在类中方法体之外,但必须声明为static 类型。
局部变量:声明和初始化都是在方法中,方法结束后,变量就会自动销毁。

对象的使用

创建对象: **类名 对象名 = new 类名();**
使用对象访问类中的成员: **对象名.成员变量;** **对象名.成员方法();**

创建类

  1. public class School {
  2. //属性
  3. String name;
  4. String addres;
  5. double area;
  6. //方法
  7. public void teach(){
  8. System.out.println(addres+"的"+name+"可以"+"教书");
  9. }
  10. public void play(){
  11. System.out.println(addres+"的"+name+"可以"+"玩");
  12. }
  13. }

创建对象

  1. //创建对象格式:类名 对象名 = new 类名();
  2. School school=new School();
  3. //给属性赋值
  4. school.name="大学";
  5. school.addres="沙坪坝";
  6. school.area =10000;
  7. //调用方法
  8. school.teach();
  9. school.play();

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

image.png

定义位置

  • 成员变量:在类中,方法体外
  • 局部变量:在方法体内部

作用范围

  • 成员变量:类中
  • 局部变量:方法中

默认值

  • 成员变量:有默认值
  • 局部变量:没有默认值,需先定义,赋值后使用

    内存的位置

  • 成员变量:堆内存

  • 局部变量:栈内存

    生命周期

  • 局部变量: 随着方法的调用而存在,随着方法的调用完毕而消失

  • 成员变量: 随着对象的创建而存在,随着对象的消失而消失

    Java内存

  • 方法区
  • 寄存器

  • 一般存放基本数据类型(局部变量)

  • 存放对象(数组等)

    方法区

  • 常量池(常量,比如字符串),类加载信息

对象内存图

Cat cat =new Cat()
cat.name="小白";
cat.age = 12;
cat.color = "白色";
image.png

一个对象调用一个方法内存图

image.png

通过上图,我们可以理解,在栈内存中运行的方法,遵循”先进后出,后进先出“的原则。变量p指向堆内存中的空间,寻找方法信息,去执行该方法。 但是,这里依然有问题存在。创建多个对象时,如果每个对象内部都保存一份方法信息,这就非常浪费内存了,因为所有对象的方法信息都是一样的。那么如何解决这个问题呢?请看如下图解。

两个对象,调用同一方法内存图

image.png

对象调用方法时,根据对象中方法标记地址值,去类中寻找方法信息。这样哪怕是多个对象,方法信息只保存一份,节约内存空间。

一个引用,作为参数传递到方法中内存图

image.png

引用类型作为参数,传递的是地址值

main介绍

  • main方法:程序的入口,在同一个类中,如果有多个方法,那么虚拟机就会识别main方法,从这个方法作为程序的入口
  • main方法格式严格要求: public static void main(String[] args){}
  • public static —->修饰符
  • void —->代表方法没有返回值 对应的类型void
  • main —->见名知意名字
  • String[] args —->形参 —-》不确定因素

    问题:程序中是否可以有其他的方法也叫main方法? 可以,构成了方法的重载

代码块

  • 大括号包裹起来的代码叫: 代码块
  • 作用: 让变量尽可能早的从内存消失, 从而节约资源, 提高效率

代码块分类
普通块,构造块,静态块,同步块

代码块执行顺序:
静态块 构造块 构造器 普通块
①最先执行静态块,只在类加载的时候执行一次,创建工厂,数据库的初始化信息都放入静态块。一般用于执行一些全局性的初始化操作。
②再执行构造块,(不常用)
③再执行构造器
④再执行方法中的普通块

  1. package com.m;
  2. public class Test {
  3. //属性
  4. int a;
  5. static int sa;
  6. //方法
  7. public void a(){
  8. System.out.println("-----a");
  9. {
  10. //普通块限制了局部变量的作用范围
  11. System.out.println("这是普通块");
  12. System.out.println("----000000");
  13. int num = 10;
  14. System.out.println(num);
  15. }
  16. //System.out.println(num);
  17. //if(){}
  18. //while(){}
  19. }
  20. public static void b(){
  21. System.out.println("------b");
  22. }
  23. //构造块
  24. {
  25. System.out.println("------这是构造块");
  26. }
  27. //静态块
  28. static{
  29. System.out.println("-----这是静态块");
  30. //在静态块中只能方法:静态属性,静态方法
  31. System.out.println(sa);
  32. b();
  33. }
  34. //构造器
  35. public Test(){
  36. System.out.println("这是空构造器");
  37. }
  38. public Test(int a){
  39. this.a = a;
  40. }
  41. //这是一个main方法,是程序的入口:
  42. public static void main(String[] args) {
  43. Test t = new Test();
  44. t.a();
  45. Test t2 = new Test();
  46. t2.a();
  47. }
  48. }