Java基础(02)面向对象基础

类和对象

一、面向对象

1、面向对象和面向过程

  • 解决简单问题可以使用面向过程;
  • 解决复杂问题:宏观上面向对象,微观上面向过程;

2、面向对象思考方式

  • 遇到复杂问题,先从问题中找名词,然后确立这些名词哪些可以作为类
  • 再根据问题需求确定该类的特征和行为,确定和其他类之间的关系

3、面向对象三大特征

  • 封装性、继承性和多态性

二、类的成员

  • 类可以看成一类对象的模板,对象可以看成该类的一个具体实例;
  • 类中定义了这一类对象所应具有的共同的属性和方法;

1、属性

类属性(static)
  • 整个类就只有一个值,该类的实例共享这一个值
  • 类加载的时候自动初始化
  • 用类名和实例名加点的方式都是可以访问的
实例属性
  • 实例属性的初始化的时机是对象进行初始化的时候
  • 一般需要通过构造器手动进行初始化

2、方法

  • 方法是该类(实例)行为特征和功能实现;
  • 也分为类方法(static)和实例方法
  • 类方法不能用 abstract 进行修饰
参数传值机制
  • 基本的数据类型是值传递,也就是传递值的副本
  • 引用类型是引用传递,传递引用的副本,会受到影响的

3、构造器constructor

  • 是一种特殊的方法,用于对象的初始化;
  • 方法名和类名一致,可以有参数,也可以有修饰符;
  • 有返回值,但不能定义返回值类型;
  • 通过new关键词来调用;
  • 构造器也可以重载;

4、静态代码块

  • 构造方法用于对象的初始化;
  • 静态初始化块用于类的初始化操作;
  • 静态代码块先于构造器执行;
  • 静态代码块和构造器的执行顺序都是从 object 类向下执行;

三、包(package)

1、包的作用

  • 是一种源代码文件的组织方式
  • 是一种命名空间管理,避免类的同名冲突
  • 引入了包一级的封装和存取权限

com.gaocom.gao.car,这两个包没有包含关系,是两个完全独立的包,只是逻辑上看起来后者是前者的一部分;

2、类的导入

  • 默认导入java.lang包下所有的类,这些类可以直接使用;
  • 如果导入两个同名的类,只能用 包名+类名 来区分:

3、静态导入

  • 用于导入指定类的静态属性,导入后可以直接使用静态属性
  • 静态引入分为单一引入和全体引入
import static java.lang.Math.PI;
import static java.lang.Math.*;

四、修饰符

1、访问修饰符

  • public 的访问的权限是最大的
  • protected 除了包权限还有子类访问的权限
  • default 默认就是包权限
  • private 权限最小只有本类能够访问
说明
  • 可以修饰类的就 public 和 默认
  • 类的成员的话都是可以用的

2、其他修饰符

  • transient 指明变量不需要序列化
  • volatile 指明变量是一个共享变量
  • abstract 指明抽象方法或者抽象类
  • synchronized 指明同步方法或者同步代码块
  • native 用来集成其他语言的代码
  • final 修饰类变量需要马上进行显式的初始化,修饰实例变量直接显式初始化或者在构造方法里面初始化

this 关键字

  • this的本质就是 创建好的对象的地址 ;
  • 可以用来区分成员变量和局部变量;
  • 普通方法中,this总是指向调用该方法的对象;
  • 构造方法中,this总是指向正要初始化的对象;
  • 在构造方法中使用 this()关键字调用重载的构造方法,并且必须位于构造方法的第一句;
  • this不能用于static方法中;

面向对象内存分析

  • Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area;
    在这里插入图片描述

一、栈的特点

  • 方法执行入栈,执行完后弹栈;
  • JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等);
  • 栈属于线程私有,不能线程间共享;
  • 栈的存储特性是 先进后出,后进先出 ;
  • 栈是一个连续的内存空间,速度快;

二、堆的特点

  • 堆用于存储创建好的对象和数组;
  • JVM只有一个堆,被所有线程共享;
  • 堆是一个不连续的内存空间,分配灵活,速度慢;
  • 堆中的常量池;

三、方法区特点

  • 一个方法区,所有线程共享;
  • 方法区实际也是堆,用来存放程序中永远是不变或唯一的内容(字节码对象、静态成员、字符串常量等);

垃圾回收机制

一、内存管理

  • Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放;
  • new 则分配内存空间,对象的引用赋值为 null 则释放空间;

二、回收原理

  • java虚拟机的垃圾回收机制是基于复杂算法的分代垃圾回收机制
  • 调用System.gc(),只是通知JVM,并不是运行垃圾回收器

关于虚拟机的垃圾回收详细可以参考博文https://blog.csdn.net/u010349644/article/details/82191822

1、关于 finalize 方法

  • 在对象进行回收前会自动调用对象的 finalize() 方法,所以这个方法一般是用来进行一些资源的释放
  • 但是对象回收的顺序和时机是不可预知的,所以这个方法中不要书写依赖于其他操作的代码

三、开发中容易造成内存泄露的操作

  • 创建大量无用对象
  • 静态集合类的使用,占用大量的内存空间且不容易被垃圾回收
  • 各种连接对象(IO流对象、数据库连接对象、网络连接对象)未关闭
  • 监听器的使用

枚举类

  • 枚举本质还是一个类
  • 默认继承 java.lang.Enum 类
  • 可以包含方法和变量
  • 构造器的修饰符只能是默认的或者private
  • 枚举类开头的常量会自动创建
public enum Planet{
    EARTH(12,13),
    VENUS(11,89);
        
    private final double mass;
    private final double radius;
    
    Planet(double mass,double radius){
        this.mass = mass;
        this.radius = radius;
    }
}


class Test{
    public static void main(String[] args) {
        System.out.println(Planet.EARTH instanceof Planet);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值