zoukankan      html  css  js  c++  java
  • Java 笔记03

    final可以修饰类、属性、方法。

     

    当用final修饰类的时候,此类不可被继承,即final类没有子类。这样可以用final保证用户调用时动作的一致性,可以防止子类覆盖情况的发生。

     

    当利用final修饰一个属性(变量)的时候,此时的属性成为常量。

    JAVA利用final定义常量(注意在JAVA命名规范中常量需要全部字母都大写):

    Final intAGE=10;

    常量的地址不可改变,但在地址中保存的值(即对象的属性)是可以改变的。

     

    Final可以配合static使用。 

    Staticfinal int age=10

     

    在JAVA中利用publicstatic final的组合方式对常量进行标识(固定格式)。

     

    对于在构造方法中利用final进行赋值的时候,此时在构造之前系统设置的默认值相对于构造方法失效。

     

     

    常量(这里的常量指的是实例常量:即成员变量)赋值:

    ①在初始化的时候通过显式声明赋值。Final int x=3;

    ②在构造的时候赋值。

    局部变量可以随时赋值。

     

    利用final定义方法:这样的方法为一个不可覆盖的方法。

    Public final void print(){};

    为了保证方法的一致性(即不被改变),可将方法用final定义。

     

    如果在父类中有final定义的方法,那么在子类中继承同一个方法。

     

    如果一个方法前有修饰词private或static,则系统会自动在前面加上final。即private和static方法默认均为final方法。

     

    注:final并不涉及继承,继承取决于类的修饰符是否为private、default、protected还是public。也就是说,是否继承取决于这个方法对于子类是否可见。

    Abstract(抽象)可以修饰类、方法

    如果将一个类设置为abstract,则此类必须被继承使用。此类不可生成对象,必须被继承使用。

    Abstract可以将子类的共性最大限度的抽取出来,放在父类中,以提高程序的简洁性。

    Abstract虽然不能生成对象,但是可以声明,作为编译时类型,但不能作为运行时类型。

    Final和abstract永远不会同时出现。

     

    当abstract用于修饰方法时,此时该方法为抽象方法,此时方法不需要实现,实现留给子类覆盖,子类覆盖该方法之后方法才能够生效。

     

    注意比较:

    private void print(){};此语句表示方法的空实现。

    Abstract void print(); 此语句表示方法的抽象,无实现。

     

    如果一个类中有一个抽象方法,那么这个类一定为一个抽象类。

    反之,如果一个类为抽象类,那么其中可能有非抽象的方法。

     

    如果让一个非抽象类继承一个含抽象方法的抽象类,则编译时会发生错误。因为当一个非抽象类继承一个抽象方法的时候,本着只有一个类中有一个抽象方法,那么这个类必须为抽象类的原则。这个类必须为抽象类,这与此类为非抽象冲突,所以报错。

     

    所以子类的方法必须覆盖父类的抽象方法。方法才能够起作用。

    只有将理论被熟练运用在实际的程序设计的过程中之后,才能说理论被完全掌握!

    为了实现多态,那么父类必须有定义。而父类并不实现,留给子类去实现。此时可将父类定义成abstract类。如果没有定义抽象的父类,那么编译会出现错误。

     

    Abstract和static不能放在一起,否则便会出现错误。(这是因为static不可被覆盖,而abstract为了生效必须被覆盖。)

     

    例:(本例已存在\CODING\abstract\TestClass.java文件中)

    public classTestClass{

      public static void main(String[] args){

    SuperClass sc=new SubClass();

    Sc.print();

    }

    Abstract class SuperClass{

    Abstract void print();}

    }

    class SubClass extends SuperClass(){

     void print(){

    System.out.println(“print”);}

    }

     

    JAVA的核心概念:接口(interface)

    接口与类属于同一层次,实际上,接口是一种特殊的抽象类。

    如:

      interface IA{

    }

    publicinterface:公开接口

    与类相似,一个文件只能有一个public接口,且与文件名相同。

    在一个文件中不可同时定义一个public接口和一个public类。

     

    一个接口中,所有方法为公开、抽象方法;所有的属性都是公开、静态、常量。

     

    一个类实现一个接口的格式:

    class IAImpleimplements IA{

    };

     

    一个类实现接口,相当于它继承一个抽象类。

     

    类必须实现接口中的方法,否则其为一抽象类。

    实现中接口和类相同。

     

    接口中可不写public,但在子类中实现接口的过程中public不可省。

    (如果剩去public则在编译的时候提示出错:对象无法从接口中实现方法。)

     

    注:

    ①  一个类除继承另外一个类,还可以实现接口;

    class IAImpl extends java.util.Arrylist implement IA{}

                     继承类                    实现接口

    这样可以实现变相的多继承。

    ②  一个类只能继承另外一个类,但是它可以继承多个接口,中间用“,”隔开。

    Implements IA,IB

    所谓实现一个接口,就是指实现接口中的方法。

    ③  接口和接口之间可以定义继承关系,并且接口之间允许实现多继承。

    例:interface IC extends IA,IB{};

    接口也可以用于定义对象

    IA I=new IAImpl();

    实现的类从父类和接口继承的都可做运行时类型。

    IAImple extends A implement IA,IB

    IB I=new IAImple();

    I instance of IAImple;

    I instance of A;

    I instance of IA;

    I instance of IB;

    返回的结果均为true.

     

    接口和多态都为JAVA技术的核心。

     

    接口往往被我们定义成一类XX的东西。

    接口实际上是定义一个规范、标准。

     

    ①  通过接口可以实现不同层次、不同体系对象的共同属性;

    通过接口实现write once as anywhere.

    以JAVA数据库连接为例子:JDBC制定标准;数据厂商实现标准;用户使用标准。

    接口通常用来屏蔽底层的差异。

    ②接口也因为上述原因被用来保持架构的稳定性。

     

    JAVA中有一个特殊的类: Object。它是JAVA体系中所有类的父类(直接父类或者间接父类)。

     

    此类中的方法可以使所的类均继承。

     

    以下介绍的三种方法属于Object:

    (1)  finalize方法:当一个对象被垃圾回收的时候调用的方法。

    (2)  toString():是利用字符串来表示对象。

    当我们直接打印定义的对象的时候,隐含的是打印toString()的返回值。

    可以通过子类作为一个toString()来覆盖父类的toString()。

    以取得我们想得到的表现形式,即当我们想利用一个自定义的方式描述对象的时候,我们应该覆盖toString()。

    (3)equal

    首先试比较下例:

    String A=newString(“hello”);

    String A=newString(“hello”);

    A==B(此时程序返回为FALSE)

    因为此时AB中存的是地址,因为创建了新的对象,所以存放的是不同的地址。

     

    附加知识:

    字符串类为JAVA中的特殊类,String中为final类,一个字符串的值不可重复。因此在JAVA VM(虚拟机)中有一个字符串池,专门用来存储字符串。如果遇到String a=”hello”时(注意没有NEW,不是创建新串),系统在字符串池中寻找是否有”hello”,此时字符串池中没有”hello”,那么系统将此字符串存到字符串池中,然后将”hello”在字符串池中的地址返回a。如果系统再遇到String b=”hello”,此时系统可以在字符串池中找到 “hello”。则会把地址返回b,此时a与b为相同。

     

     

    Stringa=”hello”;

    System.out.println(a==”hello”);

    系统的返回值为true。

     

    故如果要比较两个字符串是否相同(而不是他们的地址是否相同)。可以对a调用equal:

    System.out.println(a.equal(b));

    equal用来比较两个对象中字符串的顺序。

    a.equal(b)是a与b的值的比较。

     

     

    注意下面程序:

    student a=new student(“LUCY”,20);

    student b=new student(“LUCY”,20);

    System.out.println(a==b);

    System.out.println(a.equal(b));

    此时返回的结果均为false。

     

    以下为定义equal(加上这个定义,返回ture或false)

    public booleanequals(Object o){

      student s=(student)o;

      if(s.name.equals(this.name)&&s.age==this.age)

    else returnfalse;

    }如果equals()返回的值为

     

    以下为实现标准equals的流程:

    public booleanequals(Object o){

      if (this==o) return trun;  //此时两者相同
      if (o==null) return false;

      if (! o instanceof strudent) returnfalse;  //不同类

      studeng s=(student)o; //强制转换

      if(s.name.equals(this.name)&&s.age==this.age) return true;

    else returnfalse;

    }

     

    以上过程为实现equals的标准过程。

     

     练习:建立一个employee类,有String name,int id,doublesalary.运用getset方法,使用toString,使用equals

     

    封装类:

    JAVA为每一个简单数据类型提供了一个封装类,使每个简单数据类型可以被Object来装载。

    除了int和char,其余类型首字母大写即成封装类。

    转换字符的方式:

    int I=10;

    String s=I+” ”;

    Strings1=String.valueOf(i);

     

    Int I=10;

    IntergerI_class=new integer(I);

     

    看javadoc的帮助文档。

    附加内容:

    “==”在任何时候都是比较地址,这种比较永远不会被覆盖。

     

    程序员自己编写的类和JDK类是一种合作关系。(因为多态的存在,可能存在我们调用JDK类的情况,也可能存在JDK自动调用我们的类的情况。)

    注意:类型转换中double\interger\string之间的转换最多。
  • 相关阅读:
    Bresenham画线算法
    DDA算法
    GL_LINES & GL_LINE_STRIP & GL_LINE_LOOP
    贝塞尔曲线
    弱引用
    Lambert模型
    ShadowVolume
    Phong Shading
    求反射向量
    Vertex Modifier of Surface Shader
  • 原文地址:https://www.cnblogs.com/flyingsir/p/3983762.html
Copyright © 2011-2022 走看看