Java中级学习笔记

目录

idea快捷键

模板

访问修饰符

封装encapsulation

继承

Super关键字

重写/覆盖

多态Polymorphic

动态绑定机制

多态数组

多态参数

Object类

HashCode

ToString

Finalize

断点调试debug


在idea中,当run一个文件时,会先编译成.class文件,再运行。out文件夹存放编译后的.class文件,src存源码文件(.java)

idea快捷键

settings->keymap 设置:

ctrl+d 删除当前行(默认是ctrl+Y);ctrl+alt+向下光标;alt+ / 补全代码;

添加注释和取消注释:ctrl+ / (第一次是加注释,第二次是取消注释)

导入改行需要的类:先配置auto import,然后使用alt+enter即可

快速格式化代码: ctrl+alt+L;快速运行程序:alt+R

生成构造器:alt+insert; 查看类的继承关系:ctrl+H;

光标放在一个方法上,输入ctrl+B 可以定位到方法;

自动的分配变量名:通过在后面加.var 或者 alter+enter

模板

主函数:输入main回车;

输出:输入sout回车;

循环:输入for i 回车;

1、区分相同名字的类;2、当类很多时,可以很好管理类;3、控制访问范围。(实际上就是创建不同的文件夹来保存类文件。)

基本语法:package com.asjij1(Package关键字,表示打包;com.asjij1表示包名)

包命名规则:只能包含数字、字母、下划线、小圆点. 但不能用数字开头,不能是关键字或保留字。(一般是小写字母+小圆点:eg:com.公司.项目名.业务模块名)

常用的包:java.lang.*//基本包,默认引入,不需要再引入;java.util.*//util包,系统提供工具包、工具类,使用Scanner;java.net.*//网络包,网络开发;java.awt.*//java界面开发GUI

如何引入包(引入该包下面的类):import eg:import java.util.Scanner//引入Scanner;若是.*则引入该包下全部类,(不建议引入.*)。

package作用:声明当前类所在的包,需要放在类的最上面,一个类中最多只有一句package。import指令位置放在package下面,在类定义前面,可以有多句且没有顺序要求。

访问修饰符

公开级别:public(向同类、同包、子类、不同包都公开);受保护级别:protected(对同类、同包、子类公开,不同包不公开);默认级别:没有修饰符号(向同类、同包公开);私有级别:Private(对同类公开,不对外公开)

修饰符可以用来修饰类中的属性,成员方法和类。只有默认和public才能修视类

封装encapsulation

把抽象出来的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(方法)才能对数据进行操作

封装步骤:1、属性私有化;2、提供一个公共的set方法,用于对属性判断并赋值;3、提供一个公共的get方法,用于获取属性的值;

继承

解决代码复用,当多个类存在相同属性(变量)和方法时,可以从这些类抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends关键字声明继承父类即可。

基本语法:class 子类 extends 父类{...}

子类会自动拥有父类定义的属性和方法,父类又称超类、基类。子类又叫派生类。

1、子类继承所有属性和方法,但是私有属性不能在子类直接访问,要通过公共的方法去访问。非私有的属性和方法可以在子类直接访问。

2、子类必须调用父类的构造器,完成父类的初始化

3、当创建子类对象时,不管使用子类哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super关键字去指定使用父类的哪个构造器完成对父类的初始化工作,否则编译不通过。//先调用父类构造器,然后再构造子类。super默认存在的(默认调用父类无参构造器)

4、如果希望指定去调用父类的某个构造器,则显示的调用一下

5、super在使用时,需要放在构造器的第一行

6、super()和this()都只能放在构造器的第一行,因此两个方法不能共存在一个构造器中

7、java所有类都是Object类的子类,Object类是所有类的基类。

8、父类构造器的调用不限于直接父类,将一直往上追溯至Object类(顶级父类)

9、子类最多只能继承一个父类(直接继承),java是单继承

10、不能滥用继承,子类和父类之间必须满足逻辑关系。

调用属性的时候:(1)首先看子类是否有该属性(2)如果子类有该属性,并且可以访问则返回信息(3)如果子类没有这个属性,就看父类有无这个属性(如果父类有该属性并且可以访问,就返回信息)(4)如果父类没有就继续向上找

Super关键字

super代表父类的引用,用于访问父类的属性、方法、构造器。

访问父类的属性,但不能访问父类的private属性(super.属性名);访问父类的方法,不能访问父类的private方法(super.方法名(形参列表));访问父类的构造器(super(参数列表)只能放在构造器第一句,只能出现1句)

1、调用父类的构造器(父类属性由父类初始化)子类的属性由子类初始化。2、当子类中有和父类中的成员重名时,访问父类的成员必须通过super。如果没有重名,使用super、this和直接访问是一样的效果

调用方法时:(1)先找本类,如果有则调用(2)如果没有,则找父类(如果有并且可以调用,则调用)(3)如果父类没有则继续往上寻找一直到Object类。如果查找方法的过程中,找到了但是不能访问则报错:cannot access。如果查找过程中,没有找到,则提示方法不存在。

super的访问不限于直接父类,如果爷爷类和本类中有同名的程源,也可以使用super去访问爷爷类的成员。如果多个基类中都有同名的程源,使用super访问时遵循就近原则

2022.1.7日看到301集

重写/覆盖

子类的方法和父类的某个方法的名称、返回类型、参数一样就说子类覆盖了父类的方法。

子类方法的返回类型和父类方法的返回类型一样,或者是父类返回类型的子类。(比如:父类返回类型是Object类,子类方法返回类型是String类,导致编译错误)

子类方法不能缩小父类方法的访问权限。(public > protected > 默认 > private)

多态Polymorphic

方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承基础之上。

一个对象的编译类型和运行类型可以不一致;编译类型在定义对象时就确定了,不能改变;运行类型是可以变化的;编译类型看定义时 = 号的左边,运行类型看 = 号的右边。

Animal animal = new Dog ( );//子类的对象赋值给父类的引用,即父类的引用指向子类的对象(anmial编译类型是Animal,运行类型是Dog)

animal = new Cat ( ); (animal的运行类型变成了Cat,编译类型仍然是Animal) 

多态的前提:两个对象(类)存在继承关系;

多态的向上转型:

  • 父类的引用指向了子类的对象。
  • 基本语法: 父类类型 引用名 = new 子类类型();
  • 可以调用父类中的所有成员(需要遵循访问权限),不能调用子类中的特有成员(因为在编译阶段,能调用哪些成员由编译类型决定);最终运行效果看子类的具体实现,即调用方法时,按照从子类开始查找方法。

多态的向下转型:

  • 语法: 子类类型 引用名 = (子类类型)父类引用;
  • 只能强转父类的引用,不能强转父类的对象
  • 要求父类的引用必须指向的是当前目标类型的对象
  • 当向下转型后,可以调用子类类型中所有的成员

属性没有重写,属性的值看编译类型。

InstanceOf 比较操作符,用于判断对象的运行类型是否为XX类型或XX类型的子类型

动态绑定机制

调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定

当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用。

多态数组

数组的定义类型为父类类型,里面保存的实际元素类型为子类类型

多态参数

方法定义的形参类型为父类类型,实参类型允许为子类类型

Object类

==和equals的对比:

  • ==:既可以判断基本类型,又可以判断引用类型
  • ==:如果判断基本类型,判断的是值是否相等。
  • ==:如果判断引用类型,判断的是地址是否相等,即判断是不是同一个对象。
  • equals:是Object类中的方法,只能判断引用类型
  • equals:默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。

HashCode

提高具有哈希结构容器的效率;两个引用,如果指向的是同一个对象,则哈希值肯定是一样的,如果指向的是不同对象,则哈希值是不一样的;哈希值主要是根据地址号,不能完全将哈希值等价于地址;后面在集合中,HashCode如果需要的话也会重写。

ToString

默认返回: 全类名(包名+类名)+@+哈希值的十六进制

子类往往重写toString方法,用于返回对象的属性信息。

重写toString方法,打印对象或拼接对象时,都会自动调用该对象的toString形式。

当直接输出一个对象时,toString方法会被默认的调用。(比如:System.out.println(monster);)

Finalize

当对象被回收时,系统自动调用该对象的finalize方法。子类可以重写该方法,做一些释放资源的操作。

什么时候被回收:当某个对象没有任何引用时,则jvm就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁该对象前,会先调用finalize方法

垃圾回收机制的调用:有系统来决定,也可以通过System.gc()主动触发垃圾回收机制。

实际开发中,不会运用finalize,只是应对面试

断点调试debug

断点调试一步一步查看源码,从而发现错误所在;

断点调试过程中,是运行状态,是以对象的运行类型来执行

快捷键:跳入方法内F7,逐行执行代码F8,跳出shift+F8,执行到下一个断点(resume)F9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值