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;
}
}