面向对象的三大特性及其内存初分析
面型对象有三大特性即:继承、封装和多态。
继承:类是对对象的一种抽象,继承是对某一批类的抽象,从而实现更好的建模。继承的使用很好的提高了代码的复用性。子类继承父类,可以得到父类的全部属性和方法(除了父类构造器方法)。在java中只有单继承,在之前c++具有多继承,但是造成了代码的复杂性,在java中只允许单继承。但是不表不可以实现多继承(多继承的实现使用接口即可)。在java中所有类(没有父类的类)都是lang的子类。子类可以根据需求重写父类的相关方法。但是重写方法不能使用更严格的访问权限(private、default、protect、public)private只允许该类使用、default只允许该类和该包中使用(不写使用权限默认是default)、protect可以在default的基础上及其子类可以使用。public在所有类中都可以使用。子类在调用构造方法的时候第一句一定是调用父类的构造方法。(默认第一句是super();)可以不显示隐藏起来。
public class Animal {
public Animal() {
super();
System.out.println("I am an animal");
}
public void bark() {
System.out.println("叫声!!");
}
public static void main(String[] args) {
Animal brid =new brid();
brid.bark();
}
}
class brid extends Animal{
public brid() {
System.out.println("I am a brid");
}
@Override
public void bark() {
System.out.println("叽叽叽叽!!");
}
}
封装:封装一般是指封装属性和服务过程,暴露方法结构,封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。程序的设计一般遵循高内聚低耦合,高内聚就是类的内部数据操作细节自己完成不允许外部干涉,低耦合就是仅仅暴露少量的方法接口给外部使用。
public class Stutent {
private String name;
private int id;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void study() {
System.out.println("I am learning");
}
public void sayHello(){
System.out.println("HelloWord!!");
}
}
你想操作某一个student的对象里的属性不能直接操作只能通过其set方法才能操作,得到属性值也需要操作get方法才能得到。这就是封装。
多态:多态性是OOP中一个重要的特性,主要用来实现动态联编的,换句话说就是程序最终状态只有在执行过程中才决定而非编译期间就决定了,这对大型系统来说能提高系统的灵活性和扩展性。
多态的三个条件:父子继承关系、重写相关方法、父类引用指向子类对象。
相关例子:
public class Animal {
public Animal() {
super();
System.out.println("I am an animal");
}
public void bark() {
System.out.println("叫声!!");
}
public static void main(String[] args) {
Animal cat=new cat();
Animal brid =new brid();
cat.bark();
brid.bark();
}
}
class brid extends Animal{
public brid() {
System.out.println("I am a brid");
}
@Override
public void bark() {
System.out.println("叽叽叽叽!!");
}
}
class cat extends Animal{
public cat () {
System.out.println("I am a cat");
}
@Override
public void bark() {
System.out.println("喵喵喵");
}
}
第一父子继承关系:鸟和猫都继承了动物类,第二重写方法:子类的叫声都重写了父类的方法bark(),第三父类引用指向子类对象:cat、brid都是父类引用但是都指向了子类的对象。这样就很灵活,不同的动物都具有相同的属性(比如在animal类中添加属性breath这样所有的动物都继承了该属性。但是可以根据不同的需求重写部分方法。比如叫声不同就重写了相关的方法。使他们运行出来的教程不同。)
多态的内存分析。(重点)