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

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

原文地址:https://www.cnblogs.com/dshore123/p/8744330.html