Java的三大特性
三大特性
- 封装
- 继承
- 多态
封装
为什么要封装
- 提高可重复利用性
- 提高数据的安全性,用户不可以直接接触成员遍历,而是通过自己定义的方法赋值,如getter/setter
- 隐藏实现细节,如用户赋值之后,方法都要加一,这些细节不需要用户知道
实现过程
定义两个实现类
public class Person2 {
public String name;
public Integer age;
@Override
public String toString() {
return "Person2{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Person {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age + 1;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class test {
public static void main(String[] args) {
Person2 p2 = new Person2();
p2.age = 2;
p2.name = "abc";
// 不可以隐藏细节
p2.age = p2.age + 1;
// 可以随意修改成员变量
p2.age.byteValue();
System.out.println(p2.toString());
Person p = new Person();
p.setAge(3);
p.setName("cba");
System.out.println(p.toString());
}
}/*
Person2{name='abc', age=3}
Person{name='cba', age=3}
*///:~
从例子中就可以体现到封装的用处了
继承
为什么要继承
以动物为例子,狗和猫都是动物,动物上的一些习性,它们也都会,所以就直接继承动物习性,不需要狗和猫都各自实现了。
- 提高代码的复用性,减少代码量
- 提高了类之间的耦合性
实现过程
以猫狗为例子
public class Animal {
private String name;
public Animal(String name){
this.name = name;
}
public void eat(){
System.out.println(name + "吃饭");
}
public void sleep(){
System.out.println(name + "睡觉");
}
}
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
@Override
public void eat() {
super.eat();
}
@Override
public void sleep() {
System.out.println("我不睡觉");
}
}
public class Dog extends Animal{
public Dog(String name) {
super(name);
}
@Override
public void eat() {
System.out.println("我不吃饭");
}
@Override
public void sleep() {
super.sleep();
}
}
public class test {
public static void main(String[] args) {
Dog dog = new Dog("狗");
dog.eat();
dog.sleep();
System.out.println("===============");
Cat cat = new Cat("猫");
cat.eat();
cat.sleep();
}
}/*
我不吃饭
狗睡觉
===============
猫吃饭
我不睡觉
*///:~
继承规则
- 子类拥有父类非 private 的属性、方法。
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
- Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类
多态
为什么要多态
同一个可以表现出不同的状态,大大增大了可扩展性
多态的规则
- 父类和子类之间一定要有继承关系
- 重写继承方法
- 向上转换或向下转换
实践
public class Animal {
private String name;
public Animal(String name){
this.name = name;
}
public void eat(){
System.out.println(name + "吃饭");
}
public void sleep(){
System.out.println(name + "睡觉");
}
}
...
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
@Override
public void eat() {
super.eat();
}
@Override
public void sleep() {
System.out.println("我不睡觉");
}
public void catchMouse(){
System.out.println("抓老鼠");
}
}
...
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void eat() {
System.out.println("我不吃饭");
}
@Override
public void sleep() {
super.sleep();
}
}
public class test {
public static void main(String[] args) {
/**
* 向上转型 父类->子类
*/
Animal a1 = new Cat("猫");
a1.eat();
a1.sleep();
/**
* catchMouse是Cat特有的,所以必须向下转型 子类->父类
*/
Cat a2 = (Cat)a1;
a2.catchMouse();
Animal d1 = new Dog("狗");
/**
* 报错是因为Dog和Cat之间不存在继承关系
*/
Cat d2 = (Cat)d1;
}
}/*
猫吃饭
我不睡觉
抓老鼠
Exception in thread "main" java.lang.ClassCastException: com.company.Features.polymorphism.Dog cannot be cast to com.company.Features.polymorphism.Cat
at com.company.Features.polymorphism.test.main(test.java:34)
*///:~
待续。。。
参考