/*
成员变量和局部变量的区别?
A:在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上
B:在内存中的位置不同
成员变量:在堆内存
局部变量:在栈内存
C:生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
D:初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
注意事项:
局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
*/classVarialbe{//成员变量//int num = 10;
int num;//0publicvoidshow(){//int num2 = 20; //局部变量//可能尚未初始化变量num2//int num2; //没有默认值
int num2 =20;
System.out.println(num2);//int num = 100;
System.out.println(num);}}classVariableDemo{publicstaticvoidmain(String[] args){
Varialbe v =newVarialbe();
System.out.println(v.num);//访问成员变量
v.show();}}
方法的形式参数是类名的时候如何调用
/*
形式参数的问题:
基本类型:形式参数的改变不影响实际参数
引用类型:形式参数的改变直接影响实际参数
*///形式参数是基本类型classDemo{public int sum(int a,int b){return a + b;}}//形式参数是引用类型classStudent{publicvoidshow(){
System.out.println("我爱学习");}}classStudentDemo{//如果你看到了一个方法的形式参数是一个类类型(引用类型),这里其实需要的是该类的对象。publicvoidmethod(Student s){//调用的时候,把main方法中的s的地址传递到了这里 Student s = new Student();
s.show();}}classArgsTest{publicstaticvoidmain(String[] args){//形式参数是基本类型的调用
Demo d =newDemo();
int result = d.sum(10,20);
System.out.println("result:"+result);
System.out.println("--------------");//形式参数是引用类型的调用//需求:我要调用StudentDemo类中的method()方法
StudentDemo sd =newStudentDemo();//创建学生对象
Student s =newStudent();
sd.method(s);//把s的地址给到了这里}}
匿名对象的概述和应用
/*
匿名对象:就是没有名字的对象。
匿名对象的应用场景:
A:调用方法,仅仅只调用一次的时候。
注意:调用多次的时候,不适合。
那么,这种匿名调用有什么好处吗?
有,匿名对象调用完毕就是垃圾。可以被垃圾回收器回收。
B:匿名对象可以作为实际参数传递
*/classStudent{publicvoidshow(){
System.out.println("我爱学习");}}classStudentDemo{publicvoidmethod(Student s){
s.show();}}classNoNameDemo{publicstaticvoidmain(String[] args){//带名字的调用
Student s =newStudent();
s.show();
s.show();
System.out.println("--------------");//匿名对象//new Student();//匿名对象调用方法newStudent().show();newStudent().show();//这里其实是重新创建了一个新的对象
System.out.println("--------------");//匿名对象作为实际参数传递
StudentDemo sd =newStudentDemo();//Student ss = new Student();//sd.method(ss); //这里的s是一个实际参数//匿名对象
sd.method(newStudent());//在来一个newStudentDemo().method(newStudent());}}
/*
private:
是一个权限修饰符
可以修饰成员变量和成员方法
被其修饰的成员只能在本类中被访问
*/classDemo{//int num = 10;//用private修饰private int num =10;publicvoidshow(){
System.out.println(num);}privatevoidmethod(){
System.out.println("method");}publicvoidfunction(){method();}}classPrivateDemo{publicstaticvoidmain(String[] args){
Demo d =newDemo();//不能方法私有的成员变量//System.out.println(d.num);
d.show();//不能访问私有的成员方法//d.method();
d.function();}}
private的应用标准案例
/*
封装和private的应用:
A:把成员变量用private修饰
B:提高对应的getXxx()和setXxx()方法
*///定义学生类classStudent{//姓名private String name;//年龄private int age;//姓名获取值public String getName(){return name;}//姓名设置值publicvoidsetName(String n){
name = n;}//年龄获取值public int getAge(){return age;}//年龄赋值publicvoidsetAge(int a){
age = a;}}//测试类classStudentTest{publicstaticvoidmain(String[] args){//创建学生对象
Student s =newStudent();//使用成员变量//错误:被私有修饰了,外界不能直接访问了//System.out.println(s.name+"---"+s.age);
System.out.println(s.getName()+"---"+s.getAge());//给成员变量赋值//s.name = "林青霞";//s.age = 27;//通过方法给赋值
s.setName("林青霞");
s.setAge(27);
System.out.println(s.getName()+"---"+s.getAge());}}
/*
定义一个类Demo,其中定义一个求两个数据和的方法,
定义一个测试了Test,进行测试。
变量什么时候定义为成员变量:
如果这个变量是用来描述这个类的信息的,那么,该变量就应该定义为成员变量。
变量到底定义在哪里好呢?
变量的范围是越小越好。因为能及时的被回收。
*///方式1/*
class Demo {
public int sum() {
int a = 10;
int b = 20;
int c = a + b;
return c;
}
}
*///方式1满足了我们的要求,但是不好。//因为参与操作的数据现在是固定的。//方式2/*
class Demo {
public int sum(int a,int b) {
return a + b;
}
}
*///方式2可以满足我们的要求,但是呢我们学习过来面向对象的思想。//我就再想,a,b可不可以定义为成员变量呢?//如果可以,我们再改进一版classDemo{
int a;
int b;public int sum(){return a + b;}}//虽然这种方式可以,并且好像是符合了面向对象的思想。//但是不好。//因为我们曾经说过:类是一组相关的属性和行为的集合。//并且类是通过事物转换过来的//而类中的成员变量就是事物的属性//属性是用来描述事物的//同理:成员变量其实是用来描述类的。//测试类classTest{publicstaticvoidmain(String[] args){//创建对象//方式1测试/*
Demo d = new Demo();
System.out.println(d.sum());
*///方式2测试/*
Demo d = new Demo();
int a = 10;
int b = 20;
System.out.println(d.sum(a,b));
*///方式3测试
Demo d =newDemo();
d.a =10;
d.b =20;
System.out.println(d.sum());}}
长方形案例练习
/*
定义一个长方形类,定义 求周长和面积的方法,
然后定义一个测试了Test2,进行测试。
长方形的类:
成员变量:
长,宽
成员方法:
求周长:(长+宽)*2;
求面积:长*宽
注意:
import必须出现在所有的class前面。
*/import java.util.Scanner;classChangFangXing{//长方形的长private int length;//长方形的宽private int width;publicChangFangXing(){}//仅仅提供setXxx()即可publicvoidsetLength(int length){this.length = length;}publicvoidsetWidth(int width){this.width = width;}//求周长public int getZhouChang(){return(length + width)*2;}//求面积public int getArea(){return length * width;}}classTest2{publicstaticvoidmain(String[] args){//创建键盘录入对象
Scanner sc =newScanner(System.in);
System.out.println("请输入长方形的长:");
int length = sc.nextInt();
System.out.println("请输入长方形的宽:");
int width = sc.nextInt();//创建对象
ChangFangXing cfx =newChangFangXing();//先给成员变量赋值
cfx.setLength(length);
cfx.setWidth(width);
System.out.println("周长是:"+cfx.getZhouChang());
System.out.println("面积是:"+cfx.getArea());}}
/*
定义一个类MyMath,提供基本的加减乘除功能,然后进行测试。
*/import java.util.Scanner;classMyMath{//加法功能public int add(int a,int b){return a + b;}//减法功能public int sub(int a,int b){return a - b;}//乘法功能public int mul(int a,int b){return a * b;}//除法功能public int div(int a,int b){return a / b;}}//测试类classMyMathTest{publicstaticvoidmain(String[] args){//创建键盘录入对象
Scanner sc =newScanner(System.in);
System.out.println("请输入第一个操作数:");
int firstNumber = sc.nextInt();
System.out.println("请输入第二个操作数:");
int secondNumber = sc.nextInt();//创建MyMath对象,并使用
MyMath mm =newMyMath();
System.out.println("加法结果:"+mm.add(firstNumber,secondNumber));
System.out.println("减法结果:"+mm.sub(firstNumber,secondNumber));
System.out.println("乘法结果:"+mm.mul(firstNumber,secondNumber));
System.out.println("除法结果:"+mm.div(firstNumber,secondNumber));}}