面向对象编程的三大特性

封装

  1. 该露的露,该藏的藏

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

  2. 封装(数据的隐藏)

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

  3. 记住这句话就够了:属性私有,get/set

    //类 private: 私有
    public class Student {//属性私有
    private String name;
    private  int age;
    private char sex;//提供一些可以操作这些属性的方法
    //提供一些public的get,set方法//get 获得这个数据
    public String getName(){return this.name;
    }//set 给这个数据设置值
    public void setName(String name){this.name = name;
    }//快捷键 Alt+Insert 自动生成get、set方法public int getAge() {return age;}public void setAge(int age) {if(age>0 && age <=120){this.age = age;}else{this.age = 3;//不合法的}}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}

public class Application {public static void main(String[] args) {Student s1 = new Student();s1.setName("jjlin");System.out.println(s1.getName());//jjlins1.setAge(9);System.out.println(s1.getAge());}}
  1. 封装的好处

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

继承

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

  2. extands的意思是“扩展”。子类是父类的扩展。

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

  4. 被final修饰的类不能被继承。

  5. 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。

    • 继承关系的俩个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。
    • 子类和父类之间,从意义上讲应该具有"is a"的关系.
    • 快捷键 Ctrl + H ,可以显示类之间的关系
    //先定义一个父类
    //在Java中,所有的类,都默认直接或或者间接继承object
    //Person一个类 :父类
    public class Person /*extends object*/ {/*四个修饰符1.public  方法用继承都用public2.protected3.default4.private  属性一般用private*/private  int money = 10_0000_0000;public void say(){System.out.println("说了一句话");}
    }public int getMoney() {return money;
    }public void setMoney(int money) {this.money = money;
    }
//后定义子类
//Student is 人 :派生类,子类
//子类继承了父类,就会拥有父类的全部方法
public class Student extends Person {}//Teacher is 人 :派生类,子类
public class Teacher extends Person {}
public class Application {public static void main(String[] args) {Student student = new Student();student.say();//说了一句话student.setMoney(10_0000); System.out.println(student.getMoney());//100000}
}
  1. object类

​ java中的所有类都直接或间接继承Object类

  1. super

    //定义一个父类
    public class Person /*extends object*/ {protected String name = "kuangshen" ;public void print(){System.out.println("Person");}
    }
    
    //定义一个子类
    public class Student extends Person {//快捷键 Ctrl + H   显示父类private String name = "qinjiang";public void print(){System.out.println("Student");}public void test1(){print(); //Studentthis.print(); //Studentsuper.print(); //Person}public void test(String name){System.out.println(name);//jjlinSystem.out.println(this.name);//qinjiangSystem.out.println(super.name);//kuangshen}
    
    //应用
    public class Application {public static void main(String[] args) {Student student = new Student();student.test("jjlin");student.test1();}
    }
    

    注意:请仔细分辨各个输出,理清super和this之间的关系。

    • 构造器的不同

      //父类
      public class Person {//一个类即使什么都不写,它也会存在个方法//显示的定义构造器public Person(){System.out.println("Person");}//有参构造:一旦定义 了有参构造。无参就必须显示定义public Person(String name){this.name = name ;}}
      
      //子类
      public class Student extends Person{public Student() {//super();是隐藏代码,默认是先调用父类的无参构造器再调用子类的构造器super(); // 隐藏代码:调用了父类的无参构造,调用父类的构造器,必领要在子类构造器的第一行System.out.println("Student无参执行了");}public Student(String name) {this .name = name ;}
      }
      
  • super注意点:

​ super调用 父类的构造方法,必须在构造方法的第一个

​ super 必须只能出现在子类的方法或者构造方法中!

​ super和 this 不能同时调用构造方法!

​ Vs this:

​ 代表的对象不同:
​ this 本身调用者这个对象
​ super:代表父类对象的引用

​ 前提
​ this:没有继承也可以使用
​ super:只能在继承条件才可以使用

​ 构造方法
​ this() ; 本类的构造
​ super():父类的构造!

  1. 重写

    父类静态方法

    //子类
    public class A extends B {public static void test(){System.out.println("A==>test()");}
    }
    
    //父类
    public class B  {public static void test(){System.out.println("B==>test()");}
    }
    
    public class Application {public static void main(String[] args) {//方法的调用只和左边,定义的数据类型有关A a = new A();a.test();//A==>test()//父类引用指向了子类B b = new A();b.test();//B==>test()}
    }
    

​ 父类非静态方法

//父类
//重写都是方法的重写,和属性无关
public class B  {public void test(){System.out.println("B==>test()");}
}
//子类
public class A extends B{//Override就是方法的重写//快捷键Alt+Insert,选中Override可以自动生成,不用写@Override //注解:有功能的注释public void test() {super.test();}
}
public class Application {public static void main(String[] args) {/*静态方法和非静态方法区别很大静态方法:方法的调用只和左边,定义的数据类型有关非静态方法:重写,父类方法只能是public*/A a = new A();a.test();//B==>test()//父类引用指向了子类B b = new A();b.test();//B==>test()}}

重写:需要有继承关系,子类重写父类的方法!

  • 方法名必须相同
  • 参数列表列表必须相同
  • 修饰符:范围可以扩大但不能缩小:public>Protected >Default>private
  • 抛出的异常:范围,可以被缩小,但不能扩大: ClassNotFoundException --> Exception(大)
  • 重写,子类的方法和父类必要一 致;方法体不同!

为什么需要重写:

  • 父类的功能,子类不一定需要, 或者不一定满足!

    比如,把子类的方法重写一次,变为

    //子类
    public class A extends B{public void test(){System.out.println("A==>test()");}}
    //父类
    //重写都是方法的重写,和属性无关
    public class B  {public void test(){System.out.println("B==>test()");}}
    public class Application {public static void main(String[] args) {//方法的调用只和左边,定义的数据类型有关A a = new A();a.test();//A==>test()//父类引用指向了子类B b = new A();b.test();//A==>test()}}
    

    注意与上述例子输出的不同,一个是直接继承了父类的方法,输出B==>test(),而子类方法重写之后,输出的是A==>test()

  • Alt +Insert ;---->override;

    多态

  1. 即同一方法可以根据发送对象的不同而采用多种不同的行为方式。

  2. 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多

  3. 多态存在的条件

    • 有继承关系

    • 子类重写父类方法

    • 父类引用指向子类对象

    • 注意:多态是方法的多态,属性没有多态性。

      //父类
      public class Person {public void run(){System.out.println("run");}
      }
      
      //子类
      public class Student extends Person {@Overridepublic void run() {System.out.println("son");;}public void eat(){System.out.println("eat");}
      }
      
      public class Application {public static void main(String[] args) {//一个对象的实际类型是确定的//new Student();//new Person();//可以指向的引用类型就不确定了,比如父类的引用可以指向子类//Student 子类型,能调用的方法都是自己的或者继承父类的Student s1 = new Student();//Person 父类型,虽然可以指向子类,但是不能调用子类独有的方法Person s2 = new Student();Object s3 = new Student();//对象能执行哪些方法,主要看对象左边的类型,和右边关系不大s1.run();//son, 子类重写了父类的方法,执行的是子类的方法s2.run();//sons1.eat();}}
  4. 多态注意事项:

    • 多态是方法的多态,属性没有多态
    • 父类和子类,有联系 。如果类型转换异常!,就会报错ClassCastException!
    • 存在条件: 有继承关系,方法需要重写,父类引用指向子类对象! Father f1 = new Son();如果子类重写了父类的方法,父类引用如果指向了子类对象,执行的就是子类重写的方法。
    • 不能进行多态的方法:
      • static 方法,属于类,它不属于实例
      • final常量;
      • private 方法;
  5. instanceof:(类型转换)引用类型, 判断一个对象是什么类型~,可以判断两个类之间是否存在父子关系

    //父类
    public class Person {public void run(){System.out.println("run");}
    }
    
    //子类1
    public class Student extends Person {public void go(){System.out.println("go");}
    }
    
    //子类2
    public class Teacher extends Person {}
    
    public class Application {public static void main(String[] args) {//Object > String//Object > Person > Teacher//Object > Person > StudentObject object = new Student();//System.out.println(X instanceof Y); //能不能编译通过,看是否存在父子关系System.out.println(object instanceof Student); //trueSystem.out.println(object instanceof Person); //trueSystem.out.println(object instanceof Object); //trueSystem.out.println(object instanceof Teacher); //falseSystem.out.println(object instanceof String); //falseSystem.out.println("================================");Person person = new Student();System.out.println(person instanceof Student); //trueSystem.out.println(person instanceof Person); //trueSystem.out.println(person instanceof Object); //trueSystem.out.println(person instanceof Teacher); //false// System.out.println(person instanceof String); //编译就已经报错System.out.println("================================");Student student = new Student();System.out.println(student instanceof Student); //trueSystem.out.println(student instanceof Person); //trueSystem.out.println(student instanceof Object); //true//System.out.println(student instanceof Teacher); //编译就已经报错// System.out.println(person instanceof String); //编译就已经报错}}
  6. 转换

    • 父类转子类

      public class Application {public static void main(String[] args) {//类型之间的转化: 父 -----> 子 需要向下强制转换//父                子Person obj = new Student();//Student 将这个obj对象强制转换为Student类型,就可以使用Student类型的方法了((Student) obj).go();}}
      
    • 子类转父类

      public class Application {public static void main(String[] args) {//子类转换为父类,可以直接转换,但可能会丢失自己本来的一些方法Student student = new Student();student.go();Person person = student;//person.go();  //  person丢失了go方法}}
      
      /*
      子转父:向上转型,直接转,但会丢失子类中原本可以直接调用的特有方法
      父转子:向下转型,需要强制转换*/
      

    总结

    • 父类引用指向子类的对象
    • 把子类转换为父类,向上转型;
    • 把父类转换为子类,向下转型;强制转换
    • 方便方法的调用,减少重复的代码!j简洁
    • 封装、继承、多态! 抽象类,接口

面向对象编程的三大特性相关推荐

  1. 【Java】《Java面向对象编程的三大特性》阅读笔记

    前言 偶然读到这篇文章(<Java面向对象编程的三大特性>),想来这也算论文?这种还不满网络都是?读罢觉得写得还真不错,这里以我愚见,简单点评一二,不足之处还望指教. 阅读笔记 笔记1 文 ...

  2. Go面向对象编程的三大特性

    Go面向对象编程的三大特性 1.基本介绍 Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OOP语言不一样. 2.面向对象编程思想-抽象 抽象: 在定义一个结构体类型时,实 ...

  3. python面向对象编程的三大特性_Python面向对象总结及类与正则表达式详解

    Python3 面向对象 -------------------------------------------------------------------------------- 一丶面向对象 ...

  4. Java 面向对象编程的三大特性——封装、继承、多态

    一.类和对象 1. 首先,什么是对象呢? 对象简单的来说就是一个实物,比如一部 iPhone X 手机,它就是对象.它的屏幕.内存等就是它的属性. 手机能够打电话,发短信,这个功能就是它的方法. 2. ...

  5. Python3面向对象编程的三大特性 封装、继承、多态

    1.封装 封装:将数据与具体操作的实现代码放在某个对象内部,使这些代码的实现细节不被外界发现,外界只能通过接口使用该对象,而不能通过任何形式修改对象内部实现,正是由于封装机制,程序在使用某一对象时不需 ...

  6. 面向对象编程及其三大特征(JAVA)

    面向对象编程及其三大特征(JAVA) 一.面向对象编程介绍: 面向过程与面向对象: 面向对象的本质: 二.面向对象编程的三大特征: 封装: 封装的概念: 封装的优点: 封装举例(Person类) 继承 ...

  7. 【并发编程】并发编程的三大特性

    并发编程的书籍都会讲到并发编程的三大特性,这是并发编程中所有问题的根源,我们只有深刻理解了这三大特性,才不会编写出漏洞百出的并发程序. 基本概念 1.原子性,所有操作要么全部成功,要么全部失败. 2. ...

  8. day31 Pyhton 面向对象的基础 三大特性

    一.内容回顾 封装 1.概念 笔记 2.__名字 在类的外部就不能用了 3.私有化的 不能被子类继承,也不能在其他任何类中调用 三个装饰器方法(装饰类中的方法) 1.不被修饰的  普通方法,会使用对象 ...

  9. 韩顺平php视频笔记70 面向对象编程的三大特征1 抽象 封装

    php面向对象编程的三大特征 ① 封装 ② 继承 ③ 多态 class Account { public $blance; public $no; public function qun(){ } p ...

最新文章

  1. 诺奖团队最新研究:独居太久容易睡眠不足、暴饮暴食 | Nature
  2. mysql 安装 运维_MySQL自动化运维之安装篇
  3. # CF1572B Xor of 3(构造)
  4. tensorflow入门_TensorFlow法律和统计入门
  5. jquery.min.js一引入到工程中显示红叉,或其他.js文件显示红叉
  6. hadoop--MapReduce概述
  7. 计算机表演赛vr创意大赛,计算机表演赛新增VR创意大赛
  8. insert into 时间_值得花点时间背记的out of有关短语
  9. cor软件免费下载_CDRX4软件免费版
  10. 三洋p6系列伺服电机说明书_苏州发那科伺服电机修理刹不住
  11. 三极管NPN和PNP导通条件
  12. SIRIUS更新日志|SIRIUS人脸识别更新日志|天狼星人脸识别更新日志
  13. Sigma Designs SMP8910媒体处理器的3DTV、蓝光和OTT体验
  14. python百度地图api经纬度_详解用Python调用百度地图正/逆地理编码API
  15. 诺基亚暗恋Android背后:WP增长是假象
  16. JS中字符串的创建、操作及其方法
  17. 中国发布域名系统基础软件 “红枫”
  18. Ubuntu卸载cuda10.0
  19. 【Lintcode】962. Condition String
  20. aragon19 Android App,DApp_dappcon19: 以太坊社区基金将与status和aragon一起开发以支持dapp...

热门文章

  1. ​酷炫二重奏:6个案例向你展示AI如何帮助金融技术发展
  2. Camtasia添加光标效果教程
  3. 2009年信息计算机在线考试,2009年计算机等级考试三级信息管理笔试试题4.doc
  4. 微信内容检测 msgSecCheck
  5. css中div阴影,圆形边角等的使用和案例
  6. SD存储卡被格式化,如何恢复里面的数据文件?
  7. 基于javaweb+jsp的酒店管理系统(java+SSM+jsp+mysql+maven)
  8. 微博粉丝个人信息爬取
  9. JavaFX + MySQL 学校管理系统
  10. Bellman方程求解