当前位置: 首页 > 后端技术 > Java

Java笔记改进(更新中)

时间:2023-04-02 01:45:57 Java

一、Java简介1.1Java的特点1.11面向对象1.12平台无关Java语言提供的编译器不是针对特定的操作系统和CPU芯片进行编译,而是针对Java虚拟机器Java源程序被编译成字节码。Java虚拟机负责解释运行字节码,并将其翻译成虚拟机所在平台的机器码。1.13多线程1.14动态Java程序的基本单元是类。Java中的类是在运行时动态加载的。1.2Java开发步骤1.21编写源文件1.22编译源文件使用Java编译器(javac.exe)编译源文件得到字节码文件(.class文件)。如果源文件包含多个类,编译源文件会产生多个扩展名为.class的文件:javacfilename.java1.22运行程序使用JavaSE平台中的Java解释器(java.exe)解释执行字节码文件。包含publicstaticvoidmain(Stringargs[])方法的类称为主类。当Java应用程序中有多个类时,Java解释器执行的类名必须是主类名(不带扩展名)格式:java主类名1.23文件命名规则如果源文件中有多个类,那么只有一个类可以是公共类;如果有公共类,源文件的名称必须与类的名称完全相同;如果源文件没有public类,源文件的名称可以是任意合法的标识符(推荐与类的名称相同),扩展名是java。2.基本数据类型和数组2.1标识符和关键字2.11Java标识符定义了包名、类名、方法名、参数名、变量名等,这些符号称为标识符。标识符可以由字母、数字、下划线(_)、美元符号($)组成,但不能包含@、%、空格等其他特殊字符,不能以数字开头。2.12Java标识符规则包:全部小写。如果是多级包,则使用.分开。例如:itcast,cn.itcast,com.baidu,cn.itcast.test类和接口(见名称,驼峰命名):单词首字母大写。由多个单词组成,每个单词的首字母大写。示例:HelloWorld、HaoGuiBao方法和变量:单词的首字母小写。如果它由多个单词组成,则从第二个单词开始的每个单词的第一个字母大写。常量:如果是单词,全部大写,例如:PI。如果有多个单词,全部大写,以_分隔,例如:STUDENT_MAX_AGE2.2数据类型2.21Java基本类型2.22Java常量十六进制整型常量:用十六进制表示时,需要为0x或以0X开头,如0xff,0X9A。八进制整数常量:八进制必须以0开头,如0123、034。长整数:长整数必须以L结尾,如9L、342L。浮点数常量:由于十进制常量的默认类型是double,所以必须在float类型后加上f(F)。默认情况下,带小数的变量也是双精度类型。字符常量:字符常量需要用两个单引号括起来(注意字符串常量用两个双引号括起来)。2.23数据类型自动转换:当一个“小”数据与一个“大”数据进行运算时,系统会自动将“小”数据转换为“大”数据,然后再进行运算。这些从“小”到“大”的类型是(byte,short,char)-int-long-float-double。转换:将“大”数据转换为“小”数据时,可以使用转换。所有byte、short和char值都会被提升为int。包装类过渡类型转换:在每个包装类中,总是有一个名为××Value()的方法来获取对应的简单类型数据。字符串与其他类型的转换:1)其他类型到字符串的转换:①调用类的字符串转换方法:X.toString();②自动转换:X+"";③使用String的方法:String.volumeOf(X);2)String作为值,转换为其他类型:①先转换为对应的wrapper实例,再调用相应的方法转换为其他类型;例如字符中的“32.1”转换为double类型的值格式为:newFloat("32.1").doubleValue()。也可以使用:Double.valueOf("32.1").doubleValue()②静态parseXXX方法Strings="1";字节b=Byte.parseByte(s);2.3Java输入输出语句使用java.util包。导入java.util.*;构造Scanner类对象,附加到标准输入流System.in,Scanners=newScanner(System.in);常用的next()方法系列:nextInt():输入整数nextLine():输入字符串nextDouble():输入双精度数next():输入字符串(以空格为分隔符)。2.4数组声明、初始化和引用声明Array:特别注意int[]a,b[];相当于inta[],b[][];给数组赋值:特别注意Java,它不同于C语言,允许使用int类型变量的值指定数组元素的个数;length的使用:对于一维数组,“数组名.length”的值为数组中元素的个数;对于一个二维数组,"arrayname.length"的值就是它引用包含一维数组个数的数组:特别注意char类型的数组a,System.out.println(a)会不是输出数组a的引用而是数组a所有元素的值;如果要输出char数组的引用必须让数组a和字符串相加,如System.out.println(""+a);3.类与面向对象3.1类体的内容由两部分组成,一部分是变量的声明;另一部分是方法的定义;3.2成员变量和局部变量的区别类中的不同位置成员变量:类中方法外的局部变量:方法定义或方法声明中内存中的不同位置成员变量:在堆中(成员变量是部分theobject)局部变量:栈中不同的生命周期成员变量:随着对象的创建而存在,随着对象的消失而消失局部变量:随着方法的调用而存在,随着方法的调用完成而消失.初始化值不同的成员变量:有默认值局部变量:无默认值,必须在使用访问控制修饰符前定义、赋值不同的局部变量不能被访问控制修饰符和static修饰3.3构造方法与一般方法的区别是即构造方法在创建对象时初始化对象,一般方法在对象创建后调用函数时执行。可以使用对象多次调用普通方法,在创建对象时调用构造函数。构造方法的方法名应该和类名一样,普通方法只需要符合标识符的命名规则即可。构造函数没有返回类型。3.4构造代码块构造代码块:不加static关键字直接在类体中定义的代码块{}称为构造代码块。构造代码块的作用:统一初始化所有对象。构造代码块在创建对象时执行,在构造方法之前执行。3.5形参实参形参是方法声明中包含的参数声明,实参是调用方法时实际传递给形参的参数值。3.6实例成员和类成员成员变量可分为实例变量和类变量3.61实例变量和类变量的区别所有对象共享类变量:类中的变量,当类加载到内存时,分配相应的内存空间;可以通过类名直接访问类变量;3.62实例方法和类方法的区别(静态方法是没有this的方法)对象调用实例方法:当我们创建第一个对象时,类中的实例方法分配入口地址,再次创建对象时,入口地址不再分配;类变量也可以在实例方法中操作。类名调用类方法:类方法不能操作实例变量,这是因为类在创建对象之前还没有分配实例成员变量的内存。静态初始化块:静态初始化块只被调用一次,在类第一次加载到内存时执行,而不是创建对象。3.7方法重载方法名必须相同,参数列表必须不同。不能重载声明为静态的方法。不能重载声明为final的方法。说明:调用该方法时,如果没有找到匹配的数据类型,则将一种类型隐式提升为另一种类型。基本数据类型的层次关系如图1所示。3.8this关键字This可以出现在实例方法和构造方法中,但不能出现在类方法中;当this关键字出现在类的构造方法中时,表示使用该构造方法创建的对象。3.9访问权限4.子类与继承4.1继承的限制一个子类只能继承一个父类,但可以使用多级继承。子类继承时,所有非私有操作都属于显式继承,而所有私有操作都属于隐式继承(通过父类方法间接操作)。如果要实例化子类对象,默认会先调用父类。构造,在父类中初始化属性,然后调用子类构造。4.2方法重写子类重写父类的方法遵循“两个相同,两小一大”的原则。Both表示方法名和形参列表相同。二小的意思是子类方法的返回值类型要小于等于父类重写方法的返回值,子类方法声明抛出的异常类型要小于等于异常由父类方法抛出。一种意思是子类方法的访问权限应该大于或等于父类方法的访问权限。需要注意的是,覆盖方法和被覆盖方法要么是类方法,要么是实例方法。不能一个是类方法,一个是实例方法,否则会报编译错误。4.3super关键字子类构造方法创建对象时,子类构造方法总是先调用父类的某个构造方法;当子类的构造方法没有明确说明使用父类的哪个构造方法时,那么子类会默认调用父类中的无参构造函数;当子类构造函数中有super()关键字,而父类中没有无参构造函数,但有一个或多个有参构造函数时,是错误的;4.3final关键字用final修饰的变量是常量,不能改变。方法用final修饰后,子类中不能重写该方法,只能继承。类被final修饰后,类不能被继承。4.4对象的Upcast对象定义:如果A是B的父类,Aa;a=newB();那么类A的对象a被称为子类B对象b的向上转型对象。性质:Upcast对象可以操作子类继承或隐藏的成员变量,也可以使用子类继承或重写的方法。不会是新方法,也不会是父类原有的方法。4.5抽象类和方法抽象类可以有也可以没有抽象方法,但是抽象方法必须在抽象类中。抽象方法只允许声明,不允许实现(无方法体),子类必须实现抽象方法。abstract关键字abstract不能与以下关键字共存:private、final、static五、接口及实现5.1接口含义及定义接口定义:由接口声明和接口体两部分组成,格式:[public]接口接口名称接口body包含成员变量和方法:成员变量其实就是常量,默认都是publicstaticfinal;接口中的方法都是抽象方法,默认都是publicabstract。接口的实现:关键字implements用于声明一个类可以同时实现一个或多个接口,这些接口中的所有抽象方法都必须在类体中实现。重写接口中的方法:重写方法的访问权限必须修改为public。5.2接口回调接口变量:接口声明的变量接口回调:将实现某个接口的类创建的对象的引用赋值给接口声明的接口变量,接口变量就可以调用接口实现的接口方法班上。接口回调类似于在转换对象上调用子类重写的方法。5.3接口和抽象类的比较和区别:抽象类中的抽象方法是可选的,接口只能包含抽象方法;一个类只能继承一个直接父类,但可以实现多个接口;抽象类是继承体系的公共内容,接口是继承体系中的扩展功能;接口只有常量,抽象类可以有常量和变量。相同:两者都处于继承的顶端,用于被其他类实现或继承;两者都不能直接实例化对象;两者都可以包含抽象方法,它们的实现类必须重写这些抽象方法。