首页 > 技术文章 > Java基础_扫描器 静态 可变参数

miku-jl 2021-08-08 22:45 原文

扫描器 静态 可变参数

 


 

1.Scanner

扫描器对象 , 用于接收键盘数据

基本语法 : Scanner scanner = new Scanner(System.in) ;

通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据。

if (scanner.hasNext(){ //使用next方式接收 String str = scanner.next(); System.out.println("输出的内容为: "+str) ; }

scanner.close; //关闭

next ( ) : 不能得到空格后的数据 以有效数据后的空白为结束符

nextline ( ) : 读取输入回车前的所有字符 以Enter为结束符 可获取空白

2.Static

案例1

 public class Main {  
     static int value = 33;
  
     public static void main(String[] args) throws Exception{
         new Main().printValue();
     }
  
     private void printValue(){
         int value = 3;
         System.out.println(this.value);
     }
 }

33

this代表当前对象,那么通过new Main()来调用printValue的话,当前对象就是通过new Main()生成的对象。而static变量是被对象所享有的,因此在printValue中的this.value的值毫无疑问是33。在printValue方法内部的value是局部变量,根本不可能与this关联,所以输出结果是33。在这里永远要记住一点:静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)。

案例2

 public class Test extends Base{
  
     static{
         System.out.println("test static");
     }
      
     public Test(){
         System.out.println("test constructor");
     }
      
     public static void main(String[] args) {
         new Test();
     }
 }
  
 class Base{
      
     static{
         System.out.println("base static");
     }
      
     public Base(){
         System.out.println("base constructor");
     }
 }

base static

test static

base constructor

test constructor

代码具体执行过程 :

执行开始,先找到main方法,因为该方法是程序入口,但在执行main方法之前,必须先加载Test类,而加载Test类时发现Test类继承自Base类,因此会转去先加载Base类,在加载Base类时,发现有static块,便执行了static块。在Base类加载完成之后,便继续加载Test类,然后发现Test类中也有static块,便执行static块。在加载完所需的类之后,便开始执行main方法。在main方法中执行new Test()的时候会先调用父类的构造器,然后再调用自身的构造器

案例3

 public class Test {
     Person person = new Person("Test");
     static{
         System.out.println("test static");
     }
      
     public Test() {
         System.out.println("test constructor");
     }
      
     public static void main(String[] args) {
         new MyClass();
     }
 }
  
 class Person{
     static{
         System.out.println("person static");
     }
     public Person(String str) {
         System.out.println("person "+str);
     }
 }
  
  
 class MyClass extends Test {
     Person person = new Person("MyClass");
     static{
         System.out.println("myclass static");
     }
      
     public MyClass() {
         System.out.println("myclass constructor");
     }
 }

test static

myclass static

person static

person Test

test constructor

person MyClass

myclass constructor

首先加载Test类,因此会执行Test类中的static块。接着执行new MyClass(),而MyClass类还没有被加载,因此需要加载MyClass类。在加载MyClass类的时候,发现MyClass类继承自Test类,但是由于Test类已经被加载了,所以只需要加载MyClass类,那么就会执行MyClass类的中的static块。在加载完之后,就通过构造器来生成对象。而在生成对象的时候,必须先初始化父类的成员变量,因此会执行Test中的Person person = new Person(),而Person类还没有被加载过,因此会先加载Person类并执行Person类中的static块,接着执行父类的构造器,完成了父类的初始化,然后就来初始化自身了,因此会接着执行MyClass中的Person person = new Person(),最后执行MyClass的构造器。

3.可变参数

public void Max ( double x , int ... i ) { }

可变长参数的使用规则 1 在调用方法的时候,如果能够和固定参数的方法匹配,也能够与可变长参数的方法匹配,则选择固定参数的方法。 2 如果要调用的方法可以和两个可变参数匹配,则出现错误 3 一个方法只能有一个可变长参数,并且这个可变长参数必须是该方法的最后一个参数

可变长参数的使用规范

1 避免带有可变长参数的方法重载

2 别让null值和空值威胁到变长方法

3 重写变长方法也要循规蹈矩

推荐阅读