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


Java的类与对象【重点】

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

类与对象的关系

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

    类的结构:

    一个类由属性方法构成。

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


类的定义格式

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

public class ClassName {
//成员变量
//成员方法
}

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

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

对象的使用

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

创建类

public class School {
    //属性
    String name;
    String addres;
    double area;
    //方法
    public void teach(){
        System.out.println(addres+"的"+name+"可以"+"教书");
    }
    public  void  play(){
        System.out.println(addres+"的"+name+"可以"+"玩");
    }
}

创建对象

      //创建对象格式:类名 对象名 = new 类名();
       School school=new School();

        //给属性赋值
        school.name="大学";
        school.addres="沙坪坝";
        school.area =10000;

       //调用方法
        school.teach();
        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方法? 可以,构成了方法的重载

代码块

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

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

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

package com.m;
public class Test {
    //属性
    int a;
    static int sa;
    //方法
    public void a(){
        System.out.println("-----a");
        {
            //普通块限制了局部变量的作用范围
            System.out.println("这是普通块");
            System.out.println("----000000");
            int num = 10;
            System.out.println(num);
        }
        //System.out.println(num);
        //if(){}
        //while(){}
    }
    public static void b(){
        System.out.println("------b");
    }
    //构造块
    {
        System.out.println("------这是构造块");
    }
    //静态块
    static{
        System.out.println("-----这是静态块");
        //在静态块中只能方法:静态属性,静态方法
        System.out.println(sa);
        b();
    }
    //构造器
    public Test(){
        System.out.println("这是空构造器");
    }
    public Test(int a){
        this.a = a;
    }
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        Test t = new Test();
        t.a();
        Test t2 = new Test();
        t2.a();
    }
}