zoukankan      html  css  js  c++  java
  • java——方法重载与重写、构造方法、this关键字、static关键字、strictfp关键字、类的导入

      Java SE5新增加@Override注解,它并不是关键字,但是可以把它当作关键字使用。当你想要覆写(重写)某个方法时,可以选择添加这个注解,在你不留心重载而并非覆写了该方法时,编译器就会生成一条错误信息。

      方法重载:重载的时候,方法名要一样,但是参数类型或个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。

      方法覆写(重写):

        若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。

        方法重载是编译时处理的,而方法覆盖是在运行时处理的。  

        在子类的某个方法覆盖父类的方法时,这个方法的访问权限可以被扩大,但是不能缩小,否则报错。

        父类的静态方法不能被子类的非静态方法覆盖,同样父类的非静态方法也不能被子类的静态方法覆盖。

        子类的方法覆盖父类的方法时,子类不能抛出父类没有抛出的异常。

    构造方法:类中的一种方法,类似Python的__init__,但是有一些要求:

      1.方法名要和类名相同。

      2.在方法名的前面没有返回值类型的声明。

      3.不能用return返回一个值,但是可以单独写return作为方法的结束。

      4.java中每个类都至少有一个构造方法,如果没有定义构造方法,系统也会自动创建一个空的构造方法。

      5.构造方法一般用public来修饰。

      6.在初始化含参的构造方法时必须检查参数的合法性,这样可以提高代码的健壮性。

    拷贝构造方法:

      用该类的一个对象来初始化这个类:

    //Example:
    //1.Clock类:
    public class Clock {
     private int hour;
     private int minute;
     private int second;
     
     public Clock(){
      setTime(0,0,0);
     }
     
     public Clock(int h,int m,int s){
      setTime(h,m,s);
     }
     
     /* 拷贝构造函数 */
     public Clock(Clock clock){
      this.hour=clock.hour;
      this.minute=clock.minute;
      this.second=clock.second;
     }
     
     public int getHour() {
      return hour;
     }
     public int getMinute() {
      return minute;
     }
     public int getSecond() {
      return second;
     }
     public void setTime(int h,int m,int s){
      if(h>=0 && h<24)
       this.hour=h;
      else
       this.hour=0;
      
      if(m>=0 && m<60)
       this.minute=m;
      else
       this.minute=0;
      
      if(s>=0 && s<60)
       this.second=s;
      else
       this.second=0;
     }
     
     public void printTime(){
      if(this.hour<10)
       System.out.print("0");
      System.out.print(this.hour+":");
      
      if(this.minute<10)
       System.out.print("0");
      System.out.print(this.minute+":");
      
      if(this.second<10)
       System.out.print("0");
      System.out.println(this.second);
     }
    }
    //2.main函数:
    public class Program {
     public static void main(String[] args) {
      Clock c1=new Clock(6,43,23);
      Clock c2=new Clock(c1);//调用拷贝构造函数
      c1.printTime();
      c2.printTime();
     }
    }
    //3.运行结果:
    06:43:23
    06:43:23

     用 this 调用构造方法

      调用这个类的另一个构造方法

    public Card(String i, String n, char s, double m, double initial){
        this(i, n, s, m);
        money += initial;

     构造方法继承

      java子类可以继承父类所拥有的成员变量和成员方法,但父类的构造方法不能继承。(正常子类可以直接用父类的方法和变量,但是构造方法必须使用super()调用)

      要在子类中的构方法中使用super();来调用父类的构造方法,该方法必须放置于子类构造方法的第一句:

    public son(){
        super(); // 调用父类无参构造方法
        a = 1; 
    }

      如果子类的构造方法没有调用父类的构造方法,那系统会自动调用无参父类的构造方法。此时若父类没有无参构造函数会在编译时报错。

      一个构造方法中不能同时包括this调用和super调用,如果想同时包含两个调用,可以在this调用的构造方法中首先调用super()。

    this关键字:

      1.通过this关键字可以明确的去访问一个类的成员变量,解决与局部变量名称冲突的问题。

      2.通过this关键字调用成员方法。

      3.构造方法是在实例化对象时被java虚拟机自动调用的,在程序中不能像调用其他方法一样调用构造方法,但可以在一个构造方法中使用“this([par1, par2...])”的形式来调用其他的构造方法,但是在成员方法中不可行,也不能在一个类中的两个构造方法中使用this相互调用。

    static关键字:

      静态变量

        在类加载之后创建和初始化,而不是对象创建后

        在一个java类中,可以使用static关键字来修饰成员变量,该变量被称为静态变量,静态变量被所有实例共享。要注意,static不能用来修饰局部变量和内部类中的变量。

        (为什么static不能修饰局部变量?答:局部变量之所以叫局部变量,其作用域也只限于声明它的方法体内。在方法被调用时,这些局部变量获得内存空间,到方法执行结束时,他们所占据的内存空间就被释放。而static定义的变量叫做静态变量,静态变量在类加载的时候创建,随着类的消失而消失。二者生命周期不同。)

        (为什么static不能修饰内部类中的变量?答:静态变量是要占用内存的,在编译时只要是定义为静态变量了,系统就会自动分配内存给他,而内部类是在宿主类编译完编译的,也就是说,必须有宿主类存在后才能有内部类,这也就和编译时就为静态变量分配内存产生了冲突,因为系统执行:运行宿主类->静态变量内存分配->内部类,而此时内部类的静态变量先于内部类生成,这显然是不可能的,所以不能定义静态变量)

      静态方法

        跟Python中的静态方法@staticmethod类似,这种方法在不创建对象的情况下也能被调用:类名.方法。

        实例化后的对象同样可以调用静态方法:对象名.方法。

        静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。

        静态方法的覆盖符合非静态方法覆盖的一些规则,二者区别在于java虚拟机将静态方法绑定在类上,而将非静态方法绑定于对象实例。

      静态代码块

        static {...}

        当类被加载时静态代码块会被执行,由于类只加载一次,静态代码块也只执行一次,因此通常会使用静态代码块来对类的成员进行初始化。 

      静态类:

       java允许我们在一个类里面定义静态类。比如内部类(nested class)。把nested class封闭起来的类叫外部类。

      在java中,我们不能用static修饰顶级类(top level class)。只有内部类可以为static。 

    strictfp关键字:

      在main方法中使用strictfp将使用严格的浮点计算,在类中使用strictfp关键字则这个类中的所有方法都要使用严格的浮点计算。

    类的导入:

      如果同时要使用java.sql.Date和java.util.Date,需要在类的前面指出完整的类名:

        java.util.Date uDate = new java.util.Date();

        java.sql.Date sDate = new java.sql.Date();

      main函数为什么一定要用static修饰?

        main函数是程序的入口,而存在于类中的main函数如果没有static修饰,只是一个普通的实例方法,只有通过类对象才能调用。加上static之后,在类对象定义之前,该方法就已经构建完成,使得该方法独立于类对象之外,可以成为所有程序的入口。

    静态导入:  

    //导入System的静态方法和静态域
    import static java.lang.System.*;
    public class exp {
        public static void main(String args[]) {
            // 不需要加类的前缀
            out.println("No main()");        
        }
    }

      

  • 相关阅读:
    第一次作业
    第五次作业
    第三次作业
    第六次作业
    第二次作业
    scikitlearn学习 决策树
    [阅读]Think Python CH3 Functions
    [阅读]Think Python CH2 Variables, Expressions, and Statements
    [阅读]Think Python CH1 The Way of the Program
    Hive操作符和函数
  • 原文地址:https://www.cnblogs.com/gaoquanquan/p/9573047.html
Copyright © 2011-2022 走看看