黑马程序员技术交流社区

标题: 自己总结的面相对象知识 [打印本页]

作者: tianyuting    时间: 2015-9-4 23:19
标题: 自己总结的面相对象知识

面向对象编程基础
类和对象
类:就是对现实生活中事物的描述。
对象:就是这类事物实实在在的存在的个体。new();
&&属性对应的是类中变量,行为对应的是类中的函数(方 法)。其实在定义类时就是在描述事物,就是在定义属性和行为。属性和行为共同为类中的成员。
3.1.1面向对象
1、匿名对象。
如:实名对象是 car c=new car();
C.num=4;
C.color=”red”;
匿名对象是new car();
可以简写上面的代码为:new car().num=4;
New car().color=”red”;
具体程序如下:
package km.com.fxw;

class CarDemo {

       
        public static void main(String[] args) {
        /*
                Car c=new Car();//实名对象
        c.num=4;
        c.color="red";
        c.run();
        /*
        new car();//匿名对象
        //简化程序代码
        new car().num=4;
        new car().color="red";
        new car().run();
        */

        }

}
匿名对象使用方式一:当对对象的方法只条用一次时,可以用匿名对象来完成。如果对一个对象进行多个成员调用,必须给给定对象起名。
匿名对象的使用方式二:可以将匿名对象作为实际参数进行传递。

3.2.5 访问权限
Public:设置没有限制的访问权限,其他类的方法都能访                                问。
Private:设置最强的访问权限,其他的类都不能访问。
Protected:只限于子类或者同一包中的类的方法能访问。
<default>:(无修饰,有好的)只允许同一包中类的方法                                        访问。
3.2.6 继承
:在java语言中,继承是通过扩展原有的类,声明新类来实现,扩展声明的新类称为子类,原有的类称为超类,简称(父类)。
***:在java语言中不支持多重继承,限定一个类只有一个超类。在子类声明中加入extends子句来指定超类。
格式例如:
Class 子类名 extends 超类名
{
类体
}
例如代码:
Class E extends D
{

}
/*
声明类E的超类是D,这里假定类D已经在某处声明,类声明时,缺少extends子句,未指定超类,则该类的超类是系统声明的类java.lang.Obiect.
*/
一、多态性。
package km.cn;

class Shape
{
float area()//抽象的几何形状,返回值一律为0.
{ return 0.0f;}
}



class Circle extends Shape//声明extends子句
{
        float R;
        Circle(float r)//类名与方法名相同。
        {R=r;}//参数变量与成员变量相等。
        float area()
        /*
         * 圆类重新定义求面积的方法,能正确求出圆的面积。
         *
         * */
        {return 3.1415926f*R*R;}
       
}





class Rectangle extends Shape
{
float W,H;
        Rectangle(float w,float h)
        {W=w;H=h;}
        float area()//长方形类也定义了重新求面积的方法,能正确的求出长方形的面积。
        {return W*H;}

}





public class Example3_11 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub

                Circle c;Rectangle r;
                c=new Circle(1.0f);
                r=new Rectangle(3.0f,4.0f);
               
                System.out.println("圆面积="+returnArea(c));
                System.out.println("长方形面积="+returnArea(r));
               
                }

        static float returnArea(Shape s)
        {
               
                return s.area();
               
        }
       
       
       
       
}

二、多层继承。
:继承声明的新类,又可被其他类再继承,从而构成多层继承。
package km.cn;

class day1 {

       
        public void start()
        {System.out.println("starting...");}
}

class Aircraft extends day1{
       
        public void fly()
        {System.out.println("fly...");}
}



class lesson extends Aircraft
{
public void whirl()
{System.out.println("whirling...");}
}


class work extends Aircraft
{
public void zoom()
{System.out.println("zooming...");}
}



//上述事例就是属于多层继承
三、多层继承中的方法调用顺序。
package km.cn;


class A{
       
        int a;
        A(int a)
        {this.a=a;System.out.println("Constructing A");}
}




class B extends A
{
int b;

B(int a,int b)

{
        super(a); this.b=b;System.out.println("Constructing B");}
}





class C extends B
{
int c;
C(int a,int b,int c)
        {
        super(a,b); this.c=c;System.out.println("Constructing C");
                }

}




class D extends C
{
int d;
D(int a,int b,int c, int d)
        {
        super(a,b,c);this.d=d;System.out.println("Constructing D");
        }
}









public class Example3_13 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub

               
                D obj=new D(1,2,3,4);System.out.println("对象obj的值:"+obj.a+","+obj.b+","+obj.c+","+obj.d);
               
                System.out.println("Main Program");
               
        }

}
四、final类、final方法、final变量。
:意思就是不能变的意思。在声明类之前用final修饰,声明类是final类,final类是不能被继承的类,即它不能再有子类。
Final class A{
..........
}
Final修饰方法,意思就是该方法不能被子类的方法覆盖。
Final iny f(int x,int y){
...........
}
用final修饰变量,意思是该变量是不能改变的的值。
Final int f=100;
局部变量在定义的时候可以暂时不设初值,但是已经初始化,以后就不能再改变。
五、abstract类和abstract方法。
Abstract称为抽象类。
抽象类只是声明一种模板,没有具体实现代码的类。只有它的子类才有可能是有实际意义的类。
*抽象类可以没有抽象方法,但是抽象方法一定有抽象类。
package km.cn;




abstract class Shape//抽象类
{
        int x,y;
       
        void MoveTo(int newx,int newy) {x=newx;y=newy;}

        Shape(int newx,int newy)   {x=newx;y=newy;}
       
        abstract void Draw();//抽象方法,没有实现
}





class Square extends Shape//继承的抽象类
{
         int len;//正方形边长。
         Square(int px,int py,int l)
         {
                 super(px,py);
         len=1;
         }

         void Draw()//超类抽象方法的具体实现
         {
                 
                 System.out.print("我是正方形,");
                 System.out.print("我的中心位置是:"+"("+x+","+y+"),");
                 System.out.println("我的边长是:"+len);
                 //x,y为中心,len为边长的正方形。
         }
}







class Circle extends Shape//继承抽象类
{
        int radius;//半径
        Circle(int px,int py,int r )   {super(px,py);radius=r;}
        void Draw()//超类抽象方法的具体实现
        {
                System.out.print("我是圆形,");
                System.out.print("我的中心位置是:"+"("+x+","+y+"),");
                System.out.print("我的半径是:"+radius);
                //x,y为圆心,半径为radius的圆。
        }
}







class ShapeDraw
{
void draw(Shape obj)
        {
        obj.Draw();//利用动态联编,按实际对象调用相应的Draw()方法。
       
        }
}






public class Page3_14 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub

               
                ShapeDraw sd=new ShapeDraw();
                Square s=new Square(10,10,10);
                Circle c=new Circle(30,30,5);
               
                sd.draw(s);//以s为实参调用sd的draw方法。
                sd.draw(c);//以c为实参调用sd的draw方法。
               
        }

}
六、关键字super.
子类隐藏了超类的成员变量或者覆盖了超类方法后,利用关键字super,子类方法可以引用超类的成员变量和被覆盖的方法。
package km.cn;


class A{
       
        int x;
        A(int inf){x=inf;}
        void method(){System.out.println("我是类A的方法!值是"+x);}
       
        int getX(){return x;}
       
}



class B extends A{//继承类A声明类B
       
        double x;
        B(int a,double b)
        {super(a);//调用类A的构造方法。
                x=b;
       
        }
        void method(){System.out.println("我是类B的方法!值是"+x);}
       
}







class C extends B {
       
        char x;
        C(int a,double b,char c){
               
                super(a,b);//调用类B的构造方法。
                x=c;
        }
       
       
       
       
        void method()
        {
                char chCx=x;//这里的x是类C定义的x.
                double dBx=super.x;//引用父类的成员变量,类B的x.
                int iAx=this.getX();//不能A.x,也不能用super.super.x
                super.method();//调用类B的method()方法。
                System.out.println("我是类C的方法!值是"+x);
               
                System.out.println("我获得的信息是:"+"chCx="+x+chCx+",dBx="+dBx+",iAx="+iAx);
               
               
        }
}






public class Example3_15 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub

        C c=new C(2,3.0,'C');       
               
               
                c.method();
               
        }

}

七、关机字this
:关键字this用来指对象自己,this作用有多种;例如:将对象自己作为参数,调用别的方法;当方法的局部变量隐藏成员变量时,利用this调用成员变量,在构造函数内调用另一构造函数等。
ClassB
{
Int b,c;
B(){this(2,3);}//构造函数内调用另一构造函数
B(int x,int y){b=x;c=y;}
}
八、is-a和has-a关系
:类A继承扩展类B,则子类A和超类B之间的关系就是is-a.
程序如下:
package km.cn;

class B{
       
        int b;
        B(int x){b=x;}
        void write(){System.out.println("这是来自类B的输出!");}
       
}

class A extends B{
       
        int a;
        A(int x,int y){
               
                super(x);
                a=y;
                write();
                System.out.println("我是子类A!"+"b="+b+",a="+a);
               
               
        }
       
}






public class Example3_16 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub

               
               
                A obj=new A(1,2);
        }

}






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2