zoukankan      html  css  js  c++  java
  • java基础9 main函数、this、static、super、final、instanceof 关键字

    main函数详解

    1.public:公共的.权限是最大的,在任何情况都可以访问
      原因:为了保证jvm在任何情况下都可以访问到main法
    2.static:静态,静态可以让jvm调用更方便,不需要用对象调用
    3.void:没有返回值.因为返回的数据是给jvm,而jvm使用这个数据是没有意义的,所有就不要了
    4.main:函数名, 注意:main方法并不是关键字,只不过是jvm唯一识别的一个特殊函数名
    5.arguments(args):担心某些程序启动时需要参数.

    class Demo1 {
        public static void main(String[] args) {
            System.out.println("Hello World!");
        }
    }

    二、this关键字

    2.1 this 的概述

    this关键字代表是对象的引用。也就是this在指向一个对象,所指向的对象就是调用该函数的对象引用。(this关键字代表了所属函数的调用对象)

    2.2 this关键字的作用

        1.如果存在同名的局部变量和成员变量时,在方法内部默认访问的是局部变量的数据
          可以通过this关键字指定访问成员变量的数据
        2.this关键字在构造函数中不能出现相互调用,因为是一个死循环

    class Student{
        int id;    //身份证 (成员变量)
        String name;//名字  (成员变量)
        //目前情况:存在同名的局部变量和成员变量,在方面内部默认使用的局部变量的.
        public Student(int id,String name){//局部变量
            this.name = name;//把局部变量name的数据传给成员变量name
            this.id = id;    
        }
    }
    class Demo8 {
        public static void main(String[] args) {
            Student s=new Student(12580,"王麻子");        
            System.out.println(s.id+"	"+s.name);
        }
    }

    2.3 this关键字要注意的事项

      1.如果在一个方法中访问一个变量时,该变量只存在成员变量的情况下,那么java编译器会自动在该变量前添加this关键.

      2.this只能在非静态(没有static修饰的)函数使用.

      3.在一个构造函数中如何调用另一个构造函数的格式: this()无参构造器,this(参数...)有参构造器......
       一个构造器调用另一个构造器(方法/函数): this()关键字必须位于第一个语句,否则编译错误

    class Student{
        int id;    
        String name;
        //目前情况:存在同名的局部变量和成员变量,在方面内部默认使用的局部变量的.
        public Student(int id,String name){//全参构造器
            this(name);//调用的是:含有参数name的构造器
            this.name = name;
            this.id = id;
        }
        //无参构造器
        public Student(){
    
        } 
        //含一个参数的构造器
        public Student(String name){
            this.name=name;//把局部变量给了成员变量name
        }
    }
    class Demo8 {
        public static void main(String[] args) {
            Student s=new Student(250,"王麻子");        
            System.out.println(s.id);
        }
    }    

    三、static关键字

    3.1 static修饰成员变量时

    static修饰成员变量时,那么该成员变量数据就是一个共享数据;
      静态成员的访问方式:
            方式一: 使用对象进行访问
                        对象.变量名
            方式二: 使用类名进行访问
                        类名.变量名
    注意:

           非静态成员变量,只能使用对象进行访问,不能使用类名访问千万不要为了方便访问变量而使用static修饰,一定要是该数据是共享的数据时才使用static修饰

    3.2  static修饰方法(静态成员方法)

    静态方法的访问方式:
           方式一: 可以使用对象调用
                   对象.静态的方法名();
           访问方式二: 可以使用类名调用
                   类名.静态方法名();

    class Student{
        String name;
        static String country="中国";
        //静态方法(函数)
        public static void study(){
            System.out.println(country+"努力学习");
        }
        //有参构造器
        public Student(String name){
            this.name=name;
        }
        //无参构造器
        public Student(){
        }
        //普通方法(函数)
        public void eat(){
            System.out.println(country+name+"努力学习");
        }
    }
    
    class Demo9 {
        public static void main(String[] args) {
            Student s=new Student("铁蛋");
            s.eat();//用对象名调用
            Student.study();//用类名直接调用
            s.study();
    
            Student s1=new Student();
         s1.name = "狗娃";//用对象名调用
            Student.name = "狗蛋";//用类名直接调用;此处报错,原因:成员变量name不是静态变量,静态方法不能直接用类名调用,要用对象名调用
            System.out.println(s1.name+"	"+Student.country); //Student.country:不报错的原因:因为country是静态成员变量,所以可以用类名调用
        }
    }

    3.3 静态的成员变量和非静态的成员变量区别

    1.作用上区别:
      1.静态成员变量的作用共享一个数据给所有对象使用
      2.非静态成员变量的作用是描述一类事物的公共属性
    2.数量与存储的位置的区别:
      1.静态成员变量存储在方法区内存中,而且只会存储一份数据
      2.非静态成员变量存储在堆内存中,有n个对象就会有n份数据
    3.生命周期的区别:
      1.静态的成员变量数据是随着类的加载而存在,随着类文件的消失而消失
      2.非静态的成员变量数据是随着对象的创建而存在,随着对象的消失而被垃圾回收器回收掉

    3.4静态函数要注意的事项

    1.静态函数可以通过类名或者对象进行访问,而非静态的只能通过对象进行访问.
    2.静态的函数是可以直接访问静态的成员的,但是不能访问非静态的成员;
      原因:静态成员可以直接使用类名调用,这个时候可能还没有存在对象,
        而非静态的成员是随着对象的创建而存在的
    3.非静态的函数是可以直接访问静态和非静态的成员的.
      原因:非静态函数只由对象调用,当对象存在时,静态的数据老早就存在了,
         而非静态的数据也随着对象的创建而存在了
    4.静态函数不能出现this或者super关键字
      原因:因为静态函数是可以使用类名调用的,一旦使用类名调用,这个时候可能不存在对象,而this
         关键字代表了一个函数的调用者对象,这个时候就会产生冲突

    3.5 静态数据生命周期

       静态的成员变量数据是先于对象存在的

    四、super关键字

     4.1、概念:

       super关键字代表了父类空间的引用

    4.2、super关键字的作用

      1.子父类中存在这同名的成员时,在子类中默认访问子类的成员,可以通过super关键字访问父类指定父类成员
        2.创建子类对象时,默认调用父类的无参构造器,可以通过super关键字调用父类中有参构造器

    4.3、super关键字调用父类的构造方法时,要注意的事项

      1.在子类的构造器中没有指定调用父类的构造方法,那么编译器会在子类构造器中默认添加一个super()
        2.super关键字调用父类构造函数时,该语句必须要是子类函数的第一语句
        3.super关键字与this关键字不能同时出现在一个构造函数中调用其他构造函数.因为两个语句都需要是第一个语句(第一行)

    五、super关键字与this关键字的区别

    1.代表的事物不一致
        1.super关键字代表的是父类空间的引用.
        2.this关键字代表是所属函数的调用对象.
    2.使用的前提不一样
        1.super关键字必须要有继承关系才能使用
        2.this关键字不需要存在继承关系也可以使用
    3.调用构造函数的区别
        1.super关键字是调用父类的构造函数
        2.this关键字是调用本类的构造函数.

     //例子super和this关键字
    1
    class Fu{ 2 int x=10; 3 String name; 4 5 public Fu(){ 6 System.out.println("父类无参构造器...."); 7 } 8 public Fu(String name){ 9 this.name=name; //把局部变量name的数据传给成员变量name 10 } 11 public void eat(){ 12 System.out.println("小头爸爸吃番薯......."+name); 13 } 14 } 15 16 class Zi extends Fu { 17 int x=20; 18 int num; 19 public Zi(){ 20 System.out.println("这是子类无参构造器..."); 21 } 22 public Zi(String name,int num){ 23 super(name); //指定调用父类的一个参数的构造器 24 super.eat();//调用父类中的eat() 方法 25 26 } 27 28 public void eat(){ 29 System.out.println("大头儿子吃龙虾...."+super.x+" "+name); //和this关键字的用法相似,这里(super.x)调用的是父类中的成员变量x,返回结果:10;去掉super关键字,返回结果:20 (就近原则) 30 } 31 } 32 class Demo7{ 33 public static void main(String[] args) { 34 Zi z=new Zi("二狗子",2); 35 z.eat(); //这里调用的是子类的eat()方法 36 } 37 }

     结果图:

    解析:

    第一条结果:是子类实例化对象后(Zi z = new Zi("二狗子",2);),调用了子类的有参构造器(含两个参数的构造器),有参构造器的 “super(name)”再去调用父类中的含一个参数的构造器,才返回的第一条结果。

    第二条结果:是直接调用子类中的 eat() 方法。super.x)调用的是父类中的成员变量x,返回结果:10;去掉super关键字,返回结果:20 (就近原则)

          由于super(name)调用父类中的含一个参数的构造器,所以,相当于子类间接继承了父类中的含一个参的构造器,故name也有父类一样的值。

    六、final 关键字

    常量修饰符一般为:public static final

      例如:public static final double PI = 3.14; //圆周率

    (注:常量的命名规范:
         全部字母都要大写,单词与单词之间 使用下划线分割。)

    final 关键字注意事项:

        1.final关键字修饰一个基本类型的变量时,该变量不能重新赋值,第一次的值为最终值
        2.final关键字修饰一个引用类型时,该变量不能重新指向新的对象.
        3.final关键字修饰一个函数时,该函数不能被重写
        4.final关键字修饰一个类时,该类就不能被继承

     注:(基本类型包括:基本数据类型引用数据类型,在java里面除去基本数据类型的其它类型都是引用数据类型,自己定义的class类都是引用类型,可以像基本类型一样使用。)

    七、instanceof 关键字

    1、instanceof关键字的作用

      判断一个对象是否属于指定类型

    2、instanceof使用的前提

      判断对象与指定的类型必须是继承或者实现关系

    3、instanceof的格式    

      对象 instanceof 类别

    4、运用场景

      多态

       //需求,定义一个函数可以接收任意类型的动物对象,在函数的内部要调用到动物特有的方法
        //instanceof
        public static void print(Animal a){ //相当于:Animal a=new Fish();
            if(a instanceof Fish){
                 Fish f=(Fish)a;
                 f.bubble();
            }else if(a instanceof Mouse){
                Mouse m=(Mouse)a;
                m.dig();
            }else{
                System.out.println("输入错误");
            }
        }

    解析:当实例化一个对象:

       Animal a=new Mouse("米老鼠"); //多态,父类的引用指向子类的对象
            a.run();
            //a.dig(); //报错,因为是多态(父类中没有dig()方法),所以要强制转换类型
            Mouse m=(Mouse)a; //强制类型转换  
            m.dig();

    完整例子:

     1 //动物类
     2 abstract class Animal{
     3     String name;
     4     public Animal(String name){
     5         this.name=name;
     6     }
     7 
     8     public abstract void run(); //抽象方法
     9 }
    10 //老鼠类
    11 class Mouse extends Animal{
    12     public Mouse(String name){
    13         super(name);
    14     }
    15     public void run(){
    16         System.out.println(name+"四条腿慢慢走");
    17     }
    18 
    19     public void dig(){
    20         System.out.println(name+"老打洞...");
    21 
    22     }
    23 }
    24 //鱼类
    25 class Fish extends Animal{
    26     public Fish(String name){
    27         super(name);
    28     }
    29     public void run(){
    30         System.out.println(name+"摇着尾巴游啊游...");
    31     }
    32     public void bubble(){
    33         System.out.println(name+"吹泡泡....");
    34     }
    35 }
    36 
    37 class Demo6 {
    38     public static void main(String[] args) {
    39         Animal a=new Mouse("米老鼠");//多态,父类的引用指向子类的对象
    40         a.run();
    41         //a.dig();报错
    42         //调用
    43         Mouse m=(Mouse)a;//强制类型转换  
    44         m.dig(); //如果直接用a.dig()的话,会报错,因为是多态(父类中没有dig()方法),所以要强制转换类型
    45 
    46         Animal a1=new Fish("金枪鱼");
    47         Fish f=(Fish)a1;
    48         print(f);
    49     }
    50 
    51     //需求,定义一个函数可以接收任意类型的动物对象,在函数的内部要调用到动物特有的方法
    52     //instanceof
    53     public static void print(Animal a){ //相当于:Animal a=new Fish();
    54         if(a instanceof Fish){
    55              Fish f=(Fish)a;
    56              f.bubble();
    57         }else if(a instanceof Mouse){
    58             Mouse m=(Mouse)a;
    59             m.dig();
    60         }else{
    61             System.out.println("输入错误");
    62         }
    63     }
    64 }

    八、其他java关键字

    1、super和extends关键字:http://www.cnblogs.com/dshore123/p/8805436.html

    2、break和continue关键字http://www.cnblogs.com/dshore123/p/8656779.html

    3、abstract关键字:http://www.cnblogs.com/dshore123/p/8867093.html

    4、interface、implements关键字:http://www.cnblogs.com/dshore123/p/8873647.html

    5、throw、throws、finally关键字:http://www.cnblogs.com/dshore123/p/8927993.html

    原创作者:DSHORE

    作者主页:http://www.cnblogs.com/dshore123/

    原文出自:http://www.cnblogs.com/dshore123/p/8744330.html

    欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

  • 相关阅读:
    怎样处理人际关系中的矛盾
    如何处理人际关系
    Python包含以下函数:
    与他人有效沟通的小技巧
    沟通时容易出现的问题
    如何在工作中提升自己
    第十三周进度报告
    第十二周学习进度
    团队绩效管理
    软件对标分析
  • 原文地址:https://www.cnblogs.com/dshore123/p/8744330.html
Copyright © 2011-2022 走看看