Java笔记(上)

第一章 Java开发入门

Java
JavaSE
JavaEE
JavaME
			  特点:
			 ①简单性
			 ②面向对象性
			 ③安全性
			 ④跨平台性
			 ⑤支持多线程

3.JDK:Java开发环境
4.JRE:Java运行环境
关系:

包括
JRE
JDK
javac
java
.java
.class
.exe

第二章 Java编程基础

1.Java代码格式:

修饰符 class 类名{
	代码
}
输出语句 System.out.println();//注意大写以及分号

2.Java中的标识符
Java标识符不能以数字,Java关键字作为开头

3.变量的数据类型

类型名占用空间取值范围
byte8位(1个字节)-27~27-1
short16位(2个字节)-215~215-1
int32位(4个字节)-231~231-1
long64位(8个字节)-263~263-1
float f=123.4f; //为float类型变量赋值,后面必须加字母f
double d=123.4; //为double类型变量赋值,后面可省略字母d
char c='a';
char c=97;//为一个char类型的变量赋值整数97,相当于赋值字符a

4. 变量的类型转换

1.自动类型转换
byte b=3;
int x=b;//由于int的取值范围大于byte 因此编译器可自动完成转换

2.强制类型转换
目标类型 变量名=(目标类型);
int a=4;
byte b=(byte) a;//int的取值范围大于byte 需要对其强制转化

3.表达式类型自动提升
byte b1=3;
byte b2=4;
byte b3=byte (b1+b2);//由于表达式b1+b2运算期间,变量b1和b2被自动提升为int型,因此结果也为int型

5.变量的作用域

6.方法
可理解为c语言里的函数

1.方法的格式:
修饰符 返回值类型 方法名(参数类型 参数名){
	执行语句
	...
	return 返回值;
}
2.方法的重载:
public class ex1{
	public static void main(String[] args){
	int sum1=add(1,2);
	int sum2=add(1,2,3);
	double sum3=add(1.2,2.3);
	System.out.pritnln(sum1);
	System.out.pritnln(sum2);
	System.out.pritnln(sum3);
	}
	//根据参数类型 参数个数的不同来进行返回值
	public static int add(int x,int y){
		return x+y;
	}
	public static int add(int x,int y,int z){
		return x+y+z;
	}
	public static double add(double x,double y){
		return x+y;
	}
}

7.数组

1.数组的定义
int[] x=new int[100];
		||
int []x;//声明一个int[]类型的变量
x=new int [100];//创建一个长度为100的数组

2.多维数组
int[][] x=new int [100][100]; 

第三章 面向对象(上)

面向对象的特点:
1.封装性
2.继承性
3.多态性

1.类的定义
class Person{
int age;
void speak(){
	System.out.println("我今年"+age+"岁");
	}
}

2.对象的创建
类名 对象名称=new 类名();
Pesron p=new Person();//实例化对象

3.对象的引用
p.age=18;
p.speak();

4.类的封装
略

3.构造方法

定义
1.方法名与类名相同
2.在方法名的前面没有返回值类型的声明
3.在方法中不能用return语句返回一个值,但是可以单独写return语句来作为方法的结束

1.无参的构造方法
class Person{
	public Person(){
		System.out.println("无参的构造方法被调用了");
		}
	}
public class ex1{
	public static void main(String[] args){
		Person p=new Person();
		}
	}
	
	运行结果为:无参的构造方法被调用了
	
2.有参的构造方法
class Person{
	int age;
	public Person(int a){
	age=a;
	}
	public void speak(){
	System.out.println("我今年"+age+"岁了");
	}
}
public ex2{
	public static void main(String[] args){
	Person p=new Person(10);
	p.speak;
	}
}
	运行结果为:我今年10岁了

3.构造方法的重载	
class Person{
	String name;
	int age;
	//定义两个参数的构造方法
	public Person(String con_name,int con_age){
	name=con_name;
	age=con_age;
	}
	//定义一个参数的构造方法
	public Person(String con_name){
	name=con_name;
	}
	public void speak(){
	System.out.println("我叫"+name+"今年"+age+"岁");
	}
}
public class ex3{
	public static void main(String[] args){
	Person p1=new Person("张三");
	Person p2=new Person("李四",20);
	p1.speak;
	p2.speak;
	}
}
	运行结果为:
				我叫张三今年0岁
				我叫李四今年20

4.this关键字

1.访问成员变量
class Person{
	int age;
	public Person(int age){
	this.age=age;
	}
	public int getAge(){
	return this.age;
	}
}

2.在一个构造方法中调用其他构造方法
class Person{
	public Person(){
	System.out.println("无参的构造方法被调用了");
	}
	public Person(String name){
	this();//此处调用上面无参的方法
	System.out.println("有参的构造方法被调用了");
	}
}
public class ex1{
public static void main(String[] args){
	Person p=new Person("aa");	
	}
}
	输出结果为:
	无参的构造方法被调用了
	有参的构造方法被调用了

5.垃圾回收

class Person{
	public void fianlize(){
		System.out.println("对象将作为垃圾回收");
	}
}
public class ex{
	public static void main(String[] args){
		Person p1=new Person();
		Person p2=new Person();
		//给这些对象赋值为null,使其变成垃圾
		p1=null;
		p2=null;
		System.gc();//调用该方法进行垃圾回收
		for(int i=0;i<100000;i++){
		//延长程序运行时间
		}
	}
}

6.static关键字

1.static关键字只能修饰成员变量,不能修饰局部变量,否则报错
public class Student{
	public void study(){
		static int num=10; //编译报错	
	}
}

2.静态方法
class Person{
	public static void speak(){
		System.out.println("hello");
	}
}
class ex{
	public static void main(String[] args){
		Person.speak;//类名.方法名 直接调用静态方法
		Person p=new Person();
		p.speak();//通过实例化对象来调用静态方法
	}
}

7.成员内部类

外部类名.内部类名 变量名=new 外部类名().new 内部类名();

class Outer{
	private int num=4;
	public void test(){
		Inner in=new Inner();
		in.show();
	}
	class Inner{
		void show(){
			System.out.println("num="+num);
		}	
	}
}
public class ex{
	public static void main(String[] args){
		Outer out=new Outer();//创建外部对象
		out.test();//调用show()方法中的test()方法
		Outer.Inner in=new Outer().new Inner();//创建内部对象
		in.show();//调用test()方法
	}
}
运行结果:
num=4
num=4

第四章 面向对象(下)

1.类的继承

1.继承的概念
class animal{
	String name;
	void shout(){
		System.out.println("动物叫");
	}
}
class dog extends animal{
	public void printname(){
		System.out.prinltn("name="+name);
	}
}
public class ex1{
	public static void main(String[] args){
		dog d=new dog();
		d.name="廖彬涵";
		dog.printname();
		dog.shout();
	}
}
运行结果:
name=廖彬涵
动物叫

2.重写父类方法
class animal{
	String name;
	void shout(){
		System.out.println("动物叫");
	}
}
class dog extends animal{
	void shout(){
		System.out.println("狗叫");
	}
}
public class ex2{
	public static void main(String[] args){
		dog d=new dog();
		d.shout();
	}
}
运行结果:狗叫
				注:一个类最多一个父亲

3.super关键字
当子类重写父类方法后,子类对象将无法访问父类被重写的方法.因此可用super关键字访问父类的成员
super.成员变量
super.成员方法(参数1,参数2 etc)

class animal{
	String name="动物";
	void shout(){
		System.out.println("动物叫");
	}
} 
class dog extends animal{
	String name="狗"
	void shout(){
		super.shout();//该处已重写父类中shout()方法 因此可用super.shout()来访问该父类方法
	}
	void printname(){
		System.out.println("name="+super.name);//访问父类成员变量
	}
}
public class ex3{
	public static void main(String[] args){
		dog d=new dog();
		d.shout();
		d.printname();
	}
}
运行结果:
动物叫
name=4.使用super关键字访问父类的构造方法
class animal{
	public animal(String name){
		System.out.println("我是"+name);
	}
	public animal(){
		System.out.println("我是一只动物");
	}
}
class dog extends animal{
	public dog(){
		super("沙皮狗");//由于此处super引用了父类带参的方法 因此此处用的是有参的方法 
	}//反之若把super注释掉 则用无参的方法
}
public class ex4{
	public static void main(String[] args){
		dog d=new dog();
	}
}
运行结果:我是狗

2.final关键字

特点:
1.final修饰的类不能被继承
2.final修饰的方法不能被子类重写
3.final修饰的变量是常量,只能赋值一次

3.抽象类和接口

1.抽象类
注意事项:抽象类中可包含抽象方法,但包含抽象方法的类一定是抽象类
abstract class animal{
	abstract void shout();
}
class dog extends animal{
	void shout(){
		System.out.println("狗叫");
	}
}
public class ex1{
	public static void main(String[] args){
		dog d=new dog();
	}
}
运行结果:狗叫

2.接口
[public] interface 接口名[extends 接口1,接口2]{
	[public] [static] [final] 数据类型 常量名=常量值;
	[public] [abstract] 返回值 抽象方法名;
}

interface animal{
	String behavior="动物的行为";
	void breathe();
	void run();
}//定义animal接口

interface landanimal extends animal{
	void liveland();
}//定义landanimal接口

class dog implements landanimal{
	public void breathe(){
		System.out.println(bahavior+":"+"狗在呼吸");
	}
	public void run(){
		System.out.println(behavior+":"+"狗在跑");
	}
	public void liveland(){
		System.out.println("狗是陆地生物");
	}//因为landanimal接口继承了animal接口,因此landanimal有三个抽象方法
}
public class ex2{
	dog d=new dog();
	dog.brethe();
	dog.run();
	dog.liveland();	
}
输出结果:
动物的行为:狗在呼吸
动物的行为:狗在跑
狗是陆地生物

4.多态

1.
interface animal{
	void shout();
}
class cat implements animal{
	public void shout(){
		System.out.println("喵喵");
	}
}
class dog implements animal{
	public void shout(){
		System.out.println("汪汪");	
	}
}
public class ex1{
	public static void main(String[] args){
		animal a1=new cat();
		animal a2=new dog();
		animalshout(a1);
		animalshout(a2);
	}
	
	public static void animalshout(animal a){
		a.shout();
	}//定义一个静态animalshout()方法,接收一个animal类型的参数	
}
输出结果:
喵喵
汪汪

2.对象的类型转换
interface animal{
	void shout();
}

class dog implements animal{
	public void shout(){
		System.out.println("汪汪");
	}	
}

class cat implements animal{
	public void shout(){
		System.out.println("喵喵");
	}
	public void sleep(){
		System.out.println("猫猫睡觉");
	}
}
public class ex3{
	public static void main(Stingr[] args){
		dog d=new dog();
		animalshout(d);//此处传入一个dog类型的d对象 导会导致animal类型的变量无法强制转化为cat类型
	}
}
public static void animal animalshout(animal a){
	if(a instanceof cat){//判断a是否为cat类型
		cat c=(cat)a;//将a对象转化成cat类型
		c.sleep();
		c.shout();//调用cat中的方法 
	}else{
		System.out.println("这个动物不是猫");
	}
}
运行结果:
这个动物不是猫

5.Object类

Object类是所有类的父类

方法名称方法说明
equals()指示其他某个对象是否与此对象相等
getClass()返回此Object的运行时类
hashCode()返回该对象的哈希码值
toString()返回该对象的字符串表示
class animal{
	public String tostring(){
		return "这是一个动物";
	}
}
public class ex1{
	public static void main(String[] args){
		animal a=new animal();
		System.out.println("animal.tostring()");
	}
}
运行结果:
这是一个动物

6.匿名内部类

在类里再定义类(套娃)

interface animal{
	void shout();
}
public class ex1{
	public static void main(String[] args){
		class cat implements animal{
			public void shout(){
				System.out.println("喵喵");
			}
		}//定义一个内部类cat
		animalshout(new cat());//调用animalshout()方法传入cat对象
	}
	public static void animalshout(animal an){
		an.shout();
	}
}

7.异常

1.什么是异常
public class ex1{
	public static void main(String[] args){
		int result=divide(4,0);
		System.out.println(result);
	}
	public static int divide(int x,int y){
		int result=x/y;
		return result;
	}
}
运行结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero 
at work1.work1.divide(ex1.java:11)
at work1.work1.main(ex1.java:7)

2.try...catchfinally
public class ex2{
	public static void main(String[] args){
		try{
			int result=divide(4,0);
			System.out.println(result);
		}catch(Exception e){
			System.out.println("捕获的异常信息为:"+e.getMessage());
		}
		System.out.println("程序继续往下执行");
	}
	public static int divide(int x,int y){
		int result=x/y;
		return result;
	}
}
运行结果:
捕获的异常信息为:/ by zero
程序继续往下执行

public class ex2{
	public static void main(String[] args){
		try{
			int result=divide(4,0);
			System.out.println(result);
		}catch(Exception e){
			System.out.println("捕获的异常信息为:"+e.getMessage());
			return;//结束当前语句
		}finally{
			System.out.println("进入finally代码块");//虽然return已经结束语句 但finally仍会执行
		}
		System.out.println("程序继续往下执行");
	}
	public static int divide(int x,int y){
		int result=x/y;
		return result;
	}
}
运行结果:
捕获的异常信息为:/ by zero
进入finally代码块

8.throws关键字

public class ex1{
	public static void main(String[] args){
		try{
			int result=divide(4,2); //由于第二个参数为2 因此不会异常,但定义divide时抛出异常
			System.out.println(result);//因此调用divide方法时进行try...catch处理
			}catch(Exception e){
				e.printStackTrace();//打印捕获的异常信息
			}
	}
	public static int divide(int x,int y)throws Exception{
		int result=x/y;
		return result;
	}
}
	

9.自定义异常

public class ex1{
public static void main(String[] args){
//使用try...catch的原因因为下边方法里使用了throws 
	try{
		int result=divide(4,-2);
		System.out.println(result);
		}catch(zdyException e){
			System.out.println(e.getMessage());
		}
}
public static int divide(int x,int y) throws zdyException{
	if(y<0){
		throw new zdyException("除数是负数");
		}
	int result=x/y;
	return result;
	}	
}

	//自定义一个异常类zdyException继承Exception
class zdyException extends Exception{
	public zdyException(){
		super();//调用Exception的无参的构造方法
	}
	public zdyException(String message){
		super(message);//调用Exception的有参的构造方法
	}
} 
输出结果:除数是负数

10.访问控制

private
default
protected
public
> 访问及控制级别从左到右逐渐增大

第五章 Java API

1.String类和StringBuffer类

1. 	 String类表示的字符串是常量,一旦创建后,内容和长度都无法改变。
	 StringBuffer表示字符容器,其内容和长度都可以随时改修改。
	 在操作字符串时,如果该字符串仅用于表示数据类型,使用String类即可,
	 但是如果需要对字符串中的字符进行增删操作,则使用StringBuffer类。

2.String类覆盖了Object()方法,而StringBuffer类没有覆盖Object类的equals()方法.
	String s1=new String("abc");
	String s2=new String("abc");
	System.out.println(s1.equals(s2));// 打印结果为true
	StringBuffer sb1=new StringBuffer("abc");
	StringBuffer sb2=new StringBuffer("abc");
	System.out.println(sb1.equals(s2));//打印结果为false
	
3.String类对象可以用操作符	"+"进行连接,而StringBuffer类对象之间不能,
	String s1="a";
	String s2="b";
	String s3=s1+s2;//合法
	System.out.println(s3);//打印输出:ab
	StringBuffer sb1=new StringBuffer("a");
	StringBuffer sb2=new StringBuffer("b");
	StringBuffer sb3=sb1+sb2; //编译出错
方法声明功能描述
int indexOf(int ch)返回指定字符在此字符串中第一次出现的索引
int length()返回此字符串的的长度
boolean equals(Object anObject)判断字符串与指定字符串比较是否相同
boolean startsWith(String prefix)判断字符串是否以指定的字符串开始
String replace(CharSequence oldstr,CharSequence newstr)返回一个新的字符串,他是通过用newstr替换此字符串中出现的所有的oldstr得到的
String[] split(String regex)根据参数regex将原来的字符串分割为若干个字符串 (个人理解则为删除参数regex后形成的字符串数组)

2.System类和Runtime类
1.System类

System类定义了一些与系统相关的属性和方法,它所提供的属性和方法都是静态的,因此System.方法名就能用

System类的常用方法

方法声明功能描述
static void exit(int status)该方法终止正在运行的java虚拟机,status若为非0,则表示异常终止
static void gc()垃圾回收

2.Runtime类

3.Math类和Random类

1.Math类
public class ex1{
	public class static void main(String[] args){
		System.out.println("计算绝对值的结果:"+Math.abs(-1));
		System.out.println("求小数进行四舍五入的结果:"+Math.round(-4.6));
		System.out.println("求两个数的较大值:"+Math.max(2.1,-2.1));
		System.out.println("求两个数的较小值:"+Math.min(2.1,-2.1));
	}
}
运行结果:
计算绝对值的结果:1
求小数进行四舍五入的结果:-5
求两个数的较大值:2.1
求两个数的较大值:-2.1

2.Random类
import java.utill.Random;
public class ex1{
	public static void main(String[] args){
		Random r=new Ramdom();
		//随机生成[0,100)之间的整数
		for(int x=0;x<10;x++){
			System.out.println(r.nextInt(100));
		}
	}
}

***3.包装类***
1.
public class ex1{
	public static void main(String[] args){
		int a=20;
		Integer in=new Integer(a);
		System.out.println(in.toString());
	}
}
输出结果:20

2.
public class ex2{
	public static void main(String[] args){
		Integer num=new Integer(20);
		int a=10;
		int sum=num.intValue()+a;//将Integer对象转化为int类型
		System.out.println("sum="+sum);
	}
}
输出结果:sum=30

3.自动装箱
int num=20;
Integer number=num;

4.自动拆箱
Integer number=new Integer(18);
int number2=number;

第六章 集合类

1.单列集合Collection
单列集合的根接口,有两个重要子接口List和Set
List特点:元素有序,可重复
Set特点:元素无序,不可重复

List接口主要实现类有ArrayList和LinkedList
Set接口主要实现类有HashSet和TreeSet

ArrayList
List
LinkedList
Vector
Collection
TreeSet
Set
LinkedHashSet
HashSet

2.双列集合Map
双列集合的根接口
具有存储有键(Key) 值(Value)映射关系的元素,每个元素都包含一对键值,在使用Map集合时可以通过指定的Key找对应的Value.
Map接口的主要实现类有HashMap和TreeMap

Properties
Hashtable
Map
LinkedHashMap
Hashmap
TreeMap

3.ArrayList集合

import java.util.*; 该语句可把java.util的所有包导入进来

import java.util.*;//使用时一定要记得写该语句导包或import java.util.ArrayList
public class ex1{
	public static void main(String[] args){
		ArrayList list=new ArrayList();
		list.add("st1");
		list.add("st2");
		list.add("st3");
		System.out.println("集合的长度是:"+list.size());
		System.out.println("第二个元素是:"+list.get(1));
	}
}

3.LinkedList集合

import java.util.*;
public class ex2{
	public static void main(String[] args){
		Linkedlist list=new LinkedList();
		list.add("st1");
		list.add("st2");
		list.add("st3");
		System.out.println("link.toString()");
		link.add(3,"Student");
		link.addFirst("First");//LinkedList集合里特有的方法
		System.out.println("link");
		System.out.println("link.getFirst()");LinkedList集合里特有的方法
		link.remove(3);
		link.removeFirst();//LinkedList集合里特有的方法
		System.out.println(link);
	}
}
输出结果:
[st1,st2,st3]
[First,st1,st2,st3,Student]
[First]
[st1,st2,Student]

3.Iterator接口

Iterator主要用于迭代访问(遍历)Collection中的元素,因此Iterator对象也称为迭代器

import java.util.*;
public class ex1{
	public static void main(String[] args){
		ArrayList list=new ArrayList();
		list.add("st1");
		list.add("st2");
		list.add("st3");
		Iterator it=list.iterator();
		while(it.hashNext()){
			Object obj=it.next();
			System.out.println(obj);	
		}
	}
}
运行结果:
st1
st2
st3

4.foreach循环

for(容器中元素类型 临时变量:容器变量){
	执行语句
}
1.
import java.util.*;
public class ex1{
	public static void main(String[] args){
		ArrayList list=new ArrayList();
		list.add("Jack");
		list.add("Rock");
		list.add("Tom");
		for(Object obj: list){
			System.out.println(obj);
		}
	}
}
运行结果:
Jack
Rock
Tom

2.当foreach循环遍历集合和数组时,只能访问集合中国的元素,不能对其中的元素进行修改
import java.util.*;
public class ex2{
	static String[] strs={"aaa","bbb","ccc"};
	public static void main(String[] args){
		for(String str:strs){
			str="ddd";
		}
		System.out.println("foreach循环修改后的数组:"+strs[0]+","+strs[1]+","+strs[2]);
		for(int i=0;i<strs.length;i++){
			strs[i]="ddd";
		}
	}
	System.out.println("for循环修改后的数组:"+strs[0]+","+strs[1]+","+strs[2]);
}
运行结果:
foreach循环修改后的数组:aaa,bbb,ccc
for循环修改后的数组:ddd,ddd,ddd

5.Set接口

1.HashSet集合
import java.util.*;
public class ex1{
	public static void main(String args){
		HashSet s=new HashSet();
		s.add("jack");
		s.add("tom");
		s.add("eve");
		Iterator it=s.iterator();
		while(it.hashNext()){
			Object obj=it.next();//因为不清楚返回的值是什么类型,所以用Object类型安全
			System.out.println(obj);
		}
	}
}

2.
import java.util.*;
class Student{
		private String id;
		private String name;
		public Student(String id,String name){
			this.id=id;
			this.name=name;
		}
		public String toString(){
			return id+":"+name;
		}
		public int hashCode(){
			return id.hashCode();
		}
		public boolean equals(Object obj){
			if(this==obj){//通过地址比较是否是同一个对象
				return ture;
			}
			if (!(obj instanceof Student)){
				return false;
			}
			Student stu=(Student) obj;//将对象强制转化为Student类
			boolean b=this.id.equals(stu.id)//判断id值是否相同
			return b;
	}
}
//如果Student类不重写hashCode()和equals()方法 则出现相同元素不符合HashSet集合的特性
public ex3{
	public static void main(String[] args)
	HashSet hs=new HashSet();//创建HashSet对象
	Student stu1=new Student("1","jack");//创建Student对象
	Student stu2=new Student("2","rock");
	Student stu3=new Student("2","rock");
	hs.add(stu1);//向集合存入对象
	hs.add(stu2);
	hs.add(stu3);
	System.out.println(hs);
}
输出结果:
[2:rock,1:jack]

6.Map接口

Map接口是双列集合,每个元素都包含一个键对象Key值对象Value(不能相同)
映射关系:只要指定了Key,就能找到对应的Value

import java.util.*;
public class ex1{
	public static void main(String[] args){
		Map map=new HashMap();//创建Map集合
		map.put("1","Jack");//存储键和值
		map.put("2","Rose");
		map.put("3","Lucy");
		Set keySet=map.keySet();//获取键的集合
		Iterator it=keySet.iterator();//迭代(遍历)键的集合
		while(it.hasNext()){
			Object key=it.next();
			Object value=map.get(key);//获取每个键所对应的值
			System.out.println(key+":"+value);
		}
	}
}
运行结果:
3:Lucy
2:Rose
1:Jack

import java.util.*;
public class ex1{
	public static void main(String[] args){
		Map m=new LinkedHashMap();//创建Map集合
		map.put("1","Jack");//存储键和值
		map.put("2","Rose");
		map.put("3","Lucy");
		Set keySet=map.keySet();//获取键的集合
		Iterator it=keySet.iterator();//迭代(遍历)键的集合
		while(it.hasNext()){
			Object key=it.next();
			Object value=map.get(key);//获取每个键所对应的值
			System.out.println(key+":"+value);
		}
	}
}
运行结果:
1:Jack
2:Rose
3:Lucy

7.泛型

ArratList<参数化类型> list=new ArrayList<参数化类型>();

import java.util.*;
public class ex{
	public static void main(String[] args){
		ArrayList<String> list=new ArrayList<String>();
		list.add("Strig");
		list.add("Collection");
		for(String str:list){
			System.out.println(str);	
		}
	}
}
输出结果:
String
Collection
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>