zoukankan      html  css  js  c++  java
  • OOP⑷

    1.对象数组:

    /**
     *学生类
     */
    public class Student {
        // 创建一个对象数组保存3名学生的信息
        Student[] stus = new Student[3];
    
        int age; // 年龄
        String name; // 姓名
    
        /**
         *  无参构造
         */
        public Student() {
        }
    
        /**
         * 带参构造
         */
        public Student(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        /**
         * 循环给对象数组中的每一个元素 赋值
         * @param stus  用户传递过来的对象数组
         */
        public void addStudent() {
            Scanner input = new Scanner(System.in);
            for (int i = 0; i < stus.length; i++) {
                System.out.println("请您给第" + (i + 1) + "个学生赋值:");
                // 需要给数组中的每一个元素对象 实例化
                stus[i] = new Student();
                System.out.println("姓名:");
                stus[i].name = input.next();
                System.out.println("年龄:");
                stus[i].age = input.nextInt();
            }
    
        }
    
        /**
         * @param students  需要遍历的数组名称
         */
        public void showStudent() {
            System.out.println("所有的学生信息显示如下:");
            for (Student stu : stus) {
                System.out.println(stu.name + ":" + stu.age);
            }
        }
    
        /**
         * 查询学生
         */
        public void finStudent(int begin, int end, String name) {
            // 定义一个标记
            boolean flag = false;
            for (int i = begin - 1; i < end; i++) {
                if (stus[i].name.equals(name)) {
                    flag = true; // 找到了 为true
                    break;
                }
            }
            if (flag) {
                System.out.println("找到了");
            } else {
                System.out.println("您查询的学生不存在!");
            }
        }
    
        /**
         * @param oldName   学生以前的姓名
         * @param newName   更改之后的姓名
         */
        public void changeName(String oldName, String newName) {
            // 定义一个标记 看是否更改成功
            boolean flag = false;
            for (int i = 0; i < stus.length; i++) {
                if (stus[i].name.equals(oldName)) {
                    stus[i].name = newName;
                    flag = true;
                    break;
                }
            }
            if (flag) {
                System.out.println("修改成功");
            } else {
                System.out.println("没有找到!无法修改");
            }
        }
    
    }
    public class StudentTest {
    
        /**
         * 需求:
         * 01.现在有3名学生!创建一个对象数组保存这3名学生的信息!并且输出!
         * 02.让用户输入一个开始和结束位置!以及学生的姓名! 我们判断是否有该学生!
         * 
         * 
         * 分析:
         * 01.3名学生,每一个学生都是一个对象!那么第一步创建一个学生类!!!
         *   并且 给类中增加属性和构造方法
         * 02.什么是数组?  一组相同数据类型的数据集合!
         *     int []  nums=new int[3];
         *     
         *    什么是对象数组?
         *    3名学生 是3个对象!  类型一样,类型都是Student类型!
         *      Student   []  students=new   Student[3];
         *   现在students数组中的每一个元素 是什么?
         *    students[0]  是一个Student对象!
         *    students[1]  是一个Student对象!
         *    students[2]  是一个Student对象!
         *  03.怎么给对象数组中的每一个元素(Student对象)的属性赋值呢?
         *       前提  每一个元素 都需要实例化!
         *       因为这个对象数组中的每一个元素 不再是普通的数值了,而是一个Student类型的对象!
         *       对象没有实例化,是不能使用的!
         *       否则会产生NullPointerException(空指针异常)
         *       null.不出来任何东西!
         */
        public static void main(String[] args) {
    
            // 实例化Student类
            Student stu = new Student();
            stu.addStudent(); // 循环新增学生信息
            // 看到输入的所有 学生信息
            stu.showStudent();
            // 根据开始和结束位置,去数组中查询 有没有该学生
            Scanner input = new Scanner(System.in);
            System.out.println("请输入开始查询的位置:");
            int begin = input.nextInt();
            System.out.println("请输入结束查询的位置:");
            int end = input.nextInt();
            System.out.println("请输入查询的学生姓名:");
            String name = input.next();
            // 根据用户的输入找到指定的学生
            stu.finStudent(begin, end, name);
    
            System.out.println("请输入需要修改的学生姓名:");
            String oldName = input.next();
            System.out.println("请输入新姓名:");
            String newName = input.next();
            stu.changeName(oldName, newName);
            // 看到输入的所有 学生信息
            stu.showStudent();
    
        }
    
    }

    2.封装:

    /**
     * 学生类
     * 
     * 面向对象的三大特性!
     * 01.封装
     *     概念:将类的某些信息隐藏在类内部!不允许其他类直接访问,而是通过该类提供的方法来访问隐藏的信息!
     *     目的:隐藏类的内部细节! 安全!
     *   
     *   步骤:
     *     001.把所有的属性 私有化
     *     002.创建属性对应的set和get方法     shift +alt +s  +r 快速生成类中所有变量的set和get方法
     *     003.在对应的set或者get方法中 增加逻辑判断!确保数据的有效性!
     * 
     * 
     * 02.继承
     * 03.多态
     * 
     */
    public class Student {
        private int age; // 年龄
        private String name; // 姓名
        private char sex; // 性别
    
        /**
         * get() 是为了别人获取值
         * set() 是为了给属性赋值
         * shift +alt +s  +r 快速生成类中所有变量的set和get方法
         * 
         */
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public char getSex() {
            return sex;
        }
    
        /**
         * @param sex  用户传递来的 用户性别
         * 如果用户输入的是不健康的数据!
         * 我们默认sex='男'
         */
        public void setSex(char sex) {
            if (sex == '男' || sex == '女') {
                this.sex = sex;
            } else {
                // 不健康输入
                this.sex = '男';
            }
        }
    
    }
    public class StudentTest {
    
        public static void main(String[] args) {
            Student stu = new Student();
            stu.setSex('c'); // ͨ¹ýset()ÊôÐÔ¸³Öµ
            // ͨ¹ýget()È¡Öµ
            System.out.println(stu.getSex());
        }
    }
    /**
     * 学生类   
     */
    public class Student {
    
        int age; // 年龄
        String name; // 姓名
    
        /**
         * shift +alt  +s  +o  快捷键 生成 有参和无参构造
         */
        public Student(int age, String name) {
            super();
            this.age = age;
            this.name = name;
        }
    
        public Student() {
            super();
        }
    
        /**
         * 学生自我介绍的方法
         */
        public void showInfo() {
            System.out.println("我的姓名是:" + name);
            System.out.println("我的年龄是:" + age);
        }
    
        public void showInfo(Student stu) {
            stu.age = 888; // 改变参数的值
            stu.name = "小白";
            System.out.println("参数的姓名是:" + stu.name);
            System.out.println("参数的年龄是:" + stu.age);
        }
    
        /**
         * 学生睡觉的方法
         */
        public void sleep() {
            System.out.println(name + "在睡觉");
        }
    
        /**
         * @param stu  用户传递来的学生对象
         * @return    是否长大了
         */
        public void changeStudent(Student stu) {
            // 定义一个标记
            boolean flag = false;
            if (stu.age > 20) {
                flag = true;
            }
    
            if (flag) {
                System.out.println("你已经长大了!");
            } else {
                System.out.println("你还年轻!");
            }
    
        }
    
    }
    public class StudentTest {
        public static void main(String[] args) {
            // 创建学生类对象
            Student stu = new Student();
            stu.age = 20;
            stu.name = "小黑";
            // 自我介绍
            stu.showInfo();
            // 调用对象的睡觉方法
            stu.sleep();
            System.out.println("----------------------------");
            stu.showInfo(stu);
            // 调用学生是否长大的方法
            stu.changeStudent(stu);
        }
    
    }
    /**
     * 方法重载
     * 01.在一个类中
     * 02.方法名相同
     * 03.参数列表不同
     * 04.与方法的修饰符和返回值类型 无关!
     * 
     * 
     * 其实就是一个静态的多态!
     *    都是买东西,但是根据传递参数的不同得到一个不同的结果!
     */
    public class Student {
        int age;
    
        /**
         * 构造的重载
         */
        public Student() {
        }
    
        public Student(int age) {
            this.age = age;
        }
    
        /**
         * 买东西  什么都不给
         */
        public void buy() {
    
        }
    
        /**
         * 买东西  给钱  没找零
         */
        public void buy(double money) {
    
        }
    
        /**
         * 买东西  给钱 ,给东西 
         */
        public void buy(double money, String someThing) {
    
        }
    
    }
    /**
     *   一个类在被jvm加载的时候,首先会加载类中所有由static修饰的方法,属性,代码块!
     *   并把这个数据放进堆中的静态存储区!便于我们访问!
     * 
     * static 可以修饰的内容
     * 01.属性       静态属性
     * 02.方法       静态方法
     * 03.代码块   静态代码块
     * 
     * 
     * 特点:
     *    01. 有static修饰的内容,在整个程序运行期间,只存在一份!
     *    02. 有static修饰的属性和方法,直接可以通过类名.属性 /类名.方法
     *    03. static修饰的方法中 不能访问 非static修饰的的属性!
     *    04.非static修饰的方法中能访问 static修饰的的属性!
     *    
     *    
     *  例子:
     *  之前说过 一个类可以创建N个对象!
     *  每个对象都是独一无二的!
     *  
     *    现在 我们实现N个对象 共享一个属性!
     * 
     */
    public class Student {
    
        static int age; // 静态变量
        String name;
    
        /**
         *  创建一个static修饰的静态方法
         *  之前的方式:
         *    01.通过类创建对象
         *    02.通过对象.方法访问
         *    
         *    现在
         *    直接通过类名.方法
         */
    
        public static void sayHello() {
            System.out.println("我是一个静态方法");
        }
    
        public static void main(String[] args) {
            Student stu1 = new Student();
            stu1.age = 50;
            stu1.name = "小黑";
            Student stu2 = new Student();
            stu2.age = 30;
            stu2.name = "小白";
    
            System.out.println("stu1的年龄:" + stu1.age);
            System.out.println("stu2的年龄:" + stu2.age);
            System.out.println("stu1的姓名:" + stu1.name);
            System.out.println("stu2的姓名:" + stu2.name);
    
            /**
             *  在 age前 加一个修饰符 static
             *  虽然没有给stu3对象的age属性赋值!
             *  但是因为age是static修饰的!
             *  所以所有对象共享这个属性!
             *  只要有一个对象改变了这个age属性!
             *  那么所有对象的这个age属性都随之发生变化!
             */
            Student stu3 = new Student();
            stu3.age = 60;
            System.out.println("stu3的年龄:" + stu3.age);
    
            Student.sayHello();
    
        }
    
    }
    /**
     * 验证静态代码块和普通代码块的执行顺序
     * 静态代码块优先执行!
     * 
     * 如果有多个静态代码块或者普通代码块
     * 按照书写的顺序执行!
     */
    public class StaticBlock {
    
        public StaticBlock() {
            System.out.println(" 无参构造");
        }
    
        {
            System.out.println("普通代码块1");
        }
    
        {
            System.out.println("普通代码块2");
        }
    
        static {
            System.out.println("静态代码块1");
        }
        static {
            System.out.println("静态代码块2");
        }
    
        public static void main(String[] args) {
            // 实例化对象
            StaticBlock s = new StaticBlock();
        }
    
    }
    /**
     * 书写实体类的步骤
     * 01.定义属性
     * 02.快捷键生成set  get
     * 03.快捷键生成  有参 无参构造
     * 04.生成toString()
     */
    public class Student {
        private int age;
        private String name; // 属性
    
        /**
         * set和get方法名称后的第一个单词 首字母小写 ===》属性名
         * 
         * 01.this调用本类的构造方法时,只能存在构造方法中的第一行!
         * 02.this还可以访问我们的属性和方法 可以存在任何位置!
         */
        public Student() {
            this(50, "小黑"); // 调用本类的带参构造
        }
    
        public Student(int age, String name) {
            // this(); 调用本类的无参构造
            this.age = age;
            this.name = name;
        }
    
        // set get方法
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }
    public class StudentTest {
    
        public static void main(String[] args) {
            
            Student stu = new Student();
            System.out.println(stu.getName());
            System.out.println(stu.getAge());
    
        }
    }
  • 相关阅读:
    网络流二十四题之魔术球问题
    网络流二十四题之P2764 最小路径覆盖问题
    网络二十四题 之 P2756 飞行员配对方案问题
    网络流 之 dinic算法
    网络流 之 增广路
    中南
    2249: Altruistic Amphibians 01背包的应用 + lh的简单图论 图转树求lca
    今日训练 搜索
    AD-logon workstation
    Centos7-docker安装
  • 原文地址:https://www.cnblogs.com/wwlw/p/7402512.html
Copyright © 2011-2022 走看看