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

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

  • 相关阅读:
    Generate Parentheses
    Length of Last Word
    Maximum Subarray
    Count and Say
    二分搜索算法
    Search Insert Position
    Implement strStr()
    Remove Element
    Remove Duplicates from Sorted Array
    Remove Nth Node From End of List
  • 原文地址:https://www.cnblogs.com/dshore123/p/8744330.html
Copyright © 2011-2022 走看看