JAVA类基础

1.this表示本类, super表示父类

2.类中函数两个特点:

   (1)重载:同一个类中,用overload

    (2)覆盖:子类中,也称重写,覆写。用override 。子类方法覆盖父类方法时,子类方法权限要大于等于父类方法权限。

 3.看下面的例子,应该输出什么呢?

   class Fu
    {
         Fu()
        {
             System.out.println('A');
        }
        Fu(int x)
       {
             System.out.println('B');
       }
    }
   class Zi extends Fu
   {
        Zi()

        {
                System.out.println('C');
        }
        Zi(int x)

        {
              System.out.println('D');
        }
   }
 class Demo
{
     public static void main(String []args)
     {
           new Zi(6);
     }
}

  答案应该是输出:AD

  因为在每个子类的构造函数的第一行里都会默认执行super(),以执行父类的构造函数。所以输出为AD,而并不是我们想象的BD。如果想要结果输出为BD,则需要我们在Zi类中的Zi(int x)构造函数里的第一行手工添加super(x);

 如果父类没有无参数的构数函数,则子类的构造函数中必须有super函数来明确要调用父类中的哪个构造函数。

class Fu
{
    Fu()
   {
       super();
       show();
       return;
    } 
   void show()
   {
       System.out.println("Fu show");
   }
}
class Zi
{
    int num=8;
    Zi()
    {
        super();
        return ;
    }
    void show()
    {
         System.out.println("Zi show "+num);
    }
}
class Demo
{
     public static void main(String [] args)
     {
          Zi z=new Zi();
          z.show();
      }
}

  上述代码执行的结果为:

        Zi show 0

        Zi show 8

很多人可能认为结果应该是:

       Fu show

       Zi show 8

问题的关键是在执行到父类的无参构造函数时,show()调用的时子类的函数,应为此时this为当前的对象,即子类对象。

子类中的属性变量在生成类时被赋予默认值,在执行完父类的无参构造函数时,再被赋予初始值。

一个对象实例化过程:

Person p=new Person();

1.JVM会读取指定的路径下(classpath)的Person.class文件,并加载进内存,并会先加载Person的父类(如果有直接父类的情况下);

2.在堆内存中开辟空间,分配地址。

3.在堆内存的对象空间中,对对象中的属性进行默认初始化。

4.调用对应的构造函数进行初始化。

5.在构造函数中,第一行会先到调用父类中构造函数进行初始化。

6.父类初始化完毕后,再对子类的属性时行显示初始化。

7.再进行子类构造函数的特定初始化。

8.初始化完毕后,将地址值赋值给引用变量。

final关键字

1.final是一个修饰符,可以修饰类、方法、变量。

2.final修饰的类不可以被继承。

3.final修饰的方法不可以被覆盖。

4.final修饰的变量是一个常量,只能被赋值一次。

5. final使用时必须显式初始化,常量所有字母一般都大写,多个单词中间用下划线连接。

原文地址:https://www.cnblogs.com/jsddj/p/7443183.html