BD-11-day08-封装继承

StringBuffer类和String类的区别:简单来说就是,String类的创建之后,它的值就不能修改,StringBuffer类的值可以修改。用的时候就这个区别。

封装:对于类中需要保护数据,不想让外界直接访问或修改时,成员变量用private保护,防止其他类直接访问修改,外类要访问成员变量时,需要用get,set方法才能访问。

好处:

继承:子类继承父类(就是在父类已有的内容情况下,增加自己的成员和方法)。

java单继承特点,只能有一个父类。父类可以有多个子类。在子类中,可以用super.方法名访问没有被子类重写的方法。

子类只能继承父类中非私有的成员 。

 ?  父类的引用可以指向子类的实例,但是,父类的引用无法访问子类中独有的成员 (这句话待解析)。

继承和封装是不是有点冲突,

疑问:一个类如果类成员全封装成private之后,不能有构造方法吗??

能有,但是不能继承私有。

题目:1   

建立一个人类(Person)和学生类(Student)功能要求:

A、 Person中包含4个保护型的数据成员name、address、sex、age分别为字符串,字符串,字符及整型。表示:姓名、地址、性别和年龄。一个四参构造方法,一个无参构造方法,及一个输出方法用于显示四种属性。 

B、 Student继承Person,并增加输出成员math、english存放数学和英语成绩。一个六参构造方法,一个两参构造方法,一个无参构造方法,重写输出方法用于显示全部六种属性.





package com.judy.demo;


public class PTest {
    public static void main(String[] args) {
        Person p1 = new Person();
        Person p2 = new Person("judy", "beijing", 'g', 20);
        p2.printPerson();
        Student stu1 = new Student();
        Student stu2 = new Student(88, 99);
        stu2.printStudent();
        Student stu3 = new Student("Tom", "beijing", 'b', 22, 95.5, 75.5);
        stu3.printStudent();
    }

}


class Person {
    protected String name;
    protected String address;
    protected char sex;
    protected int age;
    public int room = 122;//不是题目要求的变量,增加的,为了查看super的效果

    Person() {
        System.out.println("无参构造方法");
    }

    Person(String name, String address, char sex, int age) {
        this.name = name;
        this.address = address;
        this.sex = sex;
        this.age = age;
    }

    void printPerson() {
        System.out.println(name);
        System.out.println(address);
        System.out.println(sex);
        System.out.println(age);
    }

}

class Student extends Person {
    private double math;
    private double english;

    Student() {
        System.out.println("student的无参构造函数");
    }

    Student(double math, double english) {
        this.math = math;
        this.english = english;
    }

    Student(String name, String address, char sex, int age, double math, double english) {
        this.name = name;
        this.address = address;
        this.sex = sex;
        this.age = age;
        this.math = math;
        this.english = english;

    }

    void printStudent() {
        System.out.println(name);
        System.out.println(address);
        System.out.println(sex);
        System.out.println(age);
        System.out.println(math);
        System.out.println(english);
        System.out.println(super.room);

    }
}


super.方法:在子类中想调用父类中的方法或属性,在子类中需要调用父类中没有被重写的方法时,需要使用super.方法调用 。

上列代码查看输出效果。能看出无参构造函数,super,和未赋值时成员变量的初始值效果。

 

题目2   

定义类Shape表示一般二维图形。Shape具有抽象方法area和perimeter,分别计算形状的面积和周长。试定义一些二维形状类(如矩形、三角形、圆形等),这些类均为Shape类的子类。



package com.judy.demo;


public class HelloWorld {
    public static void main(String[] args) {
        Rectangle rectangle = new Rectangle(5, 6.2);
        Circle circle = new Circle(6.4);
        double r1 = rectangle.area();
        double r2 = rectangle.primeter();
        double c1 = circle.area();
        double c2 = circle.primeter();
        System.out.println(r1);
        System.out.println(r2);
        System.out.println(c1);
        System.out.println(c2);
    }

}

abstract class Shape {
    public abstract double area();

    public abstract double primeter();
}

class Rectangle extends Shape {
    private double length;
    private double width;

    Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    public double area() {
        return length * width;
    }

    public double primeter() {
        return 2 * (length + width);
    }
}

class Circle extends Shape {
    double radius;

    Circle(double radius) {
        this.radius = radius;
    }

    public double area() {
        return Math.PI * radius * radius;
    }

    public double primeter() {
        return 2 * Math.PI * radius;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42474930/article/details/81262991