⒈封装
面向对象的封装把对象的属性和方法组合在一起,统一提供对外访问权限,封装可以将对象的使用者和设计者分开。
一般情况下,属性用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中给方法已经重写 } } |