Java基础随记
最近几天刷了一遍b站的狂神说java基础,虽然老师说要记录博客总结,但要是每个知识点都按部就班地从零去记录,实在是费时且意义不大呀。
我自己的习惯还是中途记录下来了一些感觉有用的、豁然开朗的东西,所以这篇主要是记给自己做个记录。所以基本上没啥逻辑顺序,就东一个西一个的知识点吧。
左移和右移操作
结论:
左移1位,原数乘以2
右移1位,原数除以2.
比如:
0000 0001 是1
0000 0010 是2
0000 0100 是4
0000 1000 是8,可以看到整体左移一位,数是会翻倍的。
对于不那么友好的情况也一样的:
0000 0011是3
0000 0110是6。
位操作是非常高效的操作了,左移1位的速度远远大于乘以2的速度。所以对于一个面试题目:把一个数乘以8,最快的方式就是左移3位。
位操作还有很多其他高效用途(尤其对于搞ACM的人来说),这个仅仅算是最常用的方式之一。
运算顺序
sys.out.println(a+b+””); 与 sys.out.println(””+a+b);结果不同。
假如a是1,b是2,则前者是3,后者是12.
这个也好理解,虽然在java中整数+字符串,会自动把整数变成字符串,然后直接相连。但在还没遇到字符串前,从左向右运算,整数自然是该怎么加怎么加了。
单引号和双引号也不太一样,双引号是字符串,会默认转换其他;
而单引号是个字符,会默认认为是ASCII值97.
java.lang.String s2 = "a"+1+2;//s2=a12
int s3 = 'a'+1+2; //s3=100
方法重载
方法重载的要求:
- 方法名必须相同
- 参数列表必须不同。(个数、类型、排列顺序)
方法重载其实就是在类里写同名方法,同样的方法名,却可以定义不同的功能。我的理解就是入参的任何形式的不同,就可以构成重载。要注意的是,返回值类型可以相同或不同,但无关紧要。即:仅仅是返回值类型的不同,无法构成重载。
可变参数
在方法中传递多个参数,如多个整形,用int... 来定义。这样可以接收多个整形参数,但可变参数一般都要放在最后,如果放在前面的话,难免会混淆其他参数。
static声明
类中的两个方法,一个是public static void a(), 另一个是public void b(),
则后者可以调用前者,但前者不可以调用后者。因为static修饰的方法a是和类一起加载的,是一直存在的。而没有static的方法b,需要类实例化创建之后,才存在于对象中。
构造器
其实就像C++里的构造函数,创建类的时候,会默认配置一个无参构造器。但也可以自己显示的定义有参构造器,如果定义了有参构造,就会覆盖调默认的构造器,所以也必须要顺带着定义无参构造器。即:一旦定义了有参构造,就得显示定义无参构造。
还有一个常用快捷键 alt+insert,可以在类内补全出构造器。
继承
子类继承,一般继承的就是父类的public方法,private是不会被继承的,所以子类用super.操作,也无法操作到父类的private。但是可以继承set和get方法来操作private变量。
所有的类都默认继承object类。
创建子类时,会先执行父类的构造器,再执行子类的构造器。如果父类中之定义了一个有参构造(说明他把默认的无参构造覆盖了,没有无参构造了),那么子类也没有无参构造了。所以再重复上面的结论:一般要是显示定义了有参构造——一般情况下得再手写一个无参构造。
super()指父类的构造,this()指本类的构造。
如果一个类的修饰符有final,就不能被继承了。
多态
父类引用指向子类对象 这就是多态。形式:父类 a = new 子类
假设Student继承Person,则可以这样定义:Person s = new Student(),这就是多态的典型定义方式。
假设子类Student:1保留了父类的一些方法,2重写了父类的一些方法,3新增了一些自己的方法。则:Person s可以调用的方法有1和2——即自己原有的以及被子类重写的,无法调用子类独有的。
多态是方法的多态,属性没有多态。
重写
重写都是方法的重写,和属性无关。
即子类继承了父类的方法,定义同样的方法名和同样的参数列表去重写了这个方法。重写之后,在多态的情况下(Person A = new Student()),父类调用被重写的方法,会展现子类的特性。
没有被重写的方法,则还是以左边接收的类为准,维持原特性。
重写只能重写public的非静态方法,即static修饰的方法就不能被子类重写了。
重写的方法可以扩大但不能缩小修饰符的范围,如private->public;可以缩小但不能扩大抛出的异常,如Exception->ClassNotFoundException。
在子类中,alt+insert就可以选择override自动生成啦。
静态代码块和匿名代码块
public class Person{
Static{System.out.println(“我是静态代码块,先执行”);}
{System.out.println(“我是匿名代码块,第二执行”);}
Public Person(){
System.out.println(“我构造方法,最后执行”);
}
}
算是一个执行顺序的一个补充知识了,看来构造器也并不总是最先~
抽象类
抽象类就像是模板,不能被new创建,不能被实例化,只能被子类继承然后实现它的方法。抽象类的所有方法,只要是继承了它的子类,都得实现——除非子类也是个抽象类,那就得等子类的子类去实现了....
抽象类不如接口常用,因为接口可以多继承。
接口
接口里就定义一些方法,等待着被其他类实现(implement)
接口里定义的方法, 默认都是public abstract;定义变量,默认就是public static final,但一般不定义常量。
快捷键
Ctrl alt+T 自动包裹某段代码
alt+enter帮助看看一些红色波浪线的处理方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了