zoukankan      html  css  js  c++  java
  • java第四天---类与对象2

      1、方法的重载

      2、类的构造方法

      3、static

      4、包

      5、权限修饰符

    一、方法的重载

      方法的重载要解决的问题:当一个类中存在很多方法时,对开发很不友好,方法名太多太不好记忆。这时候如果能够让多个方法的方法名相同,让参数列表不同,就能实现不同的功能,让开发者使用时也比较轻松。解决这个问题就是方法的重载。

      方法重载的特点:

        ①方法重载是在同一个类中发生的

        ②方法重载的方法名相同,参数列表不同(可以是参数个数不同,参数类型不同,参数顺寻不同)。

        ③返回值没有要求,可以相同,可以不同

        示例:

    View Code

    二、构造函数

      什么是构造函数?

        一个特殊的方法,构造函数存在于类中,作用是创建对像时对其进行初始化,就是为对象中的属性进行赋值

      构造函数的特点:

        ①函数名和类名相同

        ②没有返回值

        ③没有static修饰

        ④构造函数分为有参构造和无参构造,符合方法重载的要求,也就时说可以多个构造函数以满足不同的初始化要求。

        ⑤当类中没有写构造函数时,java会默认有个无参的构造方法。但是当你写了有参构造方法时,这个默认的无参构造方法就没有了。我们提议将无参构造方法手写出来。

      示例:

      创建一个类:   

    
    
    public class cao {
    String color;
    int height;

    // 无参构造
    public cao(){};
    // 有参构造
    public cao(String color,int height){
    /*我们在参数列表中使用的参数名和类的属性名是相同的,所以我们需要在属性名前使用
    this来对参数名和属性名进行区分,this指的是当前对象,this.属性名,就是对象的属性
    */
    this.color=color;
    this.height=height;
    }

    public void instrustor(){
    System.out.println("这是"+color+"的草,高为"+height);
    }
    }
     

      测试类:

    public class CaoTest {
        public static void main(String[] args) {
    //       使用无参构造创建对象
            cao cao = new cao();
            cao.height=8;
            cao.color="黄色";
            cao.instrustor();
    
    //       使用有参构造创建对象
            cao cao1 = new cao("绿色", 69);
            cao1.instrustor();
        }
    }
    View Code

    三、static关键字

      static可以做什么?

        static可以修饰变量,方法,代码块。

        静态变量、静态方法,静态代码块。

      特点:

        ①静态方法只能调用静态变量和静态方法

        ②实例方法(除了静态方法和构造方法)可以调用普通成员变量,静态变量,实例方法,成员方法

        ③静态变量和静态方法通过类直接调用:类名.变量/方法名。也可以new对象调用,但是不推荐

        ④被static修饰的变量、方法、代码块都是类的组成,在程序加载时加载,只加载一次

      为什么要使用static关键字?

        举个实例大家理解一下,举一个砍树的例子,首先声明,我们要保护环境,保护我们的家园。

        目前有50棵树,由三个伐木工一块砍伐:

        代码实例一:第一个实例中,num属性没有使用static修饰

    public class Rosser {
    //  树的数量
        int num=50;
    //    普通类成员变量
        int pNum;  //人数
    
        public Rosser(){}
    
    //    静态代码块 :此处只为展示静态代码块的写法,并无其他意义
    //    静态修饰的各种东西都是在程序加载的时候就加载进内存,所以静态代码块执行的比对象实例化早
        static {
            System.out.println("这是一片树林");
        }
    //  静态方法:此处只为展示静态方法的写法,所以该方法并无任何实际意义
        public static void zhongshu(){
            System.out.println("zhognshu");
        }
        public int kanshu(){
            return --num;
        }
    }
    View Code

        运行结果:

    public class ShuTest {
        public static void main(String[] args) {
            Rosser rosser1 = new Rosser();
            int kanshu = rosser1.kanshu();
            System.out.println("伐木工一:还剩"+kanshu+"棵树");
    
            Rosser rosser2 = new Rosser();
            int kanshu2 = rosser2.kanshu();
            System.out.println("伐木工二:还剩"+kanshu2+"棵树");
    
            Rosser rosser3 = new Rosser();
            int kanshu3 = rosser3.kanshu();
            System.out.println("伐木工一:还剩"+kanshu3+"棵树");
        }
    }
    
    /*控制台中的运行结果:
    这是一片树林
    伐木工一:还剩49棵树
    伐木工二:还剩49棵树
    伐木工一:还剩49棵树
    */
    View Code

        从结果看出,每个伐木工砍过树之后都是只剩49棵,这是不符合逻辑的

        代码示例二:这次使用static修饰num属性

    public class Rosser {
    //  树的数量
        static int num=50;
    //    普通类成员变量
        int pNum;  //人数
    
        public Rosser(){}
    
    //    静态代码块 :此处只为展示静态代码块的写法,并无其他意义
    //    静态修饰的各种东西都是在程序加载的时候就加载进内存,所以静态代码块执行的比对象实例化早
        static {
            System.out.println("这是一片树林");
        }
    //  静态方法:此处只为展示静态方法的写法,所以该方法并无任何实际意义
        public static void zhongshu(){
            System.out.println("zhognshu");
        }
        public int kanshu(){
            return --num;
        }
    }
    View Code

        运行结果:

    public class ShuTest {
        public static void main(String[] args) {
            Rosser rosser1 = new Rosser();
            int kanshu = rosser1.kanshu();
            System.out.println("伐木工一:还剩"+kanshu+"棵树");
    
            Rosser rosser2 = new Rosser();
            int kanshu2 = rosser2.kanshu();
            System.out.println("伐木工二:还剩"+kanshu2+"棵树");
    
            Rosser rosser3 = new Rosser();
            int kanshu3 = rosser3.kanshu();
            System.out.println("伐木工一:还剩"+kanshu3+"棵树");
        }
    }
    
    /*控制台输出的结果:
    这是一片树林
    伐木工一:还剩49棵树
    伐木工二:还剩48棵树
    伐木工一:还剩47棵树
    */
    View Code

        这次的输出是没有问题的,符合现实逻辑。

      详解:没有被static修饰的num属性,会随着每次创建对象而初始化,也就导致了每个伐木工的对象的num数量都是50棵。被static修饰的属性,是类的属性,在程序加载时加载,早已经存在于内存中,不会再随对象的实例化而实例化,每个对象都是访问内存的同一个num.

    四、权限修饰

      什么是权限修饰符?

        权限修饰符共四种:private(私有的)、protected(受保护的)、public(公共的)、default

      权限修饰符做什么使用?

        权限修饰符用来对类、方法、属性进行修饰,用来控制各个东西的访问权限。默认是default.

      以下是每个修饰符修饰的东西的作用范围:

    _____________同一类______同一包________同一包的子类________不同包子类_______其他__________

    public           可以               可以                           可以                            可以                    可以

    protected           可以               可以                           可以                            不可以               不可以

    default                    可以                可以                           不可以                         不可以              不可以

    private                    可以                不可以                       不可以                          不可以              不可以

  • 相关阅读:
    分治6--循环比赛日程表
    分治5--一元三次方程求解
    分治4--快速排序
    分治3--黑白棋子的移动
    分治2--取余运算
    分治1--二分查找
    贪心6--整数区间
    贪心5--活动选择
    贪心4--拦截导弹
    贪心3--删数问题
  • 原文地址:https://www.cnblogs.com/fbbg/p/14113273.html
Copyright © 2011-2022 走看看