Class类
- 概念:
- 类是具有相同属性或者行为的一类事物
- 类本身可以再被抽象,因为类也有共同的属性和行为(比如类都有属性、构造器、方法,都能调用方法),所以把类们右抽象成一个类 Class。
- Java 中有一个 Object 类,是所有 Java 类的继承根源,其内部声明了数个应该在所有 Java 类中被改写的方法:hashCode()、equals()、toString()、getClass()等。其中 getClass() 返回一个 Class对象
- Class 类十分特殊。
- 它和一般类一样继承自 Object 类,其实体用以表达 Java 程序运行时的 classes 和 interfaces,也用来表达 enmu、array、primitive、 Java types(boolean、byte、char、short、int、long、float、double)以及关键词 void。
- 当一个 class 类被加载,或当加载器(class loader) 的 defineClass() 被 JVM 调用,JVM 便自动生成一个 Class 对象。
- 在学习 Class 类的过程中,还需要学习:
- Field类:类属性的抽象
- Method类:类方法的抽象
- Constructor类:类构造器的抽象
- Class 类中需要掌握的方法:获取类对象
- 通过 Class.forName("类的全路径")
- 通过类的名称打点 class ,如:Person.class
- 通过该类的对象调用 getClass() 方法
面向对象
- 特性:封装,继承、多态、抽象
- 类之间的关系:
- 依赖、聚合、继承
- 非静态方法依托对象而存在,非静态方法只能依托对象调用
- Java 引用类型的底层是 C 语言的指针形式:
- 引用类型 = 引用类型:代表两个变量的指向相同
- C 语言类型指针:
- 当指针指向别的变量的时候,此时原指针申请的空间产生内存泄漏问题
- 需要手动 free() 释放内存
- Java 不会存在内存泄漏,Java 有自动回收机制,回收没有被指向的变量
- 通过类名 . 方式调用方法,说明它是静态变量
- 静态变量用 static 修饰
- 查看器get()、更改器set():
class mian{ int[] arr = {2,4,5,6}; public int[] get(){ return arr; } } int[] set = mian.get(); set[0] = 100; System.out.println(arr[0]); //arr[0] = 100;
- 默认的 get()、set() 方法并不会并保障数据的安全
- 对于 private 类型变量修改和查询
- 比较灵活,如:可读不写、可写不读……
- 默认的 get()、set() 方法不安全:
- 只读的时候可以通过下标修改里面的数据
- 解决方法:
- get() 方法里重新定义一个变量,把原变量名的值赋给新变量,暴露新变量名的地址,即可保证安全
-
class mian{ int[] arr = {2,4,5,6}; public int[] get(){ int[] brr = Arrays.copyOf(arr,arr.length); return brr; } } int[] set = mian.get(); set[0] = 100; //此时修改的是 brr 内的值,不会影响到原数组 arr 内的值 System.out.println(arr[0]); //arr 内的数据不会发生改变
- 方法的调用是在堆内存中拷贝一份,放入栈内压栈执行
- 构造器:
- 构造器与类名同名
- 每个类可以有多个构造器(入参不能一样)
- 构造器可以有 0 个或多个入参
- 构造器没有构造器
- 构造器总是伴随 new 操作一起使用
类与对象
- Java核心思想:封装、继承、多态、接口
- 类:类是创建对象的模板
- 所有代码都应该写在类里面
- 一个类里面可以通过 new 关键字创建多个对象
class Test{ public static void main(String[] args){ Person p1 = new Person(); //Person:数据类型,决定数据/对象在内存当中的存储形式 //p1:变量名/对象名 //new:在堆内存中开辟内存空间,创建对象 //Person():构造器,在创建对象的时候给对象赋值 Person p2 = new Person(); Person p3 = new Person(); } }
- 相同的数据不同的存储类型,在内存中的存储形式是不一样的
- 类方法中可以直接调用本类的类方法
- 在类方法中可以调用实例方法
- 类和对象的关系:
- Java 是面向对象的语言
- 类是构建对象的模板
- 类中有什么,该类的实例对象中就应该有什么
- 有类不一定有对象
- 面向过程和面向对象编程:
- 面向过程编程:
- 变量和方法都写在类中
- 调用者都调用当前这个类,此时就会出现数据覆盖情况
- 面向对象编程:
- 每次调用都是一个独立的对象,对象中的数据不会相互干扰
- 面向过程编程:
- 动态代理:
- 一个类通过反射的形式生成多个对象
- 通过对象来进行代理,运用于多个不同的对象
- 构造器:
- 见面向对象第七点
- 数据类型:数据在内存中如何存储
- int 类型的内存结构:
- 1 bit:代表正负号
- 31 bit:表示值
- float 类型的内存结构:
- 1 bit:代表正负号
- 8 bit:代表小数点当前的位置
- 23 bit:表示值
- byte 类型的内存结构:
- 1 bit:代表正负号(0,1)
- 7 bit:代表值
- int 类型的内存结构:
- new 关键字:
- 主要作用:在对内存中开辟一块内存空间
- 例:
Class Test{ public static void main(String[] args){ //通过 new 关键字在堆内存中开辟一块内存空间 Car car = new Car; } }
- this 关键字:
- 专属于对象的关键字
- this 关键字:代指当前对象
- this 属于对象层面
- 方法名和参数列表:
- 方法名和参数列表共同组成了方法的签名,方法的签名在同一个类当中是不能重复的
- static 关键字:
- 专属于类的关键字
- 被 static 修饰的方法叫类方法
- 被 static 修饰的变量或方法存储在方法区中的静态常量池,是被对象所共享的
- static 关键字不能修饰局部变量
- static 代码块只有加载到 JVM 内存中才会执行,创建对象时不会执行
- 内存基础运行见:Java之内存基础运行-优快云博客
- 全局变量和局部变量:
- 在类当中和方法同级的变量是全局变量
- 在方法中定义的变量是局部变量