糖逗 发表于 2020-8-17 21:22:53

JAVA学习Day8【面对对象2】

学习视频:https://www.bilibili.com/video/BV17J411G72L?p=20

145-159

/*
*方法的参数传递机制:
*实参 --> 形参
*(1)形参是基本数据类型
*实参赋值给形参是数据值,形参值的修改不影响实参
*(2)形参是引用数据类型
*实参赋值给形参的是地址值,如果形参修改了对象的属性值,那么实参对象的属性值也会修改
*
*/

class Test08_01{
        public static void main(String[] args){                  //图1
                int x = 1, y = 2;
                swap(x, y);
                System.out.println(x + " " + y);//并为交换

        }
        public static void swap(int a, int b){
                int temp = a;
                a = b;
                b = temp;
        }
}



class Test08_02{
        public static void main(String[] args){               //图2
                Circle yuan = new Circle();
                yuan.radius = 1.0;
                doubleRadius(yuan);
                System.out.println(yuan.radius);

        }
        public static void doubleRadius(Circle c){
                c.radius *= 2;

        }
}
class Circle{
        double radius;
}

/*
*方法的参数传递面试题陷阱
*当形参是引用数据类型,实参给形参地址值之后,
*形参修改了地址值,那么和实参就无关了
*/

class Test08_02{
        public static void main(String[] args){
                Circle yuan = new Circle();
                yuan.radius = 1.0;
                doubleRadius(yuan);
                System.out.println(yuan.radius);                     //图3

        }
        public static void doubleRadius(Circle c){
                c = new Circle();//新增一句后,radius不扩大两倍了
                c.radius *= 2;

        }
}
class Circle{
        double radius;
}



/*
*方法的重载
*在同一个类中,出现两个或多个名称相同,形参列表不同,称为方法的重载
*
*为什么要有方法的重载?为了调用方便
*/

class Test08_03{
        public static void main(String[] args){
                System.out.println(max(1, 3));
                System.out.println(max(2.0, 1.0));
                System.out.println(max(1, 3, 4));

        }
        //方法重载时,不去看返回值类型是否一致,只看方法名和形参列表
        //public static double max(int a, int b){
                //return a > b ? a : b;
        //}

        public static int max(int a, int b){
                return a > b ? a : b;
        }
        public static double max(double a, double b){
                return a > b ? a : b;
        }

        public static iny max(int a, int b, int c){
                int max = a > b ? a : b;
                max = max > c ? max : c;
                return max;
        }

}


/*
*命令行参数:给main方法穿的实参(了解)
*/

class Test08_04{
        public static void main(String[] args){
                for(int i = 0; i < args.length; i++){
                        System.out.println(args);//从键盘重传入
                }
        }
}


/*
*可变参数:新参列表中出现了...
*使用原则:(1)可以传入0-n个对应的实参,也可以传入对应数据类型的数组对象!!!!
*(2)非可变参数的形参部分,原来该怎么传,现在还怎么传
*/


class Test08_05{
        public static void main(String[] args){
                System.out.println(sum(1, 3, 4));
                System.out.println(max(1, 3, 4));
                System.out.println(max());//报错
        }
        public static int sum(int... n){//传入任意多个 和 int sum(int[] arr)这种不能同时定义!!!
                int sum = 0;
                for(int i = 0; i < nums.length; i++){
                        sum += nums;
                }
                return sum;
        }
        //int num1 是非可变参数部分
        public static int max(int num1, int... nums){
                int max = num1;
                for(int i = 0; i < nums.length; i++){
                        if(nums > max){
                                max= nums;
                        }
                }
                return max;
        }
}


/*
*变量的分类:
*1.成员变量:这里讨论的是非静态的成员变量
*2.局部变量
*(1)声明的位置不同:成员在类的方法外;局部变量在{}中声明的或是在()中声明的形参
*(2)运行时在内存中的位置也不同:成员变量在堆中,局部变量在栈中。
*(3)初始化不同:成员变量如果没有初始化,有默认值;局部变量没有初始化,会报错、
*(4)生命周期:成员变量(随着对象的创建而分配,随着对象被垃圾回收而回收)
*局部变量(方法被调用,开始分配,方法执行结束就结束)
*(5)可用的修饰符:成员变量(有很多,之后讲)局部变量(final,之后讲)
*/


class Test08_06{
        public static void main(String[] args){
                String ming = "张三";//局部变量
                int nian = 23;//局部变量                                     //图4

                Student s1 = new Student();//s1是局部变量
                s1.name = ming;
                s1.age = nian;
        }
}

class Student{
        String name;//成员变量(在类中的方法外)
        int age;

        void set(String n, int a){//n是局部变量
                name = n;
                age = a;
        }
}


/*
*对象数组!!!!!!!!!!!!!!!!!!!!!!!!!!!
*
*/

//错误写法
class Test08_07{
        public static void main(String[] args){
                //用一个数组,存储5个圆对象,半径分别是1-5
                Circle[] arr = new Circle;
                for(int i = 0; i < arr.length; i++){                         //图5
                        arr.radius = i + 1;//null报错
                }
                for(int i = 0; i < arr.length; i++){
                        arr.printInfo();
                }

        }
}

class Circke{
        double radius;
        double getArea(){
                return 3.14 * radius * radius;
        }
        void printInfo(){
                System.out.println(radius + " " + getArea());
        }
}

//正确写法
class Test08_07{
        public static void main(String[] args){
                Circle[] arr = new Circle;                           //图6
                for(int i = 0 i < arr.length; i++){               
                        arr = new Circle();//新增一句
                        arr.radius = i + 1;
                }
                for(int i = 0; i < arr.length; i++){

                        arr.printInfo();
                }

        }
}

/*
*面向对象的基本特征:
*(1)封装
*(2)继承
*(3)多态
*/

/*
*封装:
*(1)隐藏实现细节
*(2)安全
*封装的范围:
*(1)属性的封装、方法的封装
*(2)组件的封装
*(3)系统的封装
*封装的实现,靠权限修饰符
*               本类       本包    其他包子类    任意位置
*private:       1          0          0          0
*缺省/省略               1          1          0          0
*protected:      1          1          1          0
*public:         1          1          1          1
*类、属性、方法、构造器、内部类可以加修饰符
*类:缺省、public(如果类前面有public则必须与源文件名相同)
*属性:四种都可以(大多数用private,私有化会提供get/set方法)
*方法:四种都可以(大多数是public)
*
*/
class Test08_08{
        public static void main(String[] args){
                Circle c1 = new Circle();
                c1.setRadius(1.2);
                System.out.printl(c1.getRadius());

        }
}

class Circle{
        private double radius;//仅限于本类中的访问
        //radius属性的set方法,修改值
        public void setRadius(double r){
                if(r > 0)radius = r;//使赋值可控
        }
        //radius属性的get方法,获取值
        public double getRadius(){//注意命名
                return radius;
        }
}

/*
*构造器作用:(1)构造对象,创建对象和new一起使用
*(2)创建对象的同时给属性赋值
*构造器的特点:(1)所有类都有构造器
*(2)如果一个类没有显示声明构造器,那么编译器将会自动生成一个默认的无参构造
*(3)如果一个类显示声明了构造器,那么编译器将不会自动生成默认的无参构造了
*(4)构造器的名称必须与类名相同
*(5)构造器没有返回值类型,不用写void!!!!!!!!
*(6)构造器可以重载
*/
class Test08_08{
        public static void main(String[] args){
                //创建对象
                Circle c1 = new Circle(1.2);//创建对象的同时给属性赋值
                c1.printInfo();
                c1.setRadius(2.5);//创建对象之后,修改属性值

                Circle c2 = new Circle();
                c2.setRadius(3.6);
                c2.printInfo();

        }
}

class Circle{
        private double radius;
        public Circle(double d){//有参构造
                radius = 0;
        }
        public Circle(){//无参构造

        }
        public void printInfo(){
                System.out.println(radius);
        }
        public void setRadius(double r){
                radius = r;
        }
}

糖逗 发表于 2020-8-17 21:35:17

这一节需要好好复习几遍

mmpo789 发表于 2020-8-18 00:03:48

这位同学我也开始学习JAVA加个Q一起互相交流可好?

糖逗 发表于 2020-8-18 00:42:43

mmpo789 发表于 2020-8-18 00:03
这位同学我也开始学习JAVA加个Q一起互相交流可好?

需要交流的话可以直接在我的帖子下和我交流,最近会不定期更新Java学习内容。
页: [1]
查看完整版本: JAVA学习Day8【面对对象2】