java入门(起始于string截至到内部类) 📅 2026/7/12 23:08:39 api就是java中已经写好的各种类直接拿来用就行一.字符串1.string类1string类的特点2string类对象的创建方法主要用“直接赋值方法”最后两种也常用3字符串的内存原理a.对于直接赋值的这种创建字符串的方式串池是在堆区的第一次也就是s1那行首先会到串池中去找“abc”没找到所以在创建“abc”并把地址赋值给s1第二次s2那行首先到串池中找”abc“找到了直接把地址赋值给s2.存在复用b.对于new的方式是直接在堆区创建空间来存储来存储字符串不存在复用4字符串的比较号比较的其实是变量小空间里面记录的东西基本数据类型就是真实的值引用数据类型就是地址5字符串的遍历2.stringbuilder进行字符串的拼接以及反转时用直接print springbuild类型的对象时打印出的是其内的内容append方法是在容器后面追加内容3.stringjoiner(用于拼接字符串比stringbuilder更加方便可以指定开始结束以及间隔符号)4.字符串拼接的底层原理1拼接的时候没有变量拼接时如果没有变量参与则编译之后直接就是拼接的结果那么该代码运行时也就不需要进行拼接了2拼接的时候有变量jdk8以前对于第二行代码执行过程相当于篮筐里的那行代码tostring底层是new一个新的字符串3拼接的时候有变量jdk8以后的拼接他会预估s4的长度预估为3然后把abc分别放入数组然后根据数组来创建字符串(new出来的)在jdk8以前这里是先进行s1与s2的拼接使用stringbuilder以及tostring然后进行s1与s2的拼接结果与s3进行拼接 即使如此在进行拼接时依然很浪费时间在下图情况下s2会进行一个长度的评估创建数组以及创建字符串s3又会发生一轮因此以后进行字符串拼接时还是用stringbuilder或stringjoiner的append好。3stringbuilder提高拼接效率的原理图此时串池里有abcstringbuilder源码stringbuilder初始有一个长度为16的字节byte类型数组当往里面append数据时实际上是往字节数组里添加对应的ascii码当添加的字符数小于16时字节数组无需扩容当字符数大于16小于等于34时数组扩容为16*22 当字符数大于34时数组扩容为字符数二、集合1.特点1自动扩容自动缩小长度和内容一致2只能存引用数据类型要存整数等要存其对应的包装类2.集合的种类1arraylistString是泛型限制arraylist里面只能存储string类型三、静态1.静态变量内存原理student的字节码文件被放入方法区之后堆中的静态区里面存放着静态变量内存中只有一份因为静态变量是随着类而加载的优先于对象出现可以通过对象找到静态变量2.静态方法1三种类javabean类私有化成员变量写无参构造和带全部参数的构造写get set方法以及额外方法工具类私有化构造方法使得无法创建该类对象因为没有意义所有方法都定义为静态方法23静态方法的细节非静态成员方法中是有this变量的如下图this是一个方法所在类型的形参由虚拟机自动赋值调用者的地址在一个成员方法内调用另一个成员变量或成员方法时调用处如下图的show2()前面默认带一个this而在静态方法中是没有this关键字的内存角度a.静态方法调用非静态变量会出错执行main中的第一行代码时首先把student字节码文件加载到方法区同时静态变量放到静态区执行第二行时会到静态区中寻找name和teachername但是name找不到因为他不是静态变量于是出错。b.非静态能够访问所有静态对于show方法由s1调用那方法内部就可以根据s1对象来找到anme和teachername也能通过s1找到该类的所有方法包括method。4重识main方法四、继承1基础知识设计真实的继承关系时用画图的方法来解决把所有类型放到最底层然后不断抽取共性共性在子类中直接删除即可形成父类写代码时直接按照图来写就行每个类应该包含的属性以及方法就是该类的圈里面所包含的东西2继承内容a.构造方法构造方法是一定不能继承的b.变量所有的成员变量都是可以继承下来的只不过private类型的变量子类不能直接使用但可以通过父类提供的get set方法来间接使用执行过程内存过程如下首先将teststudent类的字节码文件调入方法区然后main函数进栈开始执行执行第一行代码时zi的字节码文件及其父类fu的字节码文件 以及fu的父类object类的字节码进入顺序是先父类再子类都会进入方法区创建zi类对象时对象区域分为两块一块是zi自己的属性一块是fu的属性之后通过z.访问zi对象的属性时首先到zi自己的属性中去找找不到就到fu的属性中去找对于这种private修饰的情况使用z.name是找不到继承下来的name以及age变量的c.成员方法父类把自己虚方法即非private非static非final放进虚方法表继承时子类会拿到该虚方法表并把自己的虚方法添加进去子类调用父类虚方法时直接就能在虚方法表内找到如果不是虚方法则一级一级的向上找先找a再找b再找c比如执行zishow()时是虚方法即使是自己的方法直接在虚方法表内找到执行fushow2()时发现不是虚方法则先找zi再找fu发现是private方法直接报错3继承中的访问特点a.成员变量方法中单写name符合就近原则先局部变量后本类变量最后 父类变量b.成员方法也是就近原则使用this.调用时在本类找方法再到父类使用super.调用时直接到父类找方法重写相关知识重写方法的上面要加override虚拟机看到会检查重写的格式是否正确出错会标注红色波浪线子类重写父类方法时本质就是 子类方法会覆盖虚方法表中父类同名方法只要记住45两点即可c.构造方法也就是说子类的构造方法一定要先调用父类的构造方法4this与super注意这里的this......他是去调用本类的有参构造使得使用无参构造创建对象时无参构造使用有参构造完成成员变量的初始化当在构造方法写入this(....)它必须是放在第一行的否则会报错时就没有默认的super了因为他所调用的有参构造中有super()5其他细节子类中带全部参数的构造全部参数指的是子类以及父类中所有的参数父类中参数的初始化调用父类的有参构造来实现五、多态1.多态的前提父类变量可以接受直接子类或间接子类对象多态是当父类有show方法且子类都重写show方法父类变量接受子类对象的情况下父类变量.show调用的是对应子类中重写的show()方法2多态的调用特点java中加载字节码文件进方法区时永远是先加载父类的字节码文件再加载子类的父类有name变量子类中自己又定义了一个name变量时那子类中是有两个name变量的内存原理java中加载字节码文件时永远是先加载父类的字节码文件再加载子类的这个例子中加载顺序为objectanimaldogdog的字节码文件记录着其父类animal字节码文件的地址访问a.name时直接到父类的空间中去找name而不去子类的空间3多态缺点父类变量接受子类对象子类对象会默认转换为父类属于自动转换时无法调用子类特有的方法但是可以把该对象转换为原类型属于强转再去访问该方法强转前先用instanceof判断下更好a instanceof dog的作用是判断a是不是dog类的对象返回true或false六、一些知识点1.包全类名/全限定名就是包名加类名可以通过导包的方式指定使用的student类是itheima包下的也可以使用全类名使用类时要注意的问题2.final修饰符final修饰的变量在定义时一定要赋值且以后都不能再赋值也就是说final修饰的变量里面存储的东西是不能改变的基本数据类型是数据引用数据类型是地址3.权限修饰符4.代码块1局部代码块基本淘汰作用就是提前结束变量的生命周期变量只在所属大括号存在不过现在已经不用了因为现在内存很大了2构造代码块基本淘汰构造代码块会在创建对象时优先于构造方法执行可用于存放构造方法们共性的内容3静态代码块当类加载到内存时静态代码块自动执行唯一一次可用于做数据的初始化比如可以初始化本类的静态变量5.抽象类父类中无法确定方法体就把方法定义为抽象的有抽象方法的类必须定义为抽象类抽象方法虽说不能实例化但是他的构造方法仍然是有意义的比如子类可以用其构造方法进行父类属性的赋值七、接口实现了接口的类都可以传递给接口变量此时满足方法编译看左边运行看右边。变量编译和运行都看左边。1.接口的定义和使用2.接口中的成员特点接口.变量名可以访问接口里的变量无论是什么版本的jdk接口里的成员方法都默认为public static3.接口和类之间的关系当一个类实现多个接口且有同名方法时比如a接口有方法123b接口有方法1234把同名方法123重写一次即可这个重写即使a中的123的重写又是b中的当接口a有抽象方法1接口b有抽象方法2且继承了接口a接口b的实现类要重写方法124.扩展a.jdk8开始接口新增的方法下面的default和static方法对应上述的第二条public可以省略因为默认就是public修饰default和static不能省略如果省略了默认为abstract静态方法不能重写如果强行写个同名的静态方法也不叫重写b.jdk9的新特性这两种私有方法的作用就是给接口内的其他方法去访问不给外界使用不用static的给default方法使用有static的给static方法使用5.接口的适配器八、内部类1.内部类的定义2.内部类的分类前三种能看懂即可不重要a.成员内部类成员位置指的是类中方法外且不被static修饰private修饰的成员内部类只能被对应的外部类创建对象默认的能被本包的类创建对象和变量的访问原则是相同的当内部类被private修饰时可以有外部类提供获取内部类对象的方法其他类通过使用外部类提供的方法来获取对象但此时被赋值变量的类型不能写 外部类.内部类可以写父类object同名变量的情况内部类对象中有外部类对象的地址值outer.this就是内部类对象中的thisb.静态内部类静态内部类和静态变量使用方式很类似都可以通过类名.直接拿到定义成员内部类被static修饰就是静态内部类下图所示为静态内部类访问外部类的静态与非静态属性的演示静态内部类的方法无论是静态还是非静态都只能访问外部类的静态c.局部内部类能修饰局部变量的就能修饰局部内部类比如final不能则不能比如publicprivate下图是对上图第三点的解释外部类中有个属性b通过外部类的对象调用show方法方法内部类的对象的方法可以访问到外部类的属性b也可以访问到show方法的局部变量d.匿名内部类某个类只使用一次时就可以写成匿名内部类以下格式的含义是创建了一个对象这个对象实现了inter接口或者继承了某个类类体就是大括号的内容指的是创建对象时使用的是空参构造匿名内部类本质上长下面这样这个例子中swim接口中又swim抽象方法