zoukankan      html  css  js  c++  java
  • java基础-类

    1、成员变量

    /**
     * 在java中。对象的属性也被称为成员变量
     */
    public class Book {
        private String Name;//定义一个String类型的成员变量
    
        public String GetName(){ // 定义一个GetName 方法
            int id = 0; // 局部变量
            setName("Java"); // 调用类中的其他方法
            return id + this.Name; //设置方法返回值
        }
    
        /**
         * 定义一个SetName方法
         * @param name
         */
        private void SetName(String name){
            this.Name = name; // 将参数值赋予类中的一个成员变量
        }
    
        public Book getBook(){
            return this; // 返回Book的类引用
        }
    }

    2、成员方法

    3、权限修饰符

    4、局部变量==在成员方法内部定义的变量

    5、局部变量的有效范围

    6、this关键字

    方法里隐藏着一个this自引用,指向调用这个方法的对象。

    使用一个对象调用方法,也叫做在这个对象上调用方法。因为方法可以访问这个对象的值。

    访问一个成员变量的完整形态,是"this.成员变量的名字"

    public class MerchandiseV2 {
    
        public String name;
        public String id;
        public int count;
    
        public void addCount(int count) {
            // >> TODO 方法里隐藏着一个this自引用,指向调用这个方法的对象。
            // >> TODO 使用一个对象调用方法,也叫做在这个对象上调用方法。因为方法可以访问这个对象的值。
            // >> TODO 访问一个成员变量的完整形态,是"this.成员变量的名字"
            this.count += count;
    
            System.out.println("MerchandiseV2的addCount方法使用的对象是:" + this);
        }
    }
    

      

    7、类的构造方法

    package supermarket;
    
    public class MerchandiseV2WithConstructor {
    
        public String name;
        public String id;
        public int count;
        public double soldPrice;
        public double purchasePrice;
    
        // >> TODO 构造方法(constructor)的方法名必须与类名一样,而且构造方法没有返回值。这样的方法才是构造方法。
        // >> TODO 构造方法可以有参数,规则和语法于普通方法一样。使用时,参数传递给 new 语句后类名的括号后面。
        // >> TODO 如果没有显示的添加一个构造方法,Java会给每个类都会默认自带一个无参数的构造方法。
        //    TODO 如果我们自己添加类构造方法,Java就不会再添加无参数的构造方法。这时候,就不能直接 new 一个对象不传递参数了(看例子)
        // >> TODO 所以我们一直都在使用构造方法,这也是为什么创建对象的时候类名后面要有一个括号的原因。
        // >> TODO 构造方法无法被点操作符调用或者在普通方法里调用,只能通过 new 语句在创建对象的时候,间接调用。
        // TODO 理解一下为什么构造方法不能有返回值,因为有返回值也没有意义,new 语句永远返回的是创建出来的对象的引用
        public MerchandiseV2WithConstructor(String name, String id, int count,
                                            double soldPrice, double purchasePrice) {
            this.name = name;
            this.id = id;
            this.count = count;
            this.soldPrice = soldPrice;
            this.purchasePrice = purchasePrice;
        }
    
        public void describe() {
            System.out.println("商品名字叫做" + name + ",id是" + id + "。 商品售价是" + soldPrice
                + "。商品进价是" + purchasePrice + "。商品库存量是" + count +
                "。销售一个的毛利润是" + (soldPrice - purchasePrice));
        }
    
        public double calculateProfit() {
            double profit = soldPrice - purchasePrice;
    //        if(profit <= 0){
    //            return 0;
    //        }
            return profit;
        }
    
        public double buy(int count) {
            if (this.count < count) {
                return -1;
            }
            return this.count -= count;
        }
    }

    8、构造方法的重载和相互调用

    package supermarket;
    
    public class MerchandiseV2 {
    
        public String name;
        public String id;
        // >> TODO 构造方法执行前,会执行给局部变量赋初始值的操作
        // >> TODO 我们说过,所有的代码都必须在方法里,那么这种给成员变赋初始值的代码在哪个方法里?怎么看不到呢?
        //    TODO 原来构造方法在内部变成了<init>方法。学习就是要脑洞大,敢想敢试,刨根问底。
        public int count = 999;// 999/0;
        public double soldPrice;
        public double purchasePrice;
    
        // >> TODO 构造方法(constructor)的重载和普通方法一样
        public MerchandiseV2(String name, String id, int count, double soldPrice, double purchasePrice) {
            this.name = name;
            this.id = id;
            this.count = count;
            this.soldPrice = soldPrice;
            this.purchasePrice = purchasePrice;
    //        soldPrice = 9/0;
        }
    
        // >> TODO 在构造方法里才能调用重载的构造方法。语法为this(实参列表)
        // >> TODO 构造方法不能自己调用自己,这会是一个死循环
        // >> TODO 在调用重载的构造方法时,不可以使用成员变量。因为用语意上讲,这个对象还没有被初始化完成,处于中间状态。
        // >> TODO 在构造方法里才能调用重载的构造方法时,必须是方法的第一行。后面可以继续有代码
        public MerchandiseV2(String name, String id, int count, double soldPrice) {
             // double purPrice = soldPrice * 0.8;
            // this(name, id, count, soldPrice, purchasePrice);
            this(name, id, count, soldPrice, soldPrice * 0.8);
            // double purPrice = soldPrice * 0.8;
        }
    
        // >> TODO 因为我们添加了构造方法之后,Java就不会再添加无参数的构造方法。如果需要的话,我们可以自己添加这样的构造方法
        public MerchandiseV2() {
            this("无名", "000", 0, 1, 1.1);
    
        }
    
        public void describe() {
            System.out.println("商品名字叫做" + name + ",id是" + id + "。 商品售价是" + soldPrice
                + "。商品进价是" + purchasePrice + "。商品库存量是" + count +
                "。销售一个的毛利润是" + (soldPrice - purchasePrice));
        }
    
        public double calculateProfit() {
            double profit = soldPrice - purchasePrice;
    //        if(profit <= 0){
    //            return 0;
    //        }
            return profit;
        }
    
        public double buy(int count) {
            if (this.count < count) {
                return -1;
            }
            return this.count -= count;
        }
    }

    9、静态变量、常量和方法

    静态变量使用 static 修饰符

    静态变量如果不赋值,Java也会给它赋以其类型的初始值

    静态变量一般使用全大写字母加下划线分割。这是一个习惯用法

    所有的代码都可以使用静态变量,只要根据防范控制符的规范,这个静态变量对其可见即可

    比如 public 的静态变量,所有的代码都可以使用它

    但是如果没有public修饰符,只能当前包的代码能使用它

     TODO 使用自己的使用静态变量的时候,直接写静态变量名字。

    import com.geekbang.supermarket.MerchandiseV2WithStaticVariable;
    import  static com.geekbang.supermarket.MerchandiseV2WithStaticVariable.*;
    
    public class MerchandiseV2DescAppMain {
        public static void main(String[] args) {
            MerchandiseV2WithStaticVariable merchandise = new MerchandiseV2WithStaticVariable
                ("书桌", "DESK9527", 40, 999.9, 500);
    
            merchandise.describe();
    
            // >> TODO 使用import static来引入一个静态变量,就可以直接用静态变量名访问了
            //    TODO import static也可以使用通配符*来引入一个类里所有静态变量
            System.out.println(DISCOUNT_FOR_VIP);
        }
    }
    packagesupermarket;
    
    public class MerchandiseV2WithStaticVariable {
    
        public String name;
        public String id;
        public int count;
        public double soldPrice;
        public double purchasePrice;
    
        // >> TODO 静态变量使用 static 修饰符
        // >> TODO 静态变量如果不赋值,Java也会给它赋以其类型的初始值
        // >> TODO 静态变量一般使用全大写字母加下划线分割。这是一个习惯用法
        // >> TODO 所有的代码都可以使用静态变量,只要根据防范控制符的规范,这个静态变量对其可见即可
        //    TODO 比如 public 的静态变量,所有的代码都可以使用它
        public static double DISCOUNT_FOR_VIP = 0.95;
    
        //    TODO 但是如果没有public修饰符,只能当前包的代码能使用它
        static int STATIC_VARIABLE_CURR_PACKAGE_ONLY = 100;
    
    
        public MerchandiseV2WithStaticVariable(String name, String id, int count, double soldPrice, double purchasePrice) {
            this.name = name;
            this.id = id;
            this.count = count;
            this.soldPrice = soldPrice;
            this.purchasePrice = purchasePrice;
        }
    
        public String getName() {
            return name;
        }
    
        public MerchandiseV2WithStaticVariable(String name, String id, int count, double soldPrice) {
            this(name, id, count, soldPrice, soldPrice * 0.8);
        }
    
        public MerchandiseV2WithStaticVariable() {
            this("无名", "000", 0, 1, 1.1);
    
        }
    
        public void describe() {
            System.out.println("商品名字叫做" + name + ",id是" + id + "。 商品售价是" + soldPrice
                + "。商品进价是" + purchasePrice + "。商品库存量是" + count +
                "。销售一个的毛利润是" + (soldPrice - purchasePrice) + "。折扣为" + DISCOUNT_FOR_VIP);
        }
    
        public double calculateProfit() {
            double profit = soldPrice - purchasePrice;
    //        if(profit <= 0){
    //            return 0;
    //        }
            return profit;
        }
    
    
        public double buy() {
            return buy(1);
        }
    
        public double buy(int count) {
            return buy(count, false);
        }
    
        public double buy(int count, boolean isVIP) {
            if (this.count < count) {
                return -1;
            }
            this.count -= count;
            double totalCost = count * soldPrice;
            if (isVIP) {
                // >> TODO 使用自己的使用静态变量的时候,直接写静态变量名字。
                return totalCost * DISCOUNT_FOR_VIP;
            } else {
                return totalCost;
            }
        }
    }

    10、类的主方法

  • 相关阅读:
    【宗萨仁波切】研究佛教即是研究自己,而研究自己即是发现无我
    【佩玛.丘卓】在当下那一刻觉醒...
    佩玛·丘卓:人生基本的事实
    佩玛.丘卓的生活智慧——【空船】
    佩玛·丘卓 | 宽恕自己,重新开始
    佩玛·丘卓:修炼平等心
    佩玛•丘卓 :我们需要的皆已具足
    【佩玛丘卓】喂养好狼
    佩玛.丘卓:为事情如实的面目而喜悦
    佩玛·丘卓:精神勇士的口诀
  • 原文地址:https://www.cnblogs.com/pangchunlei/p/12288760.html
Copyright © 2011-2022 走看看