学习内容:
面向对象的特性,封装、继承、多态。
重点归纳:
成员变量的定义:访问修饰符、数据类型、变量名。访问修饰符,private只能类内部使用,protected只能类内部和子类使用,public可以从任何地方访问。
方法:访问修饰符、返回类型、方法名、参数列表。以及构造函数。
1.封装:通过将属性设置为private私有,然后通过定义方法来查看或者修改属性,达到隐藏对象中不希望被外部直接访问的属性,只能用接口来交互。
2.继承:子类可以继承父类的所有属性和方法,也可以对子类进行扩展。例如Person是父类,Teacher也属于Person,Teacher可以继承Person。继承用extends来表示。
在子类的实现过程中,super代表父类,super()表示父类的构造函数,super.xxx表示父类的属性或方法,@Override表示重写父类的方法,用这个表示验证,防止出错。
3.抽象类:比较抽象的概念,比如Shape(并不是一种具体的图形),用abstract来声明,不能实例化,类中包含一些通用的属性和方法,抽象方法也用abstract,没有具体的实现,只是定义方法名称、参数和返回类型,由子类去实现。
4.多态:父类引用指向子类对象,如Shape myCircle = new Circle(5),double circleArea = myCircle.calculateArea();Shape myRectangle = new Rectangle(4, 6),
double rectangleArea = myRectangle.calculateArea();虽然方法名称相同,但实际调用的方法是根据对象的类型动态确定的。通俗来讲,这样就能在对象多的时候,知道父类是哪个,不至于混乱。
例题:
解:
点击查看代码
import java.util.Scanner;
abstract class Shape{
private String type;
public abstract double calculateArea();
public String GetType(){
return this.type;
}
}
class Rectangle extends Shape{
private double length;
private double width;
public Rectangle(double length, double width){
super.type = "Rectangle";
this.length = length;
this.width = width;
}
@Override
public double calculateArea(){
return length * width;
}
}
class Circle extends Shape{
private double radius;
public Circle(double radius){
super.type = "Circle";
this.radius = radius;
}
@Override
public double calculateArea(){
return 3.14 * Math.pow(radius, 2);
}
}
public class Main{
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
String info = sc.next();
if(info.equals("rectangle")){
String length = sc.next();
double l = Double.parseDouble(length);
String width = sc.next();
double w = Double.parseDouble(width);
Shape Rec = new Rectangle(l, w);
System.out.format("Rectangle area: %.2f\n", Rec.calculateArea());
}
else if(info.equals("circle")){
String radius = sc.next();
double r = Double.parseDouble(radius);
Shape Cir = new Circle(r);
System.out.format("Circle area: %.2f\n", Cir.calculateArea());
}
else{
break;
}
}
sc.close();
}
}