Java基础02

发布时间:2026/10/13 6:21:22
Java基础02 1.数组数组是一个数据容器用来存放同类型的数据。int[] arr{1,2,3,4}; //简化写法 int[] arrnew int[]{1,2,3,4}; //完整格式访问格式数组名[索引] 例如arr[0];元素个数 数组名.length 例如arr.length动态化存储数组int[] arrnew int[8];默认值规则byte、short、char、int、long默认值0float、double默认值0/0boolean默认值false类、接口、数组、String默认值null静态初始化 //二维数组int[][] arrnew int[][]{ {12,34,55}, {45,56}, {78,99,100,45} };动态初始化int[][] arrnew int[3][5];2.面向对象三大特征继承、封装、多态2.1 封装类是对象的封装对象是类的实例.先创建类public class Student { String name; double chinese; double math; }再创建对象public class Test { public static void main(String[] args) { Student s1new Student(); s1.name张三; s1.chinese18; s1.math19; System.out.println(s1.name的语文成绩是s1.chinese); System.out.println(s1.name的数学成绩是s1.math); Student s2new Student(); s2.name李四; s2.chinese20; s2.math18; System.out.println(s2.name的语文成绩是s2.chinese); System.out.println(s2.name的数学成绩是s2.math); } }封装把数据和对数据的处理放到同一个类中。例如上述的学生类只有数学和语文成绩在类中写总成绩函数与平均成绩函数就是封装。对象可以看作一种特殊的数据结构例如一张表。类就是表的模板对象就是具体的表。栈存放引用的变量例如我们要输出的是s1.name,引用的就是s1的数据s1就是引用的变量栈里边存放的是内存地址可以理解为存放的是门牌号找到栈拿到门牌号之后去堆里边获取具体的信息。堆存放具体的对象方法区存放类。构造器是一种特殊方法没有返回值类型名称必须跟类名一致作用是简化代码构造器在创建对象时会自动完成对象的初始化赋值。//无参构造器 public Student{ }; //有参构造器 public Student(String name){ };构造类的时候本身就自带了一个无参构造器写Student s1new Student();是没问题的但如果写了有参构造器自带的无参构造器默认失效上述写法将报错解决方法是新写一个无参构造器。this关键字一个变量来拿到当前对象。解决名称冲突问题。封装合理隐藏private),合理暴露public的get set方法) set赋值get取值生成私有变量右键选择generate,选择getter/setter/getter和setter,按住shift点击最后一个可以全选生成get/set方法。实体类成员变量为私有且有public的getter/setter方法有无参构造器有参构造器可选。实体类只存数据进行数据拿放不存放业务方法static关键字叫静态可以修饰成员变量、成员方法。成员变量分为1. 静态变量有static修饰属于类在计算机中独一份2. 实例变量无static修饰属于每个对象的。静态变量在对象中赋值只保留最后一个赋值。因为静态变量只有一个在不同对象中赋值其实是在修改一个变量。实例变量相反每个对象修改的是自己的变量。成员方法分为1. 静态方法有static修饰属于类在计算机中独一份2. 实例方法无static修饰属于每个对象的。如果一个方法只是为了做一个功能并且不需要访问对象的数据就定义为静态方法。工具类没有创建对象的需求建议将工具类的构造器进行私有。tips:1.静态方法可以直接访问静态成员不能直接访问实例成员。2.实例方法可以直接访问静态成员也可以直接访问实例成员。3. 实例方法可以出现THIS关键字静态不行。2.2 继承关键字 extends public class B extends A A是父类B是子类子类可以继承父类的非私有成员子类的对象是由子类、父类共同完成的。权限修饰符被访问的范围1. private 只能本类2. 缺省什么都不写 : 本类、同一个包中的类3. protected 本类、同一个包中的类、子孙类4. public : 任意位置继承的特点1. 单继承 一个类只能继承一个直接父类2. 多层继承 : 不支持多继承多个父类但可以多层继承父类层层传递3. 祖宗类Java中的类都是Object中的子类4. 就近原则 : 优先访问自己类自己没有的访问父类如果父子类有重名且想要访问父类需要加super. 访问子类可以加this.方法重写1.名称、形参必须一样2.Override著明这是重写更安全 toString重写直接输入toS选择第二个然后两次回车3.子类重写的方法权限要大于等于父类的方法publicproteceddefault缺省4.私有方法、静态方法不允许重写5.重写方法的返回值类型必须一致或更小子类的构造器必须先调用父类的无参构造器因为子类构造器默认有一个super()会调用父类再调用自己的。不用super(参数)指定的话会自动调用父类的无参构造器。写法父类定义变量定义有参无参构造器。子类继承父类定义变量定义无参有参构造器super引入父类构造器内容。直接调用子类构造器可以使用父类变量。super(.....)和this(....)必须在构造器第一行第二行及以后会报错。super(..)和this(...)不能同时出现。2.3 多态多态是继承/实现情况下的一种现象表现为对象多态行为多态。方法编译看左边运行看右边。变量编译和运行都看左边。多态的前提有继承/实现关系存在父类引用子类对象People p1new Student();People p2new Teacher(); )存在方法重写多态可以向上转型。写wolf可以用animal的方法。Animal a1new Wolf();向下转型一般是在向上转型的基础上因为编译看左边a1只能用animal类中的方法虽然运行的时候可以用子类wolf的方法但由于编译看左边写不出来这时候就要用向下转型写出来。类型转换自动类型转换父类 变量名new 子类();强制类型转换子类 变量名(子类) 父类变量;//向上转型 Animal a2new Tortoise(); go(a2); a2.run(); System.out.println(a2.name); //向下转型 Tortoise t1(Tortoise) a2; t1.shrinkHead();为避免转型错误(ClassCastException),可以用instanceof判断2.4 final关键字变量分为成员变量静态变量和实例变量和局部变量循环中定义的变量。注意事项final修饰基本类型的变量变量存储的数据不能更改final修饰引用类型的变量变量存储的地址不能更改但是地址指向对象的内容是可以被更改的常量加了static final修饰的成员变量就是常量。一般命名全为大写且单词之间用_连接例如SCHOOL_NAME2.5 单例类、枚举类、抽象类2.5.1 单例设计模式作用确保一个类只能创建一个对象例如进程管理器只能打开一个设计模式是具体问题的最优解决方案。写法构造器私有化定义一个类变量(即静态成员变量)记住类的一个对象定义一个类方法返回对象饿汉式单例拿到类的时候对象已经创建好了。public class A { private static A anew A(); private A(){} public static A getInstance(){ return a; } }懒汉式单例拿到类之后才开始创建对象public class B { private static B b; private B(){ } public static B getObject(){ if(bnull){ bnew B(); } return b; } }2.5.2 枚举枚举类是一种特殊类不用class 用enum写法选择java.class之后有enum类型可以直接选//修饰符 enum 类名{ // 名称1名称2名称3.... 这些名称本质是常量每一个都记住了一个枚举类的一个对象 //其他成员 //} public enum A{ X,Y,Z; }枚举类都是最终类不可以被继承但他们需要继承java.lang.Enum类。第一行只能罗列一些名称且这些名称都是常量。每个常量都会记住枚举类的一个对象。构造器是私有的。多例对象作用枚举做信息分类和标志。2.5.3 抽象类抽象类abstract 可以修饰类和方法抽象方法只有方法名没有方法体即{})注意抽象类中不一定有抽象方法有抽象方法的一定是抽象类。抽象类也可以有成员变量方法构造器。抽象类最主要的特点是不能创建对象只作为一种特殊父类可以有子类继承并实现子类继承抽象父类必须重写所有抽象方法否则也会被定义为抽象类。好处就是父类定义一个子类都有但是各异的方法例如动物叫声不同可以在父类中写一个抽象方法子类中重写适用于多态向上转型。抽象类可以用来简化代码提高代码复用率。步骤1.构建抽象类。2.写模板方法最好加final避免被修改 3.写有异部分用抽象方法写这样子类必须重写3.接口接口类interface:JDK8之前接口类里边只能写常量和抽象类。常量可以省略public static final,抽象类可以省略public abstract接口可以被类实现可以理解为特殊的继承继承的类称为实现类。一个实现类可以实现多个接口。写法为修饰词 class 实现类名 implements 接口1接口2.....public class C implements A,B{ Override public void show() { } Override public void methodB() { } }接口只能写抽象类所以接口里边也不能创建对象。JDK8以后接口新增方法default void go(){} //使用接口的实现类的对象就可以调用private void run(){} //使用接口中的其他实例方法来调用比如上边的go方法中可以使用run()static void show(){} //静态方法只能用接口名来调用注意一个接口可以继承多个接口一个接口继承多个接口如果多个接口存在方法签名冲突那么不支持多继承/多实现一个类继承了父类也实现了接口有同名的默认方法时会优先用父类的一个类实现了多个接口多接口存在同名的默认方法不冲突类重写即可4.代码块类的五大成分成员变量、构造器、方法、代码块、内部类代码块分为静态代码块和实例代码块。静态代码块static{ System.out.println(静态代码块); card[0]A; card[1]2; card[2]3; card[3]4; }输出数组时可以调用Arrays.toString(数组名 就可以输出数组内容。例如System.out.println(Arrays.toString(card));实例代码块{} 无static 属于对象5.内部类分为成员内部类、静态内部类、局部内部类、匿名内部类5.1 成员内部类类似于成员变量就是在一个类中再写一个类public class Outer { //外部类 public class Inner{ //成员内部类属于对象因为没有static public void show(){ System.out.println(show); } } } //创建对象如何调用 Outer.Inner anew Outer().new Inner(); a.show();内部类成员访问外部类成员的特点内部类可以直接访问外部类成员的静态成员和实例成员成员内部类的实例方法中可以拿到当前寄生的外部类的外部类对象外部类名.this Outer.this5.2 静态内部类加static修饰的内部类只加载一次由外部类持有创建对象Outer.Inner anew Outer.Inner(); //与成员不同只能访问外部类的静态成员5.3 局部内部类定义在方法、代码块、构造器中了解即可5.4 匿名内部类程序员不用自己命名默认有个隐藏的名字。本质就是一个子类并且会立即创建出一个子类对象。写法new 类名/接口名(参数值){ 类体一般是方法重写 }关于匿名内部类应用场景有一个排序Arrays.sort(students, new ComparatorStudent() { Override public int compare(Student o1, Student o2) { //指定排序规则 //如果左边大于右边返回正整数 //右边大于左边返回负整数 //两边相等返回0 if(o1.getAge()o2.getAge()){ return 1; }else if(o1.getAge()o2.getAge()){ return -1; } return 0; } });Arrays.sort(数组名匿名内部类以上写法可以按照年龄升序输出。