oop三大特性:封装、继承、多态

时间:2021-09-01
本文章向大家介绍oop三大特性:封装、继承、多态,主要包括oop三大特性:封装、继承、多态使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

封装

追求“高内聚,低耦合”
高内聚:就是类的内部数据操作细节自己完成,不允许外部干涉;
低耦合:仅暴露少量的方法给外部使用。


封装(数据的隐藏)
通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。

属性私有 get/set


private:私有

//属性私有。  外部无法操作
public class Student{
  private String name;
  private int id;
  private char sex;
  
  //提供一些可以操作这些属性的方法!
  //提供一些public的get、set方法
  
  //get 获得这个数据
  public String getName(){
    return this.name;
  }
  
 //set 给这个数据设置值
  public void setName(String name){
    this.name=name;
  }
  
}
public static void main(String[] args){
  Student s1=new Student();
  

  s1.setName("cwj");
    s1.getName();//输出cwj
  
}

封装的作用

1.提高程序的安全性,保护数据
2.隐藏代码的实现细节
3.统一接口
4.系统可维护增加了


继承

继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。

extends的意思是“扩展”。子类是父类的扩展。

JAVA中类只有单继承,没有多继承!
(一个儿子只能有一个爸爸,但是一个爸爸可以有多个儿子)

继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等等。
继承关系的两个类,一个为子类(派生类),一个为父类(基类)。
子类继承父类,使用关键字extends来表示。
子类和父类之间,从意义上讲应该具有“is a”的关系。


public是公共的
父类中public类子类可以继承
private是私有的
父类中private类子类不可以继承

IDEA中control+h显示子类父类树状图


super

在子类中重写父类中的方法。 super.该方法名:直接调用父类中的该方法
私有的方法无法调用。

注意点:
1.super调用父类的构造方法,必须在构造方法的第一个
2.super必须只能出现在子类的方法或者构造方法中
3.super和this不能同时调用构造方法

VS this
代表的对象不同:
this:本身调用者这个对象
super:代表父类对象的应用
前提:
this:没继承也可以用
super:只能在继承的条件下才可以使用
构造方法:
this();本类的构造!
super();父类的构造!


方法重写

重写:需要有继承关系,子类重写父类的方法!
1.方法名必须相同
2.参数列表必须相同
3.修饰符:范围可以扩大。 public>Protected>Default>private
4.抛出的异常:范围可以被缩小,但不能扩大。

重写:子类的方法和父类要一致,方法体不同!

为什么要重写?
1.父类的功能,子类不一定需要,或者不一定满足!
control+return:override;

public class B{
  public void test(){
    System.out.println("B->test()");
  }
}
public class A extends B{
  //Override 重写
    public void test(){
    System.out.println("A->test()");
  }
}
public class Demo{
  //静态方法和非静态方法区别很大
  		//静态方法:方法的调用只和左边定义的数据类型有关,和重写无关
  //非静态:可重写
  public static void main(String[] args){
    //方法的调用只和左边,定义的数据类型有关
    A a=new A();
    a.test();//A
    
    //父类的引用指向了子类
    B b=new A();
    b.test();
  }
}
/*最后输出:
A->test()
A->test()*/

多态

即同一方法可以根据发送对象的不同而采用多种不同的行为方式
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多

父类的引用指向子类:

若子类和父类中有相同方法,子类重写了父类的方法,则执行子类重写的方法。
但是是父类的引用所以无法执行子类当中独有的方法

强制转换后可以使用。

多态注意事项:

1.多态是方法的多态,属性没有多态
2.父类和子类,有联系。类型转换异常! ClassCastException
3.存在条件:继承关系,方法需要重写,父类引用指向子类对象! Father f1=new Son()

无法重写的:
1.static 方法 属于类,它不属于实例
2.final 常量
3.private 方法

public class Person{
    public void run(){
    
  }
}
public class Student extends Person{
   public void run(){
    System.out.println("son");
  }
  public void eat(){
    System.out.println("eat");
  }
}
public static void main(String[] args){
  //一个对象的实际类型是确定的
  //new Student();
  //new Person();
  
  //可以指向的引用类型就不确定了:父类的引用指向子类
  Student s1=new Student();
  Person s2=new Student();
  //父类的引用指向子类:若子类和父类中有相同方法,子类重写了父类的方法,则执行子类重写的方法。
  //但是是父类的引用所以无法执行子类当中独有的方法
  
  Object s3=new Student();
  
  
  //能执行什么方法主要看左边的类型,和右边的对象关系不大
  s2.run();//子类重写了父类的方法,执行子类的方法
  
  s1.run();
  
  
}

instanceof操作

满足(父(子) instanceof 子(父))关系 则为true!反之为false

public static void main(String[] args){
  
  //Object>String 1
  //Object>Person>Teacher 2
  
  //Object>Person>Student  3
  Object object=new Student();
   //满足(父(子) instanceof 子(父))关系 则为true
     System.out.println(object instanceof Student);//ture
     System.out.println(object instanceof Person);//true
     System.out.println(object instanceof Object);//true
     System.out.println(object instanceof Teacher);//false走的是第2条线
     System.out.println(object instanceof String);//false走的是第1条线
  ---------------------------------------------------
  Person person=new Student();
  System.out.println(person instanceof Student);//true
  System.out.println(person instanceof Person);//true
  System.out.println(person instanceof Object);//true
  System.out.println(person instanceof Teacher);//false 走的是第2条线
 // System.out.println(person instanceof String);编译报错
  ----------------------------------------------------
      Student student=new Student();
  System.out.println(student instanceof Student);//true
  System.out.println(student instanceof Person);//true
  System.out.println(student instanceof Object);//true
 // System.out.println(student instanceof Teacher);编译报错同等级毫无关系
 // System.out.println(student instanceof String);编译报错
  
}

public static void main(String[] args){
  //类型之间的转化:父        子
  
  //高              低
  Person obj=new Student();
  //将这个对象obj转换为Student类型,我们就可以使用Student类型的方法了!
  //高转低。强制转换
  Student student = (Student)obj;
  ((Student)obj).go();//go为子类独有的方法 
}

1.父类引用指向子类的对象。
2.把子类转换为父类,向上转型:可能会丢失方法
3.把父类转换为子类,向下转型:强制转换
4.方便方法的调用,减少重复的代码!

原文地址:https://www.cnblogs.com/chenweijian/p/15213448.html