java_封装、继承、Object、多态

来源:互联网 发布:芯漾蚕丝皇后面膜知乎 编辑:程序博客网 时间:2024/04/28 13:18

⒈封装

面向对象的封装把对象的属性和方法组合在一起,统一提供对外访问权限,封装可以将对象的使用者和设计者分开。

一般情况下,属性用private修饰,外部访问属性使用set/get方法(属性访问器)

只有get无set,则属性只读

只有set无get,则属性只写,示例代码见附录1

 

⒉继承

Java中继承使用extends关键字是实现,子类继承父类的所有属性和方法(构造方法除外)

不同修饰符下的属性和方法的访问权限

内容

public

protected

缺省

private

同类访问

同包其他类访问

×

同包子类访问

×

不同包子类访问

×

×

不同包非子类访问

×

×

×

子类继承父类可以重载父类的方法

子类初始化时调用父类不带参的构造方法,示例代码见附录2

子类使用super,指定使用父类的构造方法初始化父类,示例代码见附录2

 

⒊Object类

当一个类没有使用extends显式地继承其他类的时候,该类默认继承了Object类

能被外界访问的Object类的主要成员:

返回类型

方法名

方法说明

Object

clone()

创建并返回此对象的一个副本

boolean

equals(Object obj)

指示其他某个对象是否与此对象“相等”(地址)

若要比较大小,可重写该方法

void

finalize()

当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法

int

hashCode()

返回该对象那个的哈希码值

String

toString

返回该对象的字符串表示

System.out.println()输出一个对象时,首先调用该对象的toString()方法,把调用的结果输出,Object类的toString方法默认输出的是该对象在内存中的地址。可以在子类中重写toString方法。示例代码见附录3。

 

⒋多态

把子类的对象赋值给父类,用父类的引用调用方法的时候,具体执行方法的是子类的对象

示例代码见附录3

父类对象赋值给子类时,首先要进行类型转换

 

 

 

附录1

private String favourite; //爱好

public String getFavourite()

{

        return favourite;

}

public void setFavourite(String favourite)

{

        this.favourite = favourite;

}

 

附录2

Horse.java

public class Horse

{

        private String name;

        public Horse(String name)

        {

                this.name = name;

                System.out.println("Horse中带参数name的构造方法");

        }

        public Horse()

        {

                System.out.println("Horse中不带参数的构造方法");

        }

        public String getName()

        {

                return name;

        }

        public void setName(String name)

        {

                this.name = name;

        }

        public void eat()

        {

                System.out.println(name + "在吃饭......");

        }

}

WhiteHorse.java

public class WhiteHorse extends Horse

{

        public WhiteHorse()

        {

                System.out.println("WhiteHorse中不带参数的构造方法......");

        }

        public WhiteHorse(String name)

        {

                //this.name = name;会出错 父类的私有成员子类不可访问

                this.setName(name);

                System.out.println("WhiteHorse中带参数name的构造方法......");

        }

        public WhiteHorse(int number)

        {

                super("白马"+number); //指定父类的构造方法初始化父类

                System.out.println("WhiteHorse中带参数的构造方法......");

        }

        public void eat(String food)  //重载父类中的eat()方法

        { 

                System.out.println(this.getName() + "在吃饭" + food);

        }

        public static void main(String[] args)

        {

                WhiteHorse wHorse1 = new WhiteHorse(); //先调用父类Horse的无参构造方法,再调用子类WhiteHorse的无参构造方法

                wHorse1.setName("白马1"); //setName继承自父类

                wHorse1.eat();

                wHorse1.eat("草");

                WhiteHorse wHorse2 = new WhiteHorse("白马2"); //先调用父类Horse的无参构造方法,再调用子类WhiteHorse的带参构造方法

                wHorse2.eat();

                wHorse2.eat("草");

                WhiteHorse wHorse3 = new WhiteHorse(3); //先调用父类Horse的带参构造方法,再调用子类WhiteHorse的带参构造方法

                wHorse3.eat();

                wHorse3.eat("草");

        }

}

 

附录3

Shape.java

public class Shape

{

        //计算形状的面积

        public double area()

        {

                return 0.0;

        }

}

 

Circle.java

public class Circle extends Shape //圆

{

        private double radius; // 圆的半径

        public Circle()

        {

                super();

        }

        public Circle(double r)

        {

                super();

                this.radius = r;

        }

        public double area() //方法重写(override),与方法重载不同

        {

                double pi = 3.14159;

                return pi*radius*radius;

        }

        public double getRadius()

        {

                return radius;

        }

        public void setRadius(double radius)

        {

                this.radius = radius;

        }

}

 

Square.java

public class Square extends Shape  //矩形

{   

        private double width; //矩形的宽

        private double height; //矩形的高

        public Square() //构造方法

        {

                super();

        }

        public Square(double width, double height) //构造方法

        {

                super();

                this.width = width;

                this.height = height;

        }

        public double area() //重写方法area()

        {

                return width*height;

        }

        public void setWidth(double width)

        {

                this.width = width;

        }

        public double getWidth()

        {

                return width;

        }

        public void setHeight(double height)

        {

                this.height = height;

        }

        public double getHeight()

        {

                return height;

        }

public String toString() //方法toString重写

        {

                return "Square中的toString";

        }

}

 

Test.java

public class Test {

        public static double area(Shape shape)

        {

                double result = shape.area();

                if(shape instanceof Circle)  //instanceof判断一个对象是否是某各类的对象

                {

                        Circle c = (Circle)shape; //强制类型转换

                        System.out.println("圆的半径是:" + c.getRadius() + ",面积是:" + result);

                }

                else if(shape instanceof Square)

                {

                        Square s = (Square)shape;

                        System.out.println("矩形的宽是:" + s.getWidth() + ",高是:" + s.getHeight() + ",面积是:" + result);

                }

                return result;

        }

        public static void main(String[] args)

        {

                Shape shape1 = new Circle(3); //子类Circle对象赋值给父类对象shape1

                System.out.println("圆的面积是:" + shape1.area());  //此处父类引用shape1调用方法area(),具体执行方法的是子类的对象

                area(shape1);

                Shape shape2 = new Square(3,4); //子类Square对象赋值给父类对象shape2

                System.out.println("矩形的面积是:" + shape2.area());

                area(shape2);

              System.out.println(shape1); //调用对象shape1的toString()方法,该方法默认输出的是shape1对象在内存中的位置

                System.out.println(shape2); //调用对象shape1的toString()方法,Square中给方法已经重写

        }

}

0 0
原创粉丝点击