本文仅是自己的学习笔记,更多学习内容请看b站尚硅谷康老师《Java基础》的讲解
最基本的表达形式:
Class HelloChina{
-------public static void main(String[] args){
-------System.out.println(“”);
}
注意:一个源文件中可以声明多个类,但是最多只能有一个类使用public进行声明。且要求声明为public的类的类名与源文件名相同
注释:
单行注释://注释文字
多行注释:
/*
注释文字1
注释文字2
注释文字3
*/
文档注释(**文档注释内容可以
List item
被JDK提供的工具javadoc所解析,生成一套以网页文件形式体现的该程序的说明文档**)操作方式:javadoc -d 自定义文件名 -author -version HelloWorld.java
/**
@author
@version
*/
规则
规范(多单词组合下的情况)
整型:byte(1字节=8bit)\short(2字节)\int(四字节)\long(8字节)
注意:声明long类型变量时,需要提供后缀,后缀为‘l’或者‘L’ 如:long l1 = 12313232L
浮点类型:double/float
注意:声明float类型变量时,需要提供后缀,后缀为‘f’或者‘F’
浮点类型:char(2字节)
注意:char c = ’ ‘; ‘ ’内有且只能只能放一个字符; ‘ ’内直接用Unicode的值来表示字符常量:‘\uXXXX’;‘ ’内直接使用转义字符;变量c可以直接赋值一个整型用来表示ASCII码
布尔类型:boolean
只有ture与false两个值
字符串类型:String,字符串能够相加减并赋值
基本数据类型变量间的运算规则:
不同进制的标识:
二进制如何表示整数:
计算机数据的存储使用二进制补码形式存储,并且最高位是符号位。
(1)、正数:最高位是0
(2)、负数:最高位是1
规定
(1)、正数的补码与反码。原码一样,称为三码合一
(2)、负数额度补码与原码和反码不一样:
负数的原码是把十进制转化为二进制,然后最高位设置为1;负数的反码是在原码的基础上,最高位不变,其余位取反;负数的补码:反码+1
二进制转换成八进制:每三位看成一位
二进制转换成十六进制:每四位看成一位
算术运算符:除:/、取模(取余):%、字符串连接:+
赋值运算符:赋值:“=”、+=、*=、%=、/=:如m+=5—>m=m+5(该过程属于强制类型转换)
比较运算符:instanceof:检查是否是类的对象,如“Hello instanceof String=ture”;”==“:对于基本数据类型判断值是否相等,对于引用数据类型比较地址值是否相等
逻辑运算符:&或&&:且(当左边是ture的时候&和&&都会执行右边的,但当左边是false的时候,&会执行右边的,但&&不会执行右边的)、|或||:或当左边是false的时候|和||都会执行右边的,但当左边是ture的时候,|会执行右边的,但||不会执行右边的)、!:非、^:异或(两边相同则为false,两边不同则为ture)
位运算符(都是针对十进制数的二进制):<<:左移(十进制数的二进制向左移动一位且向后补0,相当于在原有的基础上乘以二【正负数在一定范围内都适用】)、>>:右移(相当于在原有的基础上除以二,除不尽就向下取整【正负数在一定范围内都适用】)、>>>:无符号右移(与>>不同的是负数向右移动的时候“>>>”是补0,而“>>”是补1)、&:与运算、|:或运算、^:异或运算、~:取反运算
条件运算符:(条件表达式)?表达式1:表达式2---->条件表达式为ture,则执行表达式1,否则执行表达式2(开发中凡是可以适应条件运算符位置的地方,都可以改写成if-else,反之能使用if-else结构的,不一定能改写成条件运算符,但条件运算符的运算效率更高)
Lambda运算符:略
随机数:Math.random();代表的是[0.0 , 0.1]的double类型随机数
根号:Math.sqrt();
基本的Scanner输入:
Scanner scan = new Scanner(System.in);String name = scan.next()==(还有nextInt、nextDouble等nextXXX方法,要输入char类型的使用next().charAt(0););
switch-case选择结构:switch(表达式){ case 常量1://执行语句//break……default//break}
bresk和continue的区别:break是结束当前最近的循环结构;continue是结束当次最近的循环结构;break和continue可以配合label使用,用来结束指定的循环,==如:label:for(;;;){ break label;}
数组的分类:
int [ ] arr;arr = new int{};
int [ ] arr;arr = new int[4]
int arr[] = new int[4];int[ ] arr = {}
int [ ][ ] arrs = new int[ ][ ]{{}、{}……}
int [ ][ ] arrs = new int[长度][长度或者省略 ]
arrs.length
就是二维数组最外层的长度,arrs[0].length
输出最内层的长度equals:Arrays.equals(arr1,arr2 )
toString:Arrays.toString(arr1);
Arrays.fill(arr1,int类型);
Arrays.sort(arr1);
Arrays.(arr1,int key);
JVM运行时内存环境
内存分为五个部分:程序计数器、虚拟机栈、本地方法栈、堆、方法区
与目前数组相关的内存结构:虚拟机栈(用于存放方法中声明的变量,即变量名与地址)、堆(用于存放数组的实体,即数组中所有的元素)
设计类,其实就是设计类的成员
class Person{
}
类的内部成员
成员一:属性、成员变量、field(字段、域)
成员二:(成员)方法、函数、method
public class Person{
String name;//属性
public void fist{//方法
System.out.println(“能打人”)
}
}
类的调用
public class PersonTest{
public static void main(String[ ] args){
Person p1 = new Person();
p1.name = Hua;
p1.fist();
}
}
引论:按照变量在类中声明的位置的不同:成员变量(或属性)、局部变量(方法内、方法形参、构造器内、构造器形参、代码块内等)
不同点:
方法的声明模板:权限修饰符【其他修饰符】 返回值类型 方法名(形参列表)【throws 异常类型】{//方法体}
注意点:
含义:数组的元素可以是基本数据类型,也可以是引用数据类型。当元素是引用类型中的类时,我们称为对象数组(Student[ ] students = new Student[2]这;只是创建了Students类型的数组,但Student数组中每个student[i]对象并没有创建,需要循环student[i] = new Studen()
)
定义:在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,满足这样特征的多个方法,彼此之间构成方法的重载
总结:”两同两不同“
可变个数形参的方法:在调用方法的时候,可能会出现方法形参的类型是确定的,的那参数的个数不确定。此时,我们就可以使用可变个数形参的方法。格式如:public void A(int ... 参数名);
(2)、引用数据类型的局部变量:传递的是地址值,比如:int [ ] a = {1,2,3,4}、int [ ] b = a;b[0] = 10;
此时a[0] = 10
,对象类型也一样`
(2) 对于引用数据类型:A a = new A(),a.age = 10;test(a)【test函数是将对象中的属性加一;此时a.age = 11
结论:Java中的参数传递机制是值传递(包括数据值传递、地址值传递)
package:包,用于指明该文件中定义的类、接口等机构所在的包 ;设置包的作用:
import:import 包名.类名
含义:所谓封装,就是把客观事物封装成抽象概念的类,并且类可以把自己的数据和方法只指向可信的类或者对象开放,向没必要开放的类或者对象隐藏信息,相当于我们只需要知道类的使用方法即可,不需要知道具体如何实现的;其设计思想就是把该隐藏的隐藏起来,该暴露的暴露出来
权限修饰符:private、缺省、protected、public,用修饰词修饰的属性或者方法在各个地方是否能被调用(通过类来调用)的情况如下,要想使用被限制的属性可以使用自定义的set(在类的内部定义在外部类使用)和get(在类的内部定义在外部类使用)方法、构造器来调用赋值 ,类的修饰词只有public和缺省
含义:Person p1 = new Person();
作用:(1)、搭配new关键字,创建类的对象;(2)、在创建对象的同时,可以给对象相关属性赋值
(3)、创建指定属性值的对象,造一个轮胎23村的车子
说明:
理解:JavaBean是一种Java语言写成的可重用的组件,相当于做了一个扳手,这个扳手会在很多地方拿去被用。
特征:(1)、类是公共的(2)、有一个无参的公共的构造器(3)、有属性,且有对应的get、set方法
一个类中的多个方法可以相互调用,调用过程默认省略this
public User(){
//模拟对象创建时,需要初始化50行代码。
}
public User(){
this();
this.name = name;
}
public User(){
this(name);
//this.name = name;
this.age = age;
子类可以有独立于父类的其他方法
理解:(1)、自下而上:定义了一个类A,在定义另一个类B时,发现类B的功能与类A相似,考虑类B继承类A。(2)、定义了类B、C、D等,发现B、C、D有类似的属性或方法,则可以考虑将相同的属性和方法进行抽取,封装到类A中,让B、C、D、继承于类A,同时B、C、D中的相似的功能就可以删除了
优点:减少了代码冗余,提高了代码的复用性;有利于功能的扩充;继承的出现让类之间产生了‘is-a’的关系,为多态的使用提供了前提;继承描述事物之间所属的关系,这种关系是‘is-a’的关系,可见,父类更通用,更一般,子类更加具体。
格式:class A{ };class B extends A{ };
基本的概念:类A:父类、superclass、超类、基类;类B:字类、subclass、派生类
注意:子类就获取到了父类中声明的所有属性与方法,但是由于封装性的影响,可能子类不能直接调用父类中声明的属性或方法,同样可以通过get于set方法进行访问;支持多层继承、单继承不支持多重继承(不能有多个父亲)
默认的父类:Java中声明的类、如果没有显式的声明其父类时,则默认继承于java.lang.Object
原因:子类在继承父类以后,就获取了父类中声明的所有方法。但是,父类中的方法可能不太适用于子类,换句话说,子类需要对父类继承过来的方法进行覆盖、覆写的操作。
规则:子类如何准确地对父类重载的方法进行重写:
使用super的情况:(1)、子类继承父类以后,对父类的方法进行了重写,在子类中,可以利用super实现对父类被重写的方法进行调用;(2)、子类继承父类以后,发现子类和父类中定义了同名的属性,可以利用super进行区分。
super可以调用的结构:属性、方法、构造器
生活举例:女朋友想养宠物,我给了她一条萨摩耶(子类狗的对象萨摩耶赋给了父类宠物对象);孩子想要一个玩具,我给他一个塑胶奥特曼(子类塑胶玩具的对象奥特曼赋给了父类玩具对象)
Java中多态性的体现:指的就是子类对象的多态性,父类引用指向子类的对象。(或者子类的对象赋给父类的引用。如:Pets a = new Dog();a.eat();
其中a.eat()运行的是子类Dog的方法【编译看左边,运行看右边】
多态性的重写:(1)、要有类的继承关系(2)、要有方法的重写
举例:
public class AnimalTest{
public static void main(String[ ] args){
AnimalTest test = new AnimalTest();
//子类多态性的优点……………………………………………………………………
test.adopt(new Dog());
test.adopt(new Cat());
}
public void adopt(Animal animal){
animal.eat();
}//要想调用不同子类对象的方法,只需要利用子类的多态性将子类对象赋值给父类引用,即Animal animal = new Dog(),不需要在为猫或狗在定义方法了
//子类多态性的优点……………………………………………………………………
}
class Animal{
pubic void eat(){}
}
class Dog extends Animal{
public void eat(){}
public void watchDoor(){}
}
class Cat extends Animal{
public void eat(){}
public void play(){}
}
优点及弊端:
public void adopt(Animal animal){ }
,是多态使用最多的场合。即便增加了新的子类,方法也无需改变,提高了扩展性符合开闭原则【针对扩展开放,对修改关闭】public void adopt(Animal animal){animal.eat()}
中只能写animal.eat()
重写的方法,不能单独使用animal.play()
或者animal.watchdoor()
类比于自动类型提升和强制类型转换:
比如:Person p1 = new Man();此时p1并不能调用子类Man中特定的方法earnMoney(),只能通过向下转型,Man m1 = (Man)p1;m1.earnMoney();
为了避免转型过程中把类的类型赋错,如:Person p2 = new Woman();Man m2 = (Man)p2;m2.earnMoney();
为词需要使用instanceof: a instanceof A判断a是否为A的一个实例关键字,即if (p2 instanceof Man){Man m2 = (Man)p2;m2.earnMoney();}
说明:类java.lang.Object是类层次结构的根类,即所有其他类的父类。每个类都使用Object作为超类。其没有声明属性,并提供了一个空参的构造器,但Object类提供了许多方法如下:
Animal a2 = (Animal)a1.clone();//a1是a2的克隆Object对象,故要向下转型
适用范围:除了基本数据类型(用的是==),任何引用数据类型都可以使用
java.lang.Object类中equals()的定义:public boolean equals(Object obj){retur(this == obj);
其他的子类的equals()方法可能重写了,故不同的类中的equals()的方法的作用不相同,比如String、File、Data和包装类等。
子类使用说明:
public boolean equals(Object obj){
if(this == obj){//如果obj与正在创建的对象同地址,则为真
return true;
}
if(obj instanceof User){//因为java的多态性Object obj可以==new User();故要判断obj是否属于User类
User user = (User)obj;//判断obj属于User类后,通过向下转型一边obj可以使用子类User中的一些特有的方法与属性值
return this.age ==user.age&&this.name.equals(user.name);//此时的equals方法是String的,不是目前自定义的
目的以及作用:使类的所有实例对象能够共享,比如中国人这个类能够共享中国国籍这个静态属性;在使用静态方法时也能够省略创建实例(new)这个步骤。
static修饰的结构:属性、方法、代码块、内部类;
——加载时机:静态变量随着类的加载而加载;实例变量随着对象的创建而加载
——消亡时机:静态变量随类的消亡而消亡;实例变量随对象的消亡而消亡;
单例设计模式含义:采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。
思路**:将类的构造器的访问权限设置为private**,这样,就不能用new操作符在类的外部产生类的对象了,但在类的内部仍然可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。
方法:
public class BankTest{
public static void main(String[ ] args){
Bank bank = Bank.getInstance();
}
class Bank{
//类的构造器必须要私有化,才能让外部类不能随便创建实体对象
private Bank(){}
//在类的内部创建当前类的实例对象,相当于该类的属性,必须要用static修饰,才能被下面的静态方法调用
private static Bank instance = new Bank();
//因为构造器已经私有化了并且外部类已经不能创建实例了,所以必须使用静态方法调用实体对象
public static Bank getInstance()
return instance;
}
}
private static Bank instance = new Bank();
变成private static Bank instance = null;并把instance = new Bank()放在getInstance()方法内,此时要判断
instance是否为空作用:用来初始化类或者对象信息(即初始化类或对象的成员变量)
代码块的修饰:只能使用static进行修饰,根据是否用static修饰分为静态代码块和非静态代码块
位置以及顺序:默认初始化---->显示初始化、代码块中初始化—>构造器中初始化—>有了对象后可以通过对象.属性或者对象.方法(即set与get方法)
具体说明:
设置抽象类的目的:随着继承关系的逐渐深入,子类会变得越来越具体,而父类则更加一般,更加抽象,因此我们通常会使用子类来创建实例对象,但是由于多态性和继承性,父类并不能被摒弃,故可以通过abstract将父类改成不能创建实例对象的抽象类,如以下代码:
abstract class GeometricObject{//几何图形,不知道使三角形还是其他的图形
//求面积(只考虑提供方法的声明,因为没有具体的形状故没办法提供方法体,所以,此方法适合声明为抽象类
//求周长(同上)
}
class Circle extends GeometricObject{
//求面积(必须要重写或实现父类中的抽象方法)
//求周长(同上)
抽象方法:用abstract修饰的方法,只有方法的声明,没有方法体比如:public void A();
只有声明父子类共有方法的功能,没有具体的实现,具体的实现需要通过子类的重写实现
注意:
理解:接口的本质是契约、标准、规范,就像我们的法律一样。指定后大家都需要遵循(例如type-c接口,你要是不是(不遵循)这种类型的接口,你将无法实现接口的充电功能);接口(interface)与抽象父类(abstract class)是很相似的,可比较记忆;满足接口(即implements 接口名)就可以使用接口的功能(即是接口的抽象方法)
内部结构的说明:
public class InterfaceTest{
public static void main(String [ ] args){
}
}
interface Flyable{
//全局变量
public static final int MIN_SPEED=0;
//由于接口属性的默认方式,故public static final可以省略
int MIN_SPEED=0;
//抽象方法
public abstract void fly();
//由于接口方法的默认方式,故publi abstract可以省略
}
接口与类的关系:实现关系(class A implements B即要A实现B的方法)
格式:class A extends SuperA implements B,C{ };
A相较于SuperA来讲,叫做子类,A相较于B,C来讲,叫做实现类
abstract class Plane implements Flyable{}//该Plane类要满足该接口要么使用abstract修饰,要不像下面代码一样重写方法
class Bullet implements Flyable,Attackable{
public void fly(){
//实现该方法
}
}
说明:类可以实现多个接口;类针对于接口的多实现,一定程度上弥补了类的单继承的局限性;类必须将实现的接口中的所有抽象方法都重写(或者实现),方可实例化,否则,此实现类必须声明为抽象类。
接口与接口的关系:继承并且可以多继承
interface AA{
void method1();
}
interface BB{
void method2();
}
interface CC extends AA,BB{
}
class DD implements CC{
}
接口的多态性:接口名 变量名 = new 实现类对象;(类比于继承的多态性);代码与继承的多态性高度重合可看上面
扩展:创建接口匿名实现类的对象:new 接口名字(){重写方法}可以代替匿名实现类
//本来是USB usb1 = new 接口实现类
USB usb1 = new USB(){//由于实现类是匿名的,故先用new USB()顶替者,但USB接口是abstract的不能创建对象的,故必须要临时重写方法,所以要加{}
方法的重写
}.实现类的方法
类.方法(usb1)//类.方法(接口类型)
注意:以上匿名实现类的对象创建的写法,继承性也可以写哦,并且十分常见,必须理解看懂
定义:将一个类A定义在另一个类B中,里面的那个类A就称为内部类,类B就称为外部类
使用内部类的原因:当一个事物A的内部,还有一个部分需要一个完整的结构B进行描述,而这个内部的完整的结构B又只为外部事物A提供服务,不在其它地方单独使用,那么整个内部的完整结构B最好使用内部类,遵循“高内聚,低耦合”的面向对象开发原则
内部类的分类(参考变量的分类):
public class OutclassTest{
public static void main(String [ ] args){
Person.Dog dog = new Person.Dog();//静态成员内部类对象的创建
Person p1 = new Person();
Person.Bird bird = p1.new Bird();//非静态成员内部类对象的创建
}
}
class Person{//外部类
in age;
String name;
//静态成员内部类
static class Dog{
}
//非静态成员内部类
**class Bird{**
String name;
public void show(String name){
print(age);//直接调用外部类Person成员age,其中省略了Person.this.age
print(name);//打印形参变量name
print(this.name);//打印本内部类Bird成员name
print(Person.this.name);//打印外部类Person成员name
}
}
public void method(){
//局部内部类
class InnerClass1{
}
}
public Person(){
class InnerClass1{
}
}
{
class InnerClass1{
}
}
}
定义:本质上也是一种类,只不过这种类的对象是有限的、固定的几个,不能让用户随意创建。
开发中的建议:开发中,如果针对于某个类,其实例是确定个数额,则推荐将此类声明为枚举类;如果枚举类的实例只有一个的时候,则可以看作是单例的实现方式。
举例:
……………………………………………………………………jdk 5.0之前…………………………………………………………
public class SeasonTest{
System.out.println("Season.SPRING");//通过类直接来调用对象,要打印出来下面必须要重写toString方法,我省略掉了
}
class Season(){
//声明当前类的对象的实例变量,对象创建好之后,变量不能再改变了,故用final来修饰
private final String seasonName;
private final String seasonDesc;
//由于对象的个数是有限的,故外界不能随便创建对象了,所以构造器要变成私有的
private Season(String seasonName,String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
public String getSeasonName(){
return seasonNamel
}
public String getSeasonDesc(){
return seasonDesc;
}
//创建类的实例对象,因为构造器私有了,故只能在类的内部创建固定的对象了,外部要调用实例则必须通过类来调用,所以必须要加上static修饰
public static Season SPRING = new Season("春天","春暖花开");
public static Season SUMMER = new Season("夏天","夏日炎炎");
重写toString()
……
}
…………………………………………………………………………jdk 5.0………………………………………………………………
enum Season{
//必须在枚举类的开头声明多个对象。对象之间使用,隔开
SPRING("春天","春暖花开"),SUMMER("夏天","夏日炎炎");
//声明当前类的对象的实例变量,对象创建好之后,变量不能再改变了,故用final来修饰
private final String seasonName;
private final String seasonDesc;
//由于对象的个数是有限的,故外界不能随便创建对象了,所以构造器要变成私有的
private Season(String seasonName,String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
public String getSeasonName(){
return seasonNamel
}
public String getSeasonDesc(){
return seasonDesc;
}
不需要重写toString(),默认会println会打印对象的值
}
……………………………………………………………………………………………………………………………………………………………
//每个枚举类对象没有具体的值,就可以直接省略如下,枚举类对象名就是一个值。
enum Season{
SPRING,SUMMER;
}
枚举类的一些方法:
枚举类实现接口的操作:
——枚举类实现接口,在枚举类中重写接口中的抽象方法。当通过不同的枚举类对象调用此方法时,执行的是同一个方法。
——枚举类中的每个对象都可以重写接口的方法:像下面的代码:
SPRING("春天","春暖花开"){
public void show(){
//重写接口方法
}
},
SUMMER("夏天","夏日炎炎"){
public void show(){
//重写接口方法
}
};
【用处:框架 = 注解 + 反射 +设计模式】
理解:
——注解(Annotation)是从JDK5.0开始引入的,以“ ‘@注解名’ ”在代码中存在。
——Annotation可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。还可以添加一些参数值,这些信息被保存在Annotation的“name = value”对中。
——注解可以在类编译、运行时进行加载,体系那不同的功能。
注解的应用场景:生成文档的相关注解;在编译时进行格式检查(JDK内置三个基本的注解);跟踪代码依赖性,实现替代排至文件功能
Java基础涉及到的三个常用的注解:
——’@Override‘:限定重写父类方法,该注解只能用于方法【可以用来检查重写的方法是否写正确】
——’@Deprecated‘:【用于表示所修饰的元素(类、方法等)已过时。】 通常是因为所修饰的结构危险或者存在更好的选择
——‘@SuppressWarnings’:抑制编译器警告
元注解:对现有的注解进行解释说明的注解(有四种基本的元注解)
——‘@Target‘:用于表示自己修饰的注解能够修饰哪些结构
——’@Retention‘:用于表示声明周期的
——‘@Documented’
——’@Inherited‘
单元测试:可以省略main方法,直接对每个单元(方法)单独运行测试,不受其他方法的影响,具体见链接:单元测试方法以及流程和单元测试直接办法
使用包装类的原因:因为许多类方法的形参和泛型只针对对象类型,而不能使用基本数据类型;因此为了使得基本数据类型的变量具备引用数据类型变量的特征(多态、继承、封装),我们给各个基本数据类型的变量都提供了对应的包装类。
基本数据类型对应的包装类类型:
基本数据类型与包装类之间的转换:
为什么需要转换:
——因为许多类方法的形参和泛型只针对对象类型,而不能使用基本数据类型;因此为了使得基本数据类型的变量具备引用数据类型变量的特征(多态、继承、封装),我们给各个基本数据类型的变量都提供了对应的包装类。
——对于包装类来讲,既然我们使用的是对象,那么对象是不能进行数值运算的,为了能够使用这些运算,就需要将包装类的对象转换为基本数据类型的变量。
如何相互转换:
//第一种方式
int i1 = 10;
Integer ii1 = new Integer(i1);//此时ii1已经称为i1转换后的对象了
int i1 = ii1.intValue();//包装类数据类型转换成基本数据类型
i1 = i1+1;
…………………………………………………………………………………………………………………………………………………
//第二种方式(推荐)
int i1 = 10;
Integer ii1 = Integer.valueof(i1);
int i1 = ii1.intValue();//包装类数据类型转换成基本数据类型
i1 = i1+1;
…………………………………………………………………………………………………………………………………………………
//第三种方式(jdk5.0支持,更加方便)
int i1 = 10;
Integer ii1 = i1;//自动实现
Integer ii1 = i1+1;
int i1 = ii1;//自动实现
基本数据类型和包装类转换成String类型的:String.valueOf()或者【基本数据类型、包装类+“ ”】;反过来就是Xxx.parseXxx()【Xxx是基本数据类型首字母大写】
//基本数据类型和包装类转换成String类型的,第一种方式
int i1 = 10;
String str = String.valueOf(i1);//基本数据类型转换成String
Integer ii1 = i1;
String str = String.valueOf(i1);//包装类转换成String
//基本数据类型和包装类转换成String类型的,第二种方式
Stirng str = i1+"";
……………………………………………………………………………………………………………
//String转换为基本数据类型和包装类,第一种方式
String str = '123';
int i1 = Integer.parseInteger(str);
Java基础下篇