Java个人基础笔记【一】

Java基础及高级

Java的特点

  1. Java是面向对象语言(oop)

  2. Java语言是健壮的。 Java的强类型机制,异常处理,垃圾的自动收集

  3. Java是跨平台的(编译好的.class文件可以在多个操作系统上运行,根本原因是JVM)

  4. Java语言是解释型的(解释性语言有js,PHP,Java,编译性语言有c/c++)

    区别是解释型语言编译后的代码不能直接被机器执行,需要解释器来执行,编译性语言编译后的代码可以被机器执行)

面向对象基本概念(oop)

  1. 面向对象就是把构成问题的事物分解成一个个对象,建立对象不是为了实现一个步骤,而是为了描述某个事物在解决问题中的行为。
  2. 类是面向对象中的一个很重要的概念,因为类是很多个具有相同属性和行为特征的对象所抽象出来的,对象是类的一个实例。
  3. 类具有三个特性:封装继承多态
    1. 封装性:指把对象的属性和行为看成是一个整体,并把不需要外界知道的信息屏蔽起来
    2. 继承性:在基础的类上派生出反应特殊事物的类
    3. 允许程序出现重名

继承性(extends)

  • 继承可以解决代码的复用,当多个类存在相同的属性和方法时,可以从这些类中抽象出父类。子类就会拥有父类的属性和方法
  • 父类又叫超类,基类
  • 子类又叫派生类
  • 子类继承了所有的属性和方法,非私有属性子类可以直接访问,私有属性不能在子类直接访问,要通过父类提供的公共的方法去访问
  • 子类必须调用父类的构造器,完成父类的初始化,之后才会进行子类的初始化
  • 当创建子类对象时,不管使用子类的那个构造器,默认情况都会去调用父类的无参构造器,如果父类没有无参构造器,则必须在子类的构造器中用super、去指定使用父类的哪个构造器完成对父类的初始化功能。
  • super()必须放在构造器的第一行,并且只能在构造器中使用
  • super()和this()都只能放在构造器第一行,因此两个方法不能共存于构造器
  • java的所有类都是Object类的子类

多态性

  • 对象多态体现为父类引用变量可以指向子类对象,前提条件是必须有子父类关系
  • 一个对象的编译类型和运行类型可以不一致
    • 编译类型:声明该对象时使用的类型,不能改变
    • 运行类型:实际赋给该变量时的类型,可以改变
  • 编译类型看 = 左侧,运行类型看 = 右侧
  • 向上转型(自动转换):
    • 本质是父类的引用指向了子类的对象
    • 可以调用父类的所有成员
    • 不能调用子类的特有成员(由编译类型决定)
    • 最终运行看子类的具体实现
  • 对象向上转型的意义是在于参数的统一,向下转型指的是调用子类的个性化操作方法
  • 向下引用(强制转换)
    • 语法:子类类型 引用名 = (子类类型)父类引用
    • 当向下转型后,可以调用子类类型中所有成员
  • 属性值没有重写,属性的值看编译类型
  • 方法先看运行类型
  • Java的动态绑定机制
    • 当调用对象方法时,该方法会和该对象的内存地址/运行类型绑定
    • 当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用

Java运行机制及过程

  1. Java的核心机制-Java虚拟机(JVM)
  2. JVM是一个虚拟的计算机,具有指令集使用不同的存储区域,负责执行指令,管理数据,内存,寄存器,包含在JDK中
  3. 对于不同的平台,有不同的JVM
  4. Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处执行”

test.java - (编译 javac 使用开发工具) > test.class - (运行 java) > JVM for Mac/Windows/Linux

  • Java编译
    1. 通过编译器(javac)将java源文件编译成JVM可以识别的字节码文件(.class)
    2. 通过javac编译工具对test.java文件进行编译
  • Java运行
    1. 有可执行的java程序(字节码文件)
    2. 通过运行工具java.exe对.class文件进行执行

Java数据类型

  • 数据类型分为基本数据类型引用数据类型(类,接口,数组)
  • 基本数据类型
数据类型大小/位可表示的数据范围默认值
byte8-128~1270
short16-32768~327670
int32-2 `31~2 31-10
long64-2 63~2 63-10
float32-2 `31~2 31-10.0
double64-263~263-10.0
char160~2`16-1
boolean8true falsefalse
  1. 关于浮点类型

    1. 浮点数在机器中存放形式为:浮点数= 符号位+指数位+尾数位 其中尾数位容易丢失造成精度损失 所以可以理解为小数都是近似值
    2. 浮点数默认为double,通常使用double
    3. 当进行判断两个浮点数相等时应该将两个浮点数的差值的绝对值,在某个精度范围内来判断
  • 引用数据类型
    • 堆内存(heap):保存每一个对象的属性内容,需要使用new语句来开辟,如果一个对象没有堆内存指向,则无法使用
    • 栈内存(stack):保存的是一个堆内存的地址,可以理解为对象的名称
    • 只要是引用数据类型,就需要使用new并创造一个新的堆内存
    • 引用传递:一个堆内存可以被很多栈内存指向并修改

关键字

this关键字

  • this可以完成三件事 调用本类属性调用本类方法表示当前对象
  1. 调用本类属性:this.属性
  2. 调用本类方法:
    • 调用本类普通方法:this.方法()
    • 调用本类构造方法:this(); 如果构造方法有参数:this(参数);
    • 使用this调用构造方法时要放在第一行

static关键字

  • 如果类中的某个属性希望定义为公共属性(所有类都可以使用的属性),则可以在声明前加上static
  • static的属性将成为公共属性(公共数据区),任何一个对象修改此属性都会影响其他对象
  • static和非static属性的区别:非static属性必须要有实例化的对象才能进行访问,static属性不受实例化对象的控制
  • 优先考虑非static属性
  • static方法不能直接访问非static属性或方法,只能调用static属性或方法
  • 非static方法可以直接访问static方法或属性
  • static方法可以直接通过**类名.方法()**名访问
  • **类变量:**是该类的所有对象共享的变量,任何一个该类的对象访问它时,取到的都是相同的值。
    • 定义:访问修饰符 static 数据类型 变量名
    • 访问方式:类名.类变量名 or 对象名.类变量名
    • 类变量是随着类的加载而创建,所以即使没有创建对象也可以访问
  • 类方法:又叫静态方法,访问一个对象方法,需要有一个对象来访问方法,而类方法只需要 **类名.方法()**即可访问
    • 类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区,类方法中无this

super关键字

  • super代表父类的引用,用于访问父类的属性,方法,构造器
  • 可以访问父类的属性/方法,不能访问private属性/方法 (super.属性/方法)
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iBXRlCHT-1635595615537)(D:\Typora\picture\QQ截图20211004125106.png)]

final关键字

  • final称为终结器,可以使用final定义类,方法,属性和局部变量
    • 使用final定义的类不再有子类
    • 使用final定义的方法不能被子类覆写
    • 使用final定义的变量就成为了常量,常量要在定义的时候设置好内容,并且不能修改(final常量要大写)
    • final使用注意事项
      • final修饰的属性由叫常量,用xx_xx_xx_xx
      • final修饰的属性在定义时,必须赋初值,并不能修改
      • 赋值的位置是:
        1. 定义时
        2. 在构造器中
        3. 在代码块中
      • 如果final修饰的属性是静态的,那么赋值的位置
        1. 定义
        2. 静态代码块
      • 如果类不是final类,但是含有final方法,则该方法不能重写,但是可以继承
      • 如果一个类是final类,则不需要将类的属性定义为final(画蛇添足)
      • final不能修饰构造方法
      • final和static搭配使用,效率更高,不会导致类的加载
      • 包装类(Integer,Double,Float,Boolean等都是final),String也是final

常用内存区间

  • 栈内存空间:保存所有的对象名称(保存引用的堆内存空间的地址)
  • 堆内存空间:保存每个对象的具体内容
  • 全局数据空间:保存static类型的属性
  • 全局代码区:保存所有的方法定义
  • 对象存在形式:基本数据类型存放在堆 引用数据类型内容存放在方法区
  • jvm内存方法的调用机制
    • 当程序执行到方法时,会开辟一个新的栈空间用来保存此方法
    • 当方法执行完毕,就会返回到调用方法的地方

包(package)

  • 包的本质就是创建不同的文件夹来保存类文件

  • 包名小写,只能包含数字,字母,下划线,不能用数字开头

  • 包的作用

    • 区分相同名字的类

    • 当类很多时,可以很好的管理类

    • 控制访问范围

  • package语句用来声明当前类所在的包,需要写在class的最上面,一个类中最多只有一句package

  • import语句放在package下class上

##访问修饰符

  • Java提供了四种访问控制符号控制方法和属性的访问权限
    1. 公开级别:用public修饰,对外公开
    2. 受保护级别:用protected修饰,对子类和同一个包中的类公开
    3. 默认级别:没有修饰符号,向同一个包的类公开
    4. 私有级别:用private修饰,只有类本身可以访问,不对外公开

覆写(override)

  • 子类定义了和父类的方法名称,返回值类型,参数类型及个数完全一致的方法时就叫方法的覆写
  • 被子类所覆写的方法不能拥有比父类更严格的访问控制权限(public > default > private)
  • 子类定义了和父类完全相同的属性名称时,称为属性的覆写(没有开发意义)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值