**“理解万事万物皆对象”
1、在Java语言范畴中,我们都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构。
2、涉及Java语言与前端Html、后端数据库交互时,前后端的结构在Java层面交互时,都体现为类、对象。
匿名对象
理解:我们创建的对象,没有显式的赋给一个变量名。即为匿名对象
特征:匿名对象只能调用一次。
使用:一般赋给方法形参使用,如下
public class InstanceTest {
public static void main(String[] args) {
Phone p = new Phone();
// p = null;
System.out.println(p);
p.sendEmail();
p.playGame();
//匿名对象
// new Phone().sendEmail();
// new Phone().playGame();
new Phone().price = 1999;
new Phone().showPrice();//0.0
//**********************************
PhoneMall mall = new PhoneMall();
// mall.show(p);
//匿名对象的使用
mall.show(new Phone());
}
}
class PhoneMall{
public void show(Phone phone){
phone.sendEmail();
phone.playGame();
}
}
class Phone{
double price;//价格
public void sendEmail(){
System.out.println("发送邮件");
}
public void playGame(){
System.out.println("玩游戏");
}
public void showPrice(){
System.out.println("手机价格为:" + price);
}
}
属性(成员变量) vs 局部变量
1.相同点:
1.1 定义变量的格式:数据类型 变量名 = 变量值
1.2 先声明,后使用
1.3 变量都有其对应的作用域
2.不同点:
2.1 在类中声明的位置的不同
属性:直接定义在类的一对{}内
局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量
2.2 关于权限修饰符的不同
属性:可以在声明属性时,指明其权限,使用权限修饰符。
常用的权限修饰符:private、public、缺省、protected —>封装性
目前,大家声明属性时,都使用缺省就可以了。
局部变量:不可以使用权限修饰符。
2.3 默认初始化值的情况:
属性:类的属性,根据其类型,都有默认初始化值。
整型(byte、short、int、long):0
浮点型(float、double):0.0
字符型(char):0 (或’\u0000’)
布尔型(boolean):false
引用数据类型(类、数组、接口):null
局部变量:没有默认初始化值。
意味着,我们在调用局部变量之前,一定要显式赋值。
特别地:形参在调用时,我们赋值即可。
2.4 在内存中加载的位置:
属性:加载到堆空间中 (非static)
局部变量:加载到栈空间
重载方法
在同一个类中,同名不同参的两个方法构成了重载。
(不同参包括了参数的个数,类型,顺序,但不包括参数的变量名称)
可变个数的形参
1、可变个数形参的格式:数据类型 … 变量名
2、当调用可变个数形参的方法时,传入的参数个数可以是:0个,1个,2个,。。。
3、可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
4、可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载。换句话说,二者不能共存。
public void show(String ... strs){
System.out.println("show(String ... strs)");
for(int i = 0;i < strs.length;i++){
System.out.println(strs[i]);
}
}
//不能与上一个方法同时存在
// public void show(String[] strs){
//
// }
由于可变个数的形参是jdk 5.0新增的内容,之前都是以数组的方式表示 。
public static void main(String[] args) {
MethodArgsTest test = new MethodArgsTest();
//以可变个数的形参表示的方法用下面两种方式调用都行
test.show("AA","BB","CC");
// test.show(new String[]{"AA","BB","CC"});
}
5、可变个数形参在方法的形参中,必须声明在末尾。
//The variable argument type String of the method
//show must be the last parameter
// public void show(String ...strs,int i){//String ...strs必须放在int i后面
//
// }
6、可变个数形参在方法的形参中,最多只能声明一个可变形参。
可变个数形参举例在工作中哪里用到?
在数据库查询中,select…from…where(
id=?,name=?,age=?,…
)
?,?,?占用符所组成的数据根据用户的需求具有不确定性,可以用到可变个数形参。
方法形参的传递机制:值传递
1、形参:方法定义时,声明的小括号内的参数
2、实参,方法调用时,实际传递给形参的数据
如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值。
如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的地址值。
基本数据类型
引用数据类型
递归方法
递归方法:一个方法体内调用它自身。
注意:方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环。
public class RecursionTest {
public static void main(String[] args) {
// 例1:计算1-100之间所有自然数的和
// 方式一:
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
System.out.println(sum);
// 方式二:
RecursionTest test = new RecursionTest();
int sum1 = test.getSum(100);
System.out.println(sum1);
System.out.println("*****************");
int value = test.f(10);
System.out.println(value);
}
// 例1:计算1-n之间所有自然数的和
public int getSum(int n) {// 3
if (n == 1) {
return 1;
} else {
return n + getSum(n - 1);
}
}
// 例2:计算1-n之间所有自然数的乘积:n!
public int getSum1(int n) {
if (n == 1) {
return 1;
} else {
return n * getSum1(n - 1);
}
}
//例3:已知有一个数列:f(0) = 1,f(1) = 4,f(n+2)=2*f(n+1) + f(n),
//其中n是大于0的整数,求f(10)的值。
public int f(int n){
if(n == 0){
return 1;
}else if(n == 1){
return 4;
}else{
// return f(n + 2) - 2 * f(n + 1);
return 2*f(n - 1) + f(n - 2);
}
}
//例4:斐波那契数列
//例5:汉诺塔问题
//例6:快排
}