• 【2】Java封装


    一、封装概念

    将类的某些信息隐藏在类的内部,不允许外部程序直接访问,通过该类提供的方法来实现对隐藏信息的操作和访问
    例子:ATM机 特点:
    1)只能通过规定的方法访问数据
    2)隐藏类的实例细节,方便修改和实现

    二、实现封装的步骤

    1、修改属性的可见性,将访问修饰符设计为private(私有化),当private加在属性前面表示属性只能在当前类内被访问(信息的隐藏)
    2、创建getter(取值)/setter(赋值)方法,:设为public 用于属性的读写(留出接口)
    3、在getter/setter方法中加入属性控制语句,对合法性进行判断::对属性值的合法性进行判断(留出接口)
    private String name;
    public void setName(String name) {
            this.name = name;
    }
    public String getName() {
           return "我是一只名叫:" + this.name + "的宠物猫";
    }

    三、如何快捷的生成封装方法

    1)eclipse代码编辑区空白处右键->source->Generate Getters and Setters...
    2)idea封装Alt+Insert组合键,或者空白处右键Generate,选择Getter and Setter。
    3)只有getXXX方法的属性是只读属性;
    4)只有setXXX方法的属性是只写属性 ;
     

    四、编程练习:图书信息设置

    package com.fiona.javaBasis.day11fz;
    
    public class Book {
        //私有属性:书名、作者、出版社、价格
        private   String bookname;//书名,只读
        private String author;//作者,只读
        private String chubanshe;
        private double price;
        //通过构造方法实现属性赋值
        public Book(String bookname,String author){
            this.bookname=bookname;
            this.author=author;
        }
        /*通过公有的get/set方法实现属性的访问,其中:
        1、限定图书价格必须大于10,如果无效需进行提示,并强制赋值为10
        2、限定作者、书名均为只读属性
        */
        //信息介绍方法,描述图书所有信息
        public String getBookname() {
            return bookname;
        }
    
        public String getAuthor() {
            return author;
        }
    
        public String getChubanshe() {
            return chubanshe;
        }
    
        public void setChubanshe(String chubanshe) {
            this.chubanshe = chubanshe;
        }
    
        public double getPrice() {
            return price;
        }
    
        public void setPrice(double price) {
            if(price<10){
                System.out.println("图书价格必须大于10元");
                this.price=10;
            }else {
                this.price = price;
            }
    
        }
    
    
    }
    Book
    package com.fiona.javaBasis.day11fz;
    public class BookTest {
    
        // 测试方法
        public static void main(String[] args) {
            //实例化对象,调用相关方法实现运行效果
    
            Book one = new Book("红楼梦","曹雪芹");
    
            one.setChubanshe("人民文学出版社");
            one.setPrice(1);
            Book two = new Book("小李飞刀","古龙" );
            two.setChubanshe("中国长安出版社");
            two.setPrice(55.5);
    
            System.out.println("书名:"+one.getBookname());
            System.out.println("作者:"+one.getAuthor());
            System.out.println("出版社:"+one.getChubanshe());
            System.out.println("价格:"+one.getPrice());
            System.out.println("=======================");
            System.out.println("书名:"+two.getBookname());
            System.out.println("作者:"+two.getAuthor());
            System.out.println("出版社:"+two.getChubanshe());
            System.out.println("价格:"+two.getPrice());
        }
    }
    BookTest

    五、包

    1、包的规范

    1)语法: package 包名;
    2)必须放在java源文件中的第一行
    3)一个java源文件只能有一个package语句
    4)命名方式:域名倒序+模块+功能,例如:package com.imooc.animal;
    5)包名全部英文小写
    6)建议每个包储存的信息功能单一
     

    2、导入包

    1)语法:import 包名.类名
    2)三种调用形式
    import com.imooc.animal.*;//导入包中全部类
    import com.imooc.animal.Cat;//导入包中指定类
    com.imooc.animal.cat() c1=new com.imooc.animal.cat();//可以直接导入包名来加载,如果不同包中有一样的类名,只能用这种方法
    4)import 包名.*只能访问包名下的类,无法访问子包的类;
    5)import导入顺序是无关的;包名.类名比包名.* 的方式效率更高。
    6)Java中关于定义包和导入包的语法,定义顺序是:package、import和class。
     

    六、编程练习:用户信息

     
     
    package com.fiona.javaBasis.day11fz;
    
    public class User {
        private String username,pwd;
    
        public User(String username,String pwd){
            this.username=username;
            this.pwd=pwd;
        }
        //建议同学创建无参构造,因当没有写构造方法,系统会默认添加一个无参构造,但是当写了有参构造后,系统不会再默认添加一个,如果只写了一个带参构造,假如有一个子类继承了它,一般子类的无参构造默认去调用的是父类的无参构造(而此时父类并没有无参构造),这个时候就会报错了。所以建议同学把无参构造写上。
        public User(){};
        public void setUsername(String username) {
            this.username = username;
        }
    
        public void setPwd(String pwd) {
            this.pwd = pwd;
        }
    
        public String getUsername() {
            return username;
        }
    
        public String getPwd() {
            return pwd;
        }
    }
    User.java
    package com.fiona.javaBasis.day11fz;
    
    public class UserManager {
        // 用户信息验证的方法
        // 用户信息验证的方法,注意方法的返回值是一个字符串,需要有return,并且在主方法中需要有System输出.
        public String checkUser(User one, User two) {//就是把实例化的2个new对象复制到这里面的参数进行比较返回结果
            // 判断用户名和密码是否为空,是否一致
            if(one.getUsername()==""||one.getPwd()==""||two.getUsername()==""||two.getPwd()==""){
                return "用户名或密码不能为空!";
            }else {
                System.out.println("用户名"+one.getUsername()+"
    密码:"+one.getPwd()+"
    用户名"+two.getUsername()+"
    密码:"+two.getPwd());
                System.out.println("==============================");
                if((one.getUsername().equals(two.getUsername()))&(one.getPwd().equals(two.getPwd()))){
                    return "用户名密码一致";
                }else {
                    return  "用户名密码不一致";
                }
            }
        }
    }
    UserManager.java
    package com.fiona.javaBasis.day11fz;
    
    public class UserTest {
        // 测试方法
        public static void main(String[] args) {
            //实例化对象,调用相关方法实现运行效果
            User one=new User("Lucy","123456");
            User two=new User("Mike","123456");
            UserManager um=new UserManager();
            System.out.println(um.checkUser(one,two));
        }
    }
    UserTest.java

     七、static关键字

    1、定义

    static修饰的成员称为静态成员、类成员(属于这个类的成员)。

    2、举例

    1)static + 属性

    public static int price;
    称为:静态属性、类属性
    调用方式:类.静态属性

    2)static + 方法

    public static void eat(){};
    称为静态方法、类方法
    调用方式:类.静态方法
     

    3)static+ class(类)(不存在 )

    4)static +方法内的局部变量(不存在)

    3、特性

    1)在类中定义后,无论这个类实例化多少个对象,用static 修饰的成员属性,都会使用同一片内存空间,改变一个static属性的值,其他的都会改变
    2)static属性随着所有实例化的对象销毁后才销毁,和普通属性“随着他所属对象一起销毁”不同

    4、静态成员访问方式

    1)对象名.静态属性名;(使用这种方式编译器会警告,但不会报错)
    2)类名.静态属性名;//推荐使用
    3)成员方法(非静态方法)中可以直接访问类的静态成员;
    4)静态方法中不能直接访问非静态成员,只能直接调用静态成员(包括属性和方法),或者通过对象实例化(对象.成员)后进行访问;
    5)静态方法中不能使用this
    6)类外调用静态方法时可以通过类名,也可以通过对象名
     

    5、代码块{}

    1)普通代码块:顺序执行;
    2)构造代码块:直接在类中定义的代码块,创建对象时调用,优先于构造方法执行;多个构造代码块顺序执行;
    3)静态代码块:static修饰的代码块,优于构造代码块执行,多个静态代码块顺序执行;无论产生多少个实例,只调用一次。
    赋值普通成员变量只能先实例化对象,在通过对象.成员属性的方式
     
     
     
     

  • 相关阅读:
    COGS2355 【HZOI2015】 有标号的DAG计数 II
    COGS2353 【HZOI2015】有标号的DAG计数 I
    COGS2259 异化多肽
    二项式定理
    Codeforces 528D Fuzzy Search
    技术文章阅读-华为WS331a产品管理页面存在CSRF漏洞
    技术文章阅读-天翼创维awifi路由器存在多处未授权访问漏洞
    技术文章阅读-红蓝对抗系列之浅谈蓝队反制红队的手法一二
    技术文章阅读-Solr ReplicationHandler漏洞浅析
    技术文章阅读-记一次edu站点从敏感信息泄露到getshell
  • 原文地址:https://www.cnblogs.com/haifeima/p/12713082.html
Copyright © 2020-2023  润新知