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中给方法已经重写
}
}
- java_封装、继承、Object、多态
- Object-C封装,继承,多态
- Object-C详细编程(二)—封装,继承,多态
- java_封装
- Java_封装
- JAVA_继承
- java_继承
- 黑马程序员---object-c知识点总结(一)封装,继承,多态
- 黑马程序员---object-c知识点总结(二)封装,继承,多态
- 黑马程序员---object-c知识点总结(三)封装,继承,多态
- 封装,继承,多态
- c# 封装 继承 多态
- 封装,继承,多态,接口
- 封装,继承,多态,接口
- 封装,继承,多态
- 继承,封装,多态
- 封装,继承,多态
- 封装,继承,多态
- 详解HBase架构原理及安装部署步骤
- 【LeetCode】House Robber 解题报告
- thinkphp命名空间总结案例
- 安装RTC 6.0.2杂记
- 【基础算法】插入排序
- java_封装、继承、Object、多态
- 不用scala运行wordcount
- mysqli、pdo操作mysql的写法
- 一起talk C栗子吧(第一百四十二回:C语言实例--文件操作:基于文件指针二)
- hdu 1021 Fibonacci Again
- 迁移Oracle数据到TimesTen
- C语言中do...while(0)的妙用
- java Object类
- 互联网产品需求的管理