【java】Java基础学习总结(b站黑马程序员课程)

Mark-boker/JavaBasic (github.com)自身学习代码(详细代码请关注黑马程序员领取)

一.数组原理

二.方法

 

 

三.面向对象

1.类和对象

深入理解 Java 实例化_实例化是什么意思_南淮北安的博客-CSDN博客

实例化的特点
1.简单地说,实例化就是new对象。
2.new的过程就是实例化的过程,如 new Cat();就是对Cat类的实例化(在堆内存的开辟空间进行记录)。
3.实例化对象的语法:类名 引用变量名(通常记录在堆内存的开辟的地址) = new 构造器名() ;
4.访问成员属性或成员方法一般语法是:引用成员变量名.成员名

Student st;表示在栈中声明了一个名为st的引用变量
new Student();表示对学生类进行了实例化,即在堆中新建了一个对象,并调用构造方法进行初始化。
    括号中之所以有参数,是因为构造方法有参,写进的参数将传递给构造方法中的形参。
    如果想括号里无参,那么将无参构造也写上。因为如果没写构造器,那么编译器会默认创建一个无参。 倘若写了有参,编译器就不再默认创建无参了,需手动添加。
    构造方法是一个比较特殊的方法,通过构造方法可以完成对象的创建,以及实例变量的初始化。换句话说:构造方法是用来创建对象,并且同时给对象的属性赋值。注意:实例变量没有手动赋值的时候,系统会赋默认值。成员变量和方法需要对象去调用

2.构造方法和javabean

java是一门面向对象的语言,而面向对象的原则,就是要隐藏细节,把该封装的东西封装到一个合适的类里面,
一个合格的封装类,一般情况下它不会让你去直接访问他的属性(成员变量),而是让你去调用他的方法set和get。
比如获取或者修改密码时候需要验证,就可以在set方法里添加验证代码,看看密码是否符合修改规范
ptg插件可以自动补全javabean类

3.Java内存分配

jdk和jre的区别? - 知乎 (zhihu.com)

 4.this关键字

 

 

 四.字符串(详细用法查找API文档)

 1.String

 

String类的equals源码,两个字符串使用 == 相等 或者 两个字符串的所有组成字符都相等返回true 栈,堆,元空间(方法区 ,字节编码文件.class),串池。

 2.StringBuilder

StringBuilder可以非常有效率去进行对字符串处理(创建的内容是可变的,方便字符串拼接和反转),
大量普通字符串拼接会产生许多无用的字符串影响效率
StringBuilder(初始容量16,扩容2*16+2,不够就为实际容量)是java在底层做了处理,打印的对象不是地址属性值,toString返回类名和引用地址,
 toString将StringBuffer转换成String

  

3.StringJoiner

 

 

 4.底层原理

Java中String类的值在创建后不能修改

第二次的a会在方法区的字符串常量池中重新分配一个内存存放“Hello World”,并存放其内 存地址中的Hello不会发生任何变化。 

 

 

 

 

 五.集合

java集合超详解_java集合使用-CSDN博客

 六.面向对象进阶

1.static关键字和工具类

 

 

 注意事项

static静态方法,静态变量随着类加载而加载,优先于对象,运行代码对象还没在堆内存开辟空间 ,静态变量会在堆中单独创建一个静态区(地址和new出来的对象地址不一样),是类中全体对象共享的

static静态方法没有this关键字,静态方法只能访问静态(不属于对象,是属于类的,随着类加载而加载,提前初始化),非静态方法(对象有关,需要实例化)可以访问所有

静态方法不能调用非静态变量(因为还没new实例出来,逻辑顺序,如果静态方法里面有非静态方法或者变量,它无法识别,因为没有new实例化,非静态方法变量不存在堆内存中)

java静态代码块、静态变量、普通代码块和构造方法执行顺序-CSDN博客

 2.继承

当类与类之间,存在相同共性的内容,并且满足子类是父类一种(逻辑),就考虑继承优化代码 java支持单继承(1子只能继承1父),不支持多继承,支持多层继承,没有继承的类默认继承Object类

构造方法不能被继承(构造方法名字必须和类一样)

 

继承和调用是两种概念,私有父类成员变量可以继承,但是不能调用(赋值),例如上图无法赋值“钢门吹雪”,调用z.name

 

非私有的成员方法(虚方法)可以继承和调用(虚方法表),私有的不能继承

继承的一些特点和性质及方法重写

 

 

方法重写要注意的事项:
1.方法重写时, 方法名与形参列表必须一致。
2.方法重写时,子类的权限修饰符必须要大于或者等于父类的权限修饰符。
3.方法重写时,子类的返回值类型必须要小于或者等于父类的返回值类型。
4.方法重写时, 子类抛出的异常类型要小于或者等于父类抛出的异常类型。 Exception(最坏) RuntimeException(小坏)
5.建议重写方法尽量和父类保持一致
6.只有被添加到虚方法表中的方法才能被重写(java中静态字段和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏,直接调用是子类静态方法)

 

 

 3.多态

多态的前提条件是:
(1)有继承/实现关系。
(2)有方法的重写。
(3)有父类引用指向之类对象。(Fu f =new Zi())

java中多态的作用,多态的好处,以及为什么要用多态?_java为什么用多态_打代码的汤姆猫的博客-CSDN博客

 编译时查看父类有没有相应的成员变量如果有编译成功,运行时也查看父类有没有相应的成员变量如果有调用成功

 编译时查看父类有没有相应的成员方法如果有编译成功(所以子类特有方法父类没有,编译是失败的),运行时也查看子类有没有相应的成员方法如果有调用成功

java的动态绑定与静态绑定(彻底理解多态与重载)-CSDN博客

细究一下Java的动态绑定机制(非常重要)_java动态绑定机制-CSDN博客

java多态和instanceof的理解与使用_多态不用a instanceof 有什么区别_编程怪的博客-CSDN博客

49 向上造型与向下造型 - Scorpicat - 博客园 (cnblogs.com)

向上造型(转型)

定义:超类的引用指向子类对象。

例如:

1

Animal o1 = new Tiger();//Tiger是Animal的派生类(子类)

  以上即为向上转型。

特性:

  • 向上转型后的引用只能使用超类中的方法和属性。
  • 向上转型后的引用不能使用派生类中自有的方法和属性,可以使用重写父类的方法
向下造型(转型)

将一个已经向上转型的引用强制向下转型,并用一个新的派生类引用接收。

注意:

  • 向下转型后的引用既可以使用超类中的也可以使用它自己的类(当前派生类)中的方法和属性。
  • 向下转型后需要使用一个派生类引用来接收。
  • 如果派生类重写超类方法,派生类虚方法表中该方法会被覆盖,调取的是派生类重写后的方法

以上面的代码为前提,向下转型:

1

2

3

4

5

Tiger o2 = null;//先声明一个需要向下转型为的派生类的引用

    if(o1 instanceof Tiger) {//判断当前引用是否指向该派生类的对象

        o2 = (Tiger)o1;//向下转型

        //o1 = (Tiger)o1;//这样是无法转型成功的,转型不会报错,但o1任然无法调用Tiger中的属性和方法

        }

详细看连接

4.包和final

 

 

静态代码块:执行优先级高于非静态的初始化块,它会在类初始化的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员。静态代码块写法,static{  }

静态代码块的执行顺序:静态代码块----->非静态代码块-------->构造函数

 5.抽象类和抽象方法

 

 6.接口和适配器设计模式

 

 

 

 

 

 适配器

  实现类需要继承就让中间类继承父类,实现类就可以间接继承了

 7.内部类

 

 匿名内部类

 后面还有Lambda 表达式去简化匿名内部类

8.常用API(详细看视频)

Java统计代码的执行时间的6种方法_java执行时间_YouluBank的博客-CSDN博客

1.Object

jdk的本身附带一些标准类库重写Object中toString方法,所以创建的一些对象和集合直接可以输出内容而不是地址值,一些对象也会隐藏toString方法(看源码)

 2.克隆

  1. 首先实体类需要实现Cloneable接口
  2. 重写clone方法,将protected改为public,将返回类型改为当前实体类的类型
  3. 如果实体类中的属性不全是基础数据类型和String,那么对该属性类也要进行同样的操作让它支持深克隆

 正则表达式(api文档搜索Pattern类)

any-rule插件可以快速生成所需要的正则表达式

爬虫和正则表达式结合爬取筛选出有用内容

9.lambda表达式

 

七.集合进阶

 

Java基础之int和Integer有什么区别_一枚-狗子的博客-CSDN博客

【详解】JAVA集合只能存放引用类型的的数据,不能存放基本数据类型_集合只能存储引用数据类型_糖醋小熊猫的博客-CSDN博客

 Iterator和ListIterator之间有什么区别?_xiangyuenacha的博客-CSDN博客

1.ArrayList

Iterator和ListIterator之间有什么区别?_xiangyuenacha的博客-CSDN博客

简述ArrayList集合和数组的区别?_紫乾2014的博客-CSDN博客

 2.双向链表

集合进阶07-LinkedList和迭代器的源码分析_哔哩哔哩_bilibili

双向链表源码

节点格式 节点头地址值(记录上一个节点地址) 元素 节点尾地址值(记录下一个节点地址)

创建新节点首先把上一个节点(last尾节点)地址值赋值给l,l作为下一个节点的头地址值(记录上一个节点地址),e为添加元素,null为尾地址值,再把本节点地址值赋值给last做为尾节点,再判断把本节点地址值赋值给上一节点l.next(上一节点尾地址值)做连接

 

 3.迭代器底层

4.泛型

Java 泛型 | 菜鸟教程 (runoob.com)

 

 5.数据结构(二叉查找树,平衡二叉树和红黑树)

 

 

平衡二叉树的左旋右旋详解 看不懂你打我_You Y.G.的博客-CSDN博客

集合进阶-11数据结构(平衡二叉树旋转机制)_哔哩哔哩_bilibili

红黑树 

集合进阶-12-数据结构(红黑树、红黑规则、添加节点处理方案详解)_哔哩哔哩_bilibili

旋转比较消耗性能,单纯修改颜色的增删查改效率会更高

6.set集合

HashSet和LinkedHashSet

集合进阶-13-HashSet、LinkedHashSet详解_哔哩哔哩_bilibili

如果没有重写,自动哈希计算的是引用变量地址值,因为对象地址值不同,所以计算出的值是不同的,而重写后就可以计算对象内的属性值

硬核问题,为什么重写equals()就要重写hashCode()? - 知乎 (zhihu.com)

fn+alt+insert键快捷可以自动重写hashCode方法

TreeSet

自定义排序同时创建使用方式二优先

compareTo方法返回

为什么返回值为 0 ,只是存取一个元素,返回 -1 就会倒序存储,返回 1 就会怎么存怎么取呢?

因为TreeSet 底层是一个二叉树(红黑树就是二叉树的升级版嘛),没插入一个元素就会调用 comapreTo() 方法做比较,就会按照我们上面提到的插入规则来

返回值如果写死 0,认为是相同的元素,所以 TreeSet 中不用插入新元素,用原来的即可

返回值如果写死 1,认为是大的元素,所以会插入到已有元素的右边,读取的时候,就是正序排列的

返回值如果写死 -1,认为是小的元素,所以会插入到已有元素的左边,读取的时候,就是倒序排列的

使用TreeSet,关于重写compareTo()方法 升序降序问题(适合Java小白)_重写compareto方法排序原理_张小三lc的博客-CSDN博客

 

一些idea快捷键

ctrl+atl+M自动抽取代码或者refactor找
shift+f6同时修改变量名
flag.while,加循环
new String.var,创建new String
“hello,world”.sout,快捷
list.fori
.forr逆向输出
按住鼠标滚轮一拖可以一列修改或者alt+鼠标左键
this本质是调用者的地址值,就是调用者的堆内存开辟空间的地址
ptg插件可以自动补全javabean类
ctrl+alt+/快速注释
ctrl+alt+v自动生成组件
fn+alt+insert键快捷construct构造 可以定制生成类的各项基本方法(如接口object类equals方法重写和构造函数生成等)
ctrl+n可以查找搜索类
提示参数,快捷键ctrl+p
  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值