<< index                     < bölüm 4                  > bölüm 6                



 

      BÖLÜM 5 : SINIFLARDA HİYERARŞİ, ABSTRACT SINIF VE İNTERFACE

 

      5.1 ABSTRACT SINIF

 

Üçüncü bölümde sınıfların diğer sınıflardan kalıtım (Inheritance) yoluyla türetilmesini görmüştük. Sınıfları kalıtım yoluyla birbirinden türetirken eğer ortak özellikli sınıflar yaratıyorsak, bütün bu sınıf gurubunun en tepesine abstract bir sınıf koyabiliriz. Abstract sınıfın diğer sınıfların kullanılmasında extends yoluyla tepe sınıflık etmek ve bütün alt sınıflara ortak bir adres çıkış noktası sağlamak dışında bir görevi yoktur. Diğer bir deyimle bu sınıflar hiçbir zaman doğrudan kullanılmazlar. Ancak alt sınıflarından birini referans olarak göstermek ve onlara dolaylı yoldan ulaşmak amacıyla kullanılırlar.

 

Kavramı daha iyi verebilmek için bir örnek problem oluşturalım. Daha önce sınıf kavramını açıklarken kullandığımız nokta,daire sınıflarını hatırlıyacaksınız. Şimdi bu sınıfların üzerine sekil isimli bir abstract sınıf ekleyerek tekrar oluşturalım.

Program 5.1 Abstract sınıf sekil ( sekilX.java dosyasında yer alıyor)

public abstract class sekilX

{

  //not burada başka değişkenlerde olabilir

  public double alan(){return 0.0;}

  public double hacim() {return 0.0;}

  public abstract String isim();

}

 

Program 5.2: sekil sınıfından kalıtım yoluyla türetilen noktaX sınıfı

 

import sekilX;

public class noktaX extends sekilX

{

    protected double x, y;

 

    public noktaX(double a, double b)

    {

        x=a;

        y=b;

    }

 

    public void noktagir(double a, double b)

    {

        x=a;

        y=b;

    }

 

    public double Xoku()

    {

        return x;

    }

 

    public double Yoku()

    {

        return y;

    }

 

    public String toString()

    {

        return "["+x+","+y+"]";

    }

 

    public String isim() {return "nokta";}

}

 

Program 5.3: noktaX sınıfından kalıtım yoluyla türetilen daireX sınıfı

 

import noktaX;

 

public class daireX extends noktaX

{

    protected double yaricap;

 

    public daireX()

    {

        //daire kalıtım yaptığı nokta sınıfının kurucu metodunu

        // super deyimi ile cagirabilir.

        super(0,0);

        yaricapgir(0);

    }

 

    public daireX(double r, double a, double b)

    {

        super(a,b);

        yaricapgir(r);

 

    }

 

    public void yaricapgir(double r)

    {

        if(r >= 0.0)

            yaricap=r;

        else

            yaricap=0.0;

    }

 

    public double yaricapoku()

    {

        return yaricap;

    }

 

    public double alan()

    {

        return 3.14159*yaricap*yaricap;

    }

 

 

    public String toString()

    {

        return "Merkez = "+"["+x+","+y+"]"+

        "; Yaricap="+yaricap;

    }

 

     public String isim() {return "daire";}

}

 

Program 5.4: daireX sınıfından kalıtım yoluyla türetilen silindirX sınıfı
 

 import daireX;

 

 public class silindirX extends daireX

 {

 protected double yukseklik;

 

 public silindirX()

 {

 yukseklikoku(0);

 }

 

 public silindirX( double h, double r, int a, int b)

 {

 super(r, a, b );

 yukseklikoku( h);

 }

 

 public void yukseklikoku (double h )

 {

 if(h>=0) yukseklik=h;

 else yukseklik=0;

 }

 

 public double yukseklikoku(){return yukseklik;}

 

  public double alan()

  {

 return 2* super.alan()+

 2*Math.PI*yaricap*yukseklik;

 }

 

 public double hacim(){return super.alan()*yukseklik;}

 

 public String toString()

 {return super.toString()+";yukseklik="+yukseklik;}

 

 public String isim(){return "silindir";}

}

 

Program 5.4 :  Abstract sınıf ve indirek referanslamayı test eden abstracttesti sınıfı
 

import java.awt.Graphics;

import java.applet.Applet;

 

 public class abstracttesti extends Applet

 {

 private noktaX n;

 private daireX d;

 private silindirX s;

 private sekilX a[];

 public void init()

 {

 n = new noktaX(7,11);

 d = new daireX(3.5,22,8);

 s = new silindirX(10,3.3,10,10);

 a = new sekilX[3];

 a[0]=n;

 a[1]=d;

 a[2]=s;

 }

 public void paint(Graphics g)

 {

 //direk cagirma :

 g.drawString(n.isim()+": "+n.toString(),25,25);

 g.drawString(d.isim()+": "+d.toString(),25,40);

 g.drawString(s.isim()+": "+s.toString(),25,55);

 //indirek cag�rma

 int y=85;

 for(int i=0;i<a.length;i++)

 {

 g.drawString(a[i].isim()+": "+a[i].toString(),25,y);

 y+=15;

 g.drawString("Alan : "+a[i].alan()+" Hacim : "+a[i].hacim(),25,y);

 y+=15;

 }

 }

 }

 

 

05001.JPG


Şekil 5.1  Abstract sınıf ve indirek referanslamayı test eden abstractTesti sınıfının sonuclarının applet de görülmesi

 

Program 5.5 :  Abstract sınıf ve indirek referanslamayı test eden abstractTesti_2000.java
 

import javax.swing.JOptionPane;

import silindirX;

import noktaX;

import daireX;

 

 public class abstractTesti_2000

 {

 

 public static void main(String args[])

 {

 noktaX n;

 daireX d;

 silindirX s;

 sekilX a[];

 n = new noktaX(7,11);

 d = new daireX(3.5,22,8);

 s = new silindirX(10,3.3,10,10);

 a = new sekilX[3];

 a[0]=n;

 a[1]=d;

 a[2]=s;

 String st="";

 st+=n.isim()+": "+n.toString()+"\n";

 st+=d.isim()+": "+d.toString()+"\n";

 st+=s.isim()+": "+s.toString()+"\n";

  //indirek cağırma

 int y=85;

  for(int i=0;i<a.length;i++)

    {

    st+=a[i].isim()+": "+a[i].toString()+"\n";

    st+="Alan : "+a[i].alan()+" Hacim : "+a[i].hacim()+"\n";

    }

 JOptionPane.showMessageDialog(null,st,"abstract test programı",

 JOptionPane.PLAIN_MESSAGE);

 System.exit(0);

 }

 }

 

05002.JPG

Şekil 5.2  Abstract sınıf ve indirek referanslamayı test eden abstractTesti_2000 sınıfının sonuclarının JoptionPane çıktısı olarak görülmesi

 

Örnekten de görüldügü gibi nokta, daire ve silindir abstract sekil sınıfının alt sınıfları olarak oluşturulmuş, ve aynı zamanda bu sınıflara indirek referans olarak kullanılmıştır. Diğer bir deyimle nokta daire ve silindirin adresleri sekil sınıfı nesneye aktarılmış ve bu nesne üzerinden üç sınıfta indirek olarak kullanılmıştır. Bu indirek kullanımın bize temel faydası, Programımıza yeni sınıflar eklediğimizde daha kolay ve az program değiştirerek uyumu sağlayabilme yeteneğidir. Orneğin yukarıdaki program sınıfları gurubuna koni eklemek istersek bütün yapacağımız koni sınıfını tanımladıktan sonra, sekil nesnesi a nın boyutunu bir arttırarak aynı hesaplamaya koniyide ilave etmekten ibaret olacaktır. Bu tür uygulamalar bilgisayar kodunun değişim gereksinimini minimuma indirgediğinden nesne kokenli bilgisayar programcılığının onemli uygulamalarından biridir.

 

      5.2 INTERFACE

 

Abstract sınıfların dezavantajı sadece bir sınıfın kalıtım yoluyla ve extends sozcüğü kullanılarak bağlanabilir olmasıdır. Ve eğer başka bir sınıf halihazırda o sınıfa kalıtım yoluyla bağlanmışsa, bizim yeni bir sınıfı üst sınıf olarak kullanma olasılığımız yok olmuş demektir. Fakat bazı uygulamalar için bu gerekebilir.Bu zaman interface kullanırız. Interface de abstract sınıf gibi kendi içinde bir işlem yapmaz. Sadece öbür sınıfların bağlanmasını teşkil eden bir adres noktası olarak iş görür. İnterface’i bir başka sınıfa bağlamak gerektiğinde extends yerine implements sözcüğü kullanılır. Abstract sınıflar kendi başına bir bütün teşkil edebilmelerine rağmen interface’in sadece kendi başına bir anlamı yoktur. Interface sınıfında yer alan tüm metod ve değişkenlerin alt sınıflarda tanımlanması gerekir.

 

Örnek olarak bir önceki problemi interface ile tanımlıyalım.

 

Program 5.5  interface sekil ( sekilY.java dosyasında yer alıyor)

 

public interface sekilY

 {

  //burada de§iŸken veya nesnelerde olabilir

 public abstract double alan();

 public abstract double hacim();

 public abstract String isim();

 }

 

 

Program 5.6 :  interface sekilden implements kelimesiyle türeyen noktaY sınıfı ( noktaY.java dosyasında yer alıyor)

import sekilY;
public class noktaY implements sekil
{
protected double x, y;
public noktaY(double a, double b)
{
noktagir(a,b);
}
public void noktagir(double a, double b)
{
x=a;
y=b;
}
public double Xoku()
{
return x;
}
public double Yoku()
{
return y;
}
public double alan() {return 0.0;}
public double hacim() {return 0.0;}
public String toString()
{
return "["+x+","+y+"]";
}
public String isimOku()
{
return "Nokta";
}
}

 

Görüldüğü gibi burada nokta sınıfının bir öncekinden farkı implements kelimesinin kullanılmış olaması ve bos alan ve hacim metotlarının bu dosyada yazılmasının gerekmesinden ibarettir. Interface programla yapılan ve alt sınıflarda bu metodların (veya değişkenlerin) tanımlanacağına dair yapılan bir kontrattır.DaireY ve silindirY sınıflarında bir fark mevcut degildir. İki seklin işlemsel sonuçları arasında da bir fark mevcut değildir.

Yukardaki örneğe parelel olarak burada da daireY,SilindirY tanımlarını yapalım ve interfaceTesti_2000.java programında test edelim.

 

Program 5.6 :  interface sekilY’den implements kelimesiyle türeyen noktaY sınıfından extends yoluyla türeyen  daireY sınıfı( daireY.java dosyasında yer alıyor)

 

import noktaY;

 

public class daireY extends noktaY

{

    protected double yaricap;

 

    public daireY()

    {

        //daire kalıtım yaptığı nokta sınıfının kurucu metodunu

        // super deyimi ile cagirabilir.

        super(0,0);

        yaricapgir(0);

    }

 

    public daireY(double r, double a, double b)

    {

        super(a,b);

        yaricapgir(r);

 

    }

 

    public void yaricapgir(double r)

    {

        if(r >= 0.0)

            yaricap=r;

        else

            yaricap=0.0;

    }

 

    public double yaricapoku()

    {

        return yaricap;

    }

 

    public double alan()

    {

        return 3.14159*yaricap*yaricap;

    }

 

 

    public String toString()

    {

        return "Merkez = "+"["+x+","+y+"]"+

        "; Yaricap="+yaricap;

    }

 

     public String isim() {return "daire";}

}

 

Program 5.7 :  interface sekilY’den implements kelimesiyle türeyen noktaY sınıfından extends yoluyla türeyen  daireY sınıfından extends yoluyla türeyen silindirY sınıfı( silindirY.java dosyasında yer alıyor)

 

 import daireY;

 

 public class silindirY extends daireY

 {

 protected double yukseklik;

 

 public silindirY()

 {

 super(0, 0, 0 );

 yukseklikoku(0);

 }

 

 public silindirY( double h, double r, int a, int b)

 {

 super(r, a, b );

 yukseklikoku( h);

 }

 

 public void yukseklikoku (double h )

 {

 if(h>=0) yukseklik=h;

 else yukseklik=0;

 }

 

 public double yukseklikoku(){return yukseklik;}

 

  public double alan()

  {

 return 2* super.alan()+

 2*Math.PI*yaricap*yukseklik;

 }

 

 public double hacim(){return super.alan()*yukseklik;}

 

 public String toString()

 {return super.toString()+";yukseklik="+yukseklik;}

 

 public String isim(){return "silindir";}

}

 

Program 5.8 :  interface sekilY’den türeyen sınıfları test eden ve indirek olarak referanslıyan interfaceTesti_2000.java programı

 

import javax.swing.JOptionPane;

import silindirY;

import noktaY;

import daireY;

 

 public class interfaceTesti_2000

 {

 

 public static void main(String args[])

 {

 noktaY n;

 daireY d;

 silindirY s;

 sekilY a[];

 n = new noktaY(7,11);

 d = new daireY(3.5,22,8);

 s = new silindirY(10,3.3,10,10);

 a = new sekilY[3];

 a[0]=n;

 a[1]=d;

 a[2]=s;

 String st="";

 st+=n.isim()+": "+n.toString()+"\n";

 st+=d.isim()+": "+d.toString()+"\n";

 st+=s.isim()+": "+s.toString()+"\n";

  //indirek cağırma

 int y=85;

  for(int i=0;i<a.length;i++)

    {

    st+=a[i].isim()+": "+a[i].toString()+"\n";

    st+="Alan : "+a[i].alan()+" Hacim : "+a[i].hacim()+"\n";

    }

 JOptionPane.showMessageDialog(null,st,"interface test programı",

 JOptionPane.PLAIN_MESSAGE);

 System.exit(0);

 }

 }

 

05003.JPG

Şekil 5.2  interface sınıf ve indirek referanslamayı test eden interfaceTesti_2000 sınıfının sonuclarının JoptionPane çıktısı olarak görülmesi

 

      5.3 ALIŞTIRMALAR

 

1.  Derste gördüğümüz abstract class sekilX,noktaX,daireX, silindirX sınıflarına ve ilave olarak koniX sınıfını yaratınız. Bu sınıfların sekiltestiX.java test sınıfında alanlarını ve hacimlerini sekilX referansını kullanarak yazdırınız.

 

2. Derste gördüğümüz interface sekilY, noktaY,daireY, silindirY sınıflarına ve ilave olarak küreY sınıfını yaratınız. Bu sınıfların sekiltesti.java testY sınıfında alanlarını ve hacimlerini sekilY referansını kullanarak yazdırınız.

 

3. H5AL1.java programını inceleyiniz. Bu program bir boyutlu abstract sınıf fx ve bu sınıfta tanımlanan abstract metot f(double x) i kullanan turev ve integral metodlarını içerir. İntegral ve türev metodlarını niçin abstact kavramı kullanarak yazdığımızı açıklayınız.

 

Program 5.7 H5AL1.java, fx ve H5AL1 sınıflarının tanımı

 

//abstract sinif ve boyutlu değiskenler alistirmasi

 

abstract class fx

{

  abstract double f(double x);

}

 

public class H5AL1

{

public static double turev(fx fi,double x)

{

// bu metod birinci dereceden bir fonksiyonun t�revini hesaplar

// metodun hata miktari h0 and n degiskenlerinin degisimi ile

// degistirilebilir. fonksiyon girisi fx abstract s�n�f� �zerinden

// yapilmalidir.

// Bu problem boyutlu de§iskenerin kullan�lmasi ile ilgili de bir

// ornektir.

double h0=0.0256;

int i,m;

int n=7;

//basit bir fonksiyonun t�revi

double T[][];

T=new double[n][n];

double h[];

h=new double[n];

for(i=0;i<n;i++)

{

  h[i]=0;

  for(int j=0;j<n;j++)

    T[i][j]=0;

}

h[0]=h0;

double r=0.5;

for( i=1;i<n;i++)

{

h[i]=h0*Math.pow(r,i);

}

 

for(i=0;i<n;i++)

{

T[i][0]=( fi.f(x + h[i]) - fi.f( x - h[i]))/(2.0*h[i]);

}

for(m=1;m<n;m++)

{

  for(i=0;i<n-m;i++)

  {

  T[i][m]=(h[i]*h[i]*T[i+1][m-1] - h[i+m]*h[i+m]*T[i][m-1])/

          (h[i]*h[i]- h[i+m]*h[i+m]);

  }

}

double xx=T[0][n-1];

return xx;

}

 

public static double integral(fx fi,double a,double b)

{

//gauss-legendre denklemini kullanarak integral hesaplama

//

 double s[],w[];

 int i;

 s=new double[30];

 w=new double[30];

 s[ 0] = .15532579626752470000E-02;

 s[ 1] = .81659383601264120000E-02;

 s[ 2] = .19989067515846230000E-01;

 s[ 3] = .36899976285362850000E-01;

 s[ 4] = .58719732103973630000E-01;

 s[ 5] = .85217118808615820000E-01;

 s[ 6] = .11611128394758690000E+00;

 s[ 7] = .15107475260334210000E+00;

 s[ 8] = .18973690850537860000E+00;

 s[ 9] = .23168792592899010000E+00;

 s[10] = .27648311523095540000E+00;

 s[11] = .32364763723456090000E+00;

 s[12] = .37268153691605510000E+00;

 s[13] = .42306504319570830000E+00;

 s[14] = .47426407872234120000E+00;

 s[15] = .52573592127765890000E+00;

 s[16] = .57693495680429170000E+00;

 s[17] = .62731846308394490000E+00;

 s[18] = .67635236276543910000E+00;

 s[19] = .72351688476904450000E+00;

 s[20] = .76831207407100990000E+00;

 s[21] = .81026309149462140000E+00;

 s[22] = .84892524739665800000E+00;

 s[23] = .88388871605241310000E+00;

 s[24] = .91478288119138420000E+00;

 s[25] = .94128026789602640000E+00;

 s[26] = .96310002371463720000E+00;

 s[27] = .98001093248415370000E+00;

 s[28] = .99183406163987350000E+00;

 s[29] = .99844674203732480000E+00;

w[ 0] = .39840962480827790000E-02;

w[ 1] = .92332341555455000000E-02;

w[ 2] = .14392353941661670000E-01;

w[ 3] = .19399596284813530000E-01;

w[ 4] = .24201336415292590000E-01;

w[ 5] = .28746578108808720000E-01;

w[ 6] = .32987114941090080000E-01;

w[ 7] = .36877987368852570000E-01;

w[ 8] = .40377947614710090000E-01;

w[ 9] = .43449893600541500000E-01;

w[10] = .46061261118893050000E-01;

w[11] = .48184368587322120000E-01;

w[12] = .49796710293397640000E-01;

w[13] = .50881194874202750000E-01;

w[14] = .51426326446779420000E-01;

w[15] = .51426326446779420000E-01;

w[16] = .50881194874202750000E-01;

w[17] = .49796710293397640000E-01;

w[18] = .48184368587322120000E-01;

w[19] = .46061261118893050000E-01;

w[20] = .43449893600541500000E-01;

w[21] = .40377947614710090000E-01;

w[22] = .36877987368852570000E-01;

w[23] = .32987114941090080000E-01;

w[24] = .28746578108808720000E-01;

w[25] = .24201336415292590000E-01;

w[26] = .19399596284813530000E-01;

w[27] = .14392353941661670000E-01;

w[28] = .92332341555455000000E-02;

w[29] = .39840962480827790000E-02;

int n=30;

double z=0;

double x,y;

for(i=0;i<n;i++)

{

x=(b+a)/2.0+(b-a)/2.0*s[i];

y=fi.f(x);

z+=(b-a)/2*w[i]*y;

}

for(i=0;i<n;i++)

{

x=(b+a)/2.0+(b-a)/2.0*(-s[i]);

y=fi.f(x);

z+=(b-a)/2.0*w[i]*y;

}

return z;

}

}

 

4. H5AL2.java programı alıştırma 3 de verilen turev ve integral sınıflarını konsol ortamında kullanmaktadır. Programın inceleyiniz.

 

Program 5.8 H5AL2.java

 

import java.io.*;

import H5AL1;

 

class f1 extends fx

{

  double f(double x)

  {

  return x*x;

  }

}

 

class f2 extends fx

{

  double f(double x)

  {

  return Math.sin(x);

  }

}

 

 

public class H5AL2

{

  public static void main(String args[]) throws IOException

  {

  f1 b1;

  b1=new f1();

  System.out.println("Integral : "+H5AL1.integral(b1,0.0,1.0));

  System.out.println("Turev    : "+H5AL1.turev(b1,1.0));

  f2 b2;

  b2=new f2();

  System.out.println("Integral : "+H5AL1.integral(b2,0.0,Math.PI));

  System.out.println("Turev    : "+H5AL1.turev(b2,Math.PI));

}

}

 

 

5. H5O2 :

abstract class fxi
{
  abstract double f(double x[]);
}

 

tanımını ve H5AL1 sınıfındaki turev metotuna H5O2 sınıfında

public static double turev(fx fi,double x)

gerekli değişiklikleri yaparak

public static double turev(fxi fi,double x[],int i)

metotunu oluşturunuz ve i'inci x değeri için denklemin türevini hesaplayınız.
(      dfi(x[])/dxi türevini hesaplayınız. )

 

Program 5.9 H5O2.java

 

//abstract sinif ve boyutlu değişkenler odevi

 

abstract class fxi

{

  abstract double f(double x[]);

}

 

public class H5O2

{

public static double turev(fxi fi,double x[],int k)

{

// bu metot ninci dereceden bir fonksiyonun t�revini hesaplar

// metotun hata miktari h0 and n degiskenlerinin degisimi ile

// degistirilebilir. fonksiyon girisi fxi abstract s�n�f� �zerinden

// yapilmalidir.

// Bu problem boyutlu de§iskenerin kullan�lmasi ile ilgili de bir

// ornektir.

double h0=0.0256;

int i,m;

int n=7;

//basit bir fonksiyonun t�revi

double T[][];

T=new double[n][n];

double h[];

h=new double[n];

for(i=0;i<n;i++)

{

  h[i]=0;

  for(int j=0;j<n;j++)

    T[i][j]=0;

}

h[0]=h0;

double r=0.5;

for( i=1;i<n;i++)

{

h[i]=h0*Math.pow(r,i);

}

 

for(i=0;i<n;i++)

{

double temp=x[k];

x[k]=x[k] + h[i];

double fiP=fi.f(x);

x[k]=temp - h[i];

double fiM=fi.f(x);

x[k]=temp;

T[i][0]=( fiP - fiM)/(2.0*h[i]);

}

for(m=1;m<n;m++)

{

  for(i=0;i<n-m;i++)

  {

  T[i][m]=(h[i]*h[i]*T[i+1][m-1] - h[i+m]*h[i+m]*T[i][m-1])/

          (h[i]*h[i]- h[i+m]*h[i+m]);

  }

}

double xx=T[0][n-1];

return xx;

}

 

public static double integral(fxi fi,double x[],int k, double a,double b)

{

//gauss-legendre denklemini kullanarak integral hesaplama

//integral(x[k]=a dan x[k]=b ye kadar fonksiyon fi(x), x=x[0]..x[k]..x[n]

//

 double s[],w[];

  double tempxk=x[k];

  int i;

 s=new double[30];

 w=new double[30];

 s[ 0] = .15532579626752470000E-02;

 s[ 1] = .81659383601264120000E-02;

 s[ 2] = .19989067515846230000E-01;

 s[ 3] = .36899976285362850000E-01;

 s[ 4] = .58719732103973630000E-01;

 s[ 5] = .85217118808615820000E-01;

 s[ 6] = .11611128394758690000E+00;

 s[ 7] = .15107475260334210000E+00;

 s[ 8] = .18973690850537860000E+00;

 s[ 9] = .23168792592899010000E+00;

 s[10] = .27648311523095540000E+00;

 s[11] = .32364763723456090000E+00;

 s[12] = .37268153691605510000E+00;

 s[13] = .42306504319570830000E+00;

 s[14] = .47426407872234120000E+00;

 s[15] = .52573592127765890000E+00;

 s[16] = .57693495680429170000E+00;

 s[17] = .62731846308394490000E+00;

 s[18] = .67635236276543910000E+00;

 s[19] = .72351688476904450000E+00;

 s[20] = .76831207407100990000E+00;

 s[21] = .81026309149462140000E+00;

 s[22] = .84892524739665800000E+00;

 s[23] = .88388871605241310000E+00;

 s[24] = .91478288119138420000E+00;

 s[25] = .94128026789602640000E+00;

 s[26] = .96310002371463720000E+00;

 s[27] = .98001093248415370000E+00;

 s[28] = .99183406163987350000E+00;

 s[29] = .99844674203732480000E+00;

w[ 0] = .39840962480827790000E-02;

w[ 1] = .92332341555455000000E-02;

w[ 2] = .14392353941661670000E-01;

w[ 3] = .19399596284813530000E-01;

w[ 4] = .24201336415292590000E-01;

w[ 5] = .28746578108808720000E-01;

w[ 6] = .32987114941090080000E-01;

w[ 7] = .36877987368852570000E-01;

w[ 8] = .40377947614710090000E-01;

w[ 9] = .43449893600541500000E-01;

w[10] = .46061261118893050000E-01;

w[11] = .48184368587322120000E-01;

w[12] = .49796710293397640000E-01;

w[13] = .50881194874202750000E-01;

w[14] = .51426326446779420000E-01;

w[15] = .51426326446779420000E-01;

w[16] = .50881194874202750000E-01;

w[17] = .49796710293397640000E-01;

w[18] = .48184368587322120000E-01;

w[19] = .46061261118893050000E-01;

w[20] = .43449893600541500000E-01;

w[21] = .40377947614710090000E-01;

w[22] = .36877987368852570000E-01;

w[23] = .32987114941090080000E-01;

w[24] = .28746578108808720000E-01;

w[25] = .24201336415292590000E-01;

w[26] = .19399596284813530000E-01;

w[27] = .14392353941661670000E-01;

w[28] = .92332341555455000000E-02;

w[29] = .39840962480827790000E-02;

int n=30;

double z=0;

double y;

for(i=0;i<n;i++)

{

x[k]=(b+a)/2.0+(b-a)/2.0*s[i];

y=fi.f(x);

z+=(b-a)/2*w[i]*y;

}

for(i=0;i<n;i++)

{

x[k]=(b+a)/2.0+(b-a)/2.0*(-s[i]);

y=fi.f(x);

z+=(b-a)/2.0*w[i]*y;

}

x[k]=tempxk;

return z;

}

}

 

6 . Program 5.10 da verilen polar sınıfını inceleyiniz. Polar sınıfının kompleks sınıfıyla oldukça benzer olduğunu gözlemleyebilirsiniz. Bu iki sınıfın temel özelliklerinden yararlanan abstact bir sınıf oluşturunuz, bu sınıfın alt sınıfları olarak polar ve kompleks sınıflarını yeniden tanımlayınız. Bir örnek programda abstract sınıf üzerinden polar ve kompleks sınıfları çağırarak kullanınız.

 

Program 5.10 Polar sınıfı tanımı Polar.java

 

public class polar

{

//duzlemde tanimlanmis polar koordinat sistemi

 

protected double R,teta;

 

public polar()

{

R=0;

teta=0;

}

 

public polar(double Ri,double tetai)

{

R=Ri;

teta=tetai;

}

 

public polar(polar y)

{

R=y.ROku();

teta=y.tetaOku();

}

 

public void RGir(double Ri)

{

R=Ri;

}

 

public void tetaGir(double tetai)

{

teta=tetai;

}

 

 

public void polarGir(double Ri,double tetai)

{

R=Ri;

teta=tetai;

}

 

public void kartesienGir(double xi,double xj)

{

R=Math.sqrt(xi*xi+xj*xj);

teta=Math.atan2(xj,xi);

}

 

public double ROku()

{

return R;

}

 

public double tetaOku()

{

return teta;

}

 

public double xi()

{

return R*Math.cos(teta);

}

 

public double xj()

{

return R*Math.sin(teta);

}

 

public void topla(polar y)

{

 kartesienGir((xi()+y.xi()),(xj()+y.xj()));

}

 

 

public void fark(polar y)

{

  kartesienGir((xi()-y.xi()),(xj()-y.xj()));

}

 

public polar polarOku()

{

return this;

}

 

public boolean esittir(polar v)

{

boolean b=((R==v.ROku())&&(teta==v.tetaOku()));

return b;

}

 

public boolean buyuktur(polar v)

{

  return (this.R>v.ROku());

}

 

public boolean kucuktur(polar v)

{

  return (this.R<v.ROku());

}

 

public String toString()

{

 return ""+R+"*exp("+teta+"i) ";

}

}


<< index        < bölüm 4         > bölüm 6          bölüm başı