JavaSE 面向对象OOP(上)

一、面向对象概述

1 面向过程&面向对象区别

  • 面向过程

    • 第一步做什么,第二步做什么…
    • 面向过程适合处理一些简单的问题。
  • 面向对象

    • 分类的思维模式,首先分类,随后逐个解决分类下的细节。
    • 面向对象适合处理负责的问题,适合多人协作的问题。
    • 以类的方式组织代码,以对象组织封装数据
  • 面向对象三大特性:封装、继承、多态

2 方法回顾+补充

  • 方法的定义

    • 修饰符
    • 返回类型
    • break: 跳出循环或switch, return:结束方法
    • 方法名:注意命名规范 见名知意
    • 参数列表:(参数类型,参数名) …
    • 异常抛出: 随后填坑。
  • 方法的调用
    • 静态方法
    • 非静态方法
    • 实参、形参
    • 值传递(Java)和引用传递 可查看我之前的blog,点击查看详情
    • this关键字

静态方法和非静态方法调用的补充案例:

package com.oop.demo01;
//该类内含静态方法与非静态方法
public class Student {//static 修饰的方法和类一起加载的//而非静态方法是在类实例化之后生成//静态方法public static void say(){System.out.println("Say!");}//非静态方法public void write(){System.out.println("Write!");}
}
package com.oop.demo01;
//该类为测试类
public class Demo02 {public static void main(String[] args) {//静态方法 static//调用方法:类名.方法名;Student.say(); //Say!//非静态方法 没有static//调用方法:对象类型 对象名 = new 对象类名; 使用实例对象操作方法;Student st = new Student();st.write();//Write!}
}

注意两种方法各自的调用方式!

3 类和对象

  • 类是一种抽象的数据类型,它是对某一类事物的整体描述/定义,但是并不能代表某个具体的事物。
  • 对象是类的实例。
  • 也可理解为:类是一个模版:抽象; 对象是一个具体的实例。

创建类和对象的案例:

package com.oop.demo02;//学生类 (属性+方法)
public class Student {//属性:字段/成员变量String name;//nullint age; //0//方法:public void study(){System.out.println(this.name+" is studying");}public void nostudy(){ System.out.println(this.name+" is not studing");}
}
package com.oop.demo02;//测试类:一个项目应该只有一个main方法
public class Application {public static void main(String[] args) {//类:抽象的,实例话//类实例化后会返回一个自己的对象//对象就是一个Student类的具体实例Student j = new Student();Student d = new Student();j.name = "Jever";j.age = 19;d.name = "Demut";d.age = 23;System.out.println(j.name);j.study();System.out.println(d.name);d.nostudy();}
}
//运行结果:
/*
运行结果:
Jever
Jever is studying
Demut
Demut is not studing*/

4 创建对象 <-构造器->

  • 构造器:

    • 和类名相同
    • 没有返回值
  • 作用:

    • new 本质是在调用构造器
    • 初始化对象的值
  • 注意:

    • 定义了有参构造之后,如果想使用无参构造,需要显示的定义一个无参的构造器。
  • 构造器案例:

    package com.oop.demo02;
    //Person类(此类仅包含属性与构造器)
    public class Person {String name;int age;//实例化初始值//无参构造器public Person(){}//有参构造器public Person(String name, int age){this.name = name;this.age = age;}
    }
    
    package com.oop.demo02;
    //测试类
    public class Application2 {public static void main(String[] args) {//使用有参量的构造器Person person = new Person("Jever",19);System.out.println(person.name);    //JeverSystem.out.println(person.age);     //19}
    }
    

5 创建对象内存分析

  • 代码如下:
package com.oop.demo03;
//Pet类  (属性+方法)
public class Pet {String name;int age;//无参构造会自动生成public void shout(){System.out.println("Shouting!");}public static void eat(){System.out.println("Eating");}
}
package com.oop.demo03;
//测试类 生成两实例对象,并进行操作
public class Application {public static void main(String[] args) {Pet dog = new Pet();dog.name =  "旺财";dog.age = 3;dog.shout();System.out.println(dog.name);System.out.println(dog.age);Pet cat = new Pet();Pet.eat();}
}
  • 该过程示意图如下:

二、面向对象三大特性

1 封装

  • 该露的露,该藏的藏

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

    • 通常应禁止直接方位一个对象中数据的实际表示,而是应通过操作接口来访问,这称为封装。
  • 属性私有,get/set(可在set中进行安全性的判断)

  • 封装的作用:

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

案例展示:

package com.oop.demo04;
//属性私有,get/set
public class Student {//以下属性私有,数据被封装private String name;  //姓名private int id;     //学号private char gender;  //性别private int age; //年龄 注意不可无限增长//提供一些可以操作私有属性的方法!//提供public 的get、set方法//get 获得这个数据public String getName(){return this.name;}public int getAge(){return this.age;}//set 给私有数据设置值public void setName(String name){this.name = name;}public void setAge(int age){//进行安全性判断if (age>110 || age<0){//不合法this.age = 0;}else {this.age = age;}}
}
package com.oop.demo04;
//测试类
public class Application {public static void main(String[] args) {Student s1 = new Student();s1.setName("Jever");System.out.println(s1.getName());s1.setAge(999);System.out.println(s1.getAge());}
}

2 继承

2.1 继承基础

  • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
  • 使用关键字extends(扩展)。子类是父类的扩展。
  • Java中类只有单继承,没有多继承。
  • 所有类默认继承object类。

继承案例:

package com.oop.demo05;
//Person类:父类
public class Person {//public//protected//default//privateprivate String name; //子类无法继承public void say(){System.out.println("I am saying!");}public void setName(String name) {this.name = name;}public String getName() {return name;}
}
package com.oop.demo05;
//学生类
public class Student extends Person{}
package com.oop.demo05;
//测试类
public class Application {public static void main(String[] args) {Student st = new Student();st.say();}
}

注意访问时方法权限的问题!

2.2 super详解

注意:

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

VS this:

  • 代表对象不同:

    • this: 调用本类对象;
    • super: 代表父类对象应用
  • 前提:

    • this:没有继承时也可以使用;
    • super:只能在继承条件下才可以使用。
  • 构造方法:

    • this():本类的构造;
    • super(): 父类的构造。

案例展示:

package com.oop.demo05;
//在Java中,所有的类都默认继承Object类。
//Person类:父类
public class Person {public Person(){System.out.println("Person无参构造器!");}protected String name = "Demut";public void print(){System.out.println("Person");}
}
package com.oop.demo05;
//学生类
public class Student extends Person{public Student(){//此处隐藏了super();//调用了父类的无参构造器,且调用父类的构造器语句必须在子类的第一行。super();System.out.println("Student无参构造器!");}private String name = "Jever";public void print(){System.out.println("Student");}public void test1(){System.out.println(this.name);//使用this访问本类中name  JeverSystem.out.println(super.name);//使用super访问父类中name  Demut}public void test2(){this.print(); //使用this访问本类中方法  Studentsuper.print(); //使用super访问父类中的方法  Person}
}
package com.oop.demo05;
//测试类
public class Application {public static void main(String[] args) {Student s = new Student();s.test1();s.test2();}
}
/*
测试结果:Person无参构造器!Student无参构造器!JeverDemutStudentPerson*/

2.3 方法重写

(父类的功能,子类不一定需要,或者不一定满足!故需要重写)

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

  1. 方法名必须相同
  2. 参数列表必须相同
  3. 修饰符:范围可以扩大但不能缩小: public -> protected -> default -> private
  4. 抛出异常:范围可以被缩小但不能扩大。(破洞只能越填越小)

重写中子类的方法和父类方法头一致;方法体不同!

  • 案例展示:

    package com.oop.demo05;
    //父类:A
    public class A {public static void test(){System.out.println("A=>test()");}public void test2(){System.out.println("A=>test2()");}
    }
    
    package com.oop.demo05;
    //子类:B
    public class B extends A{public static void test(){System.out.println("B=>test()");}@Override//重写public void test2() {System.out.println("B=>test2()");}
    }
    
    package com.oop.demo05;
    //测试类
    public class Application2 {//静态方法和非静态方法的区别很大!!!//重写与静态方法无关,只与非静态有关!public static void main(String[] args) {//方法的调用只和左边定义的数据类型有关。B b = new B();b.test();   //B=>test()//父类的引用指向了子类A a = new B();a.test();   //A=>test()b.test2();  //B=>test2()a.test2();  //B=>test2()}
    }
    

写在最后

热爱可抵岁月漫长!

To Demut and Dottie!

Day06 JavaSE面向对象OOP(上) (Object-Oriented Programming)相关推荐

  1. 面向对象编程(Object Oriented Programming)概念总结及延伸(一)

    1.介绍 笔者的梦想是成为一个架构师,但是要成为一个合格的架构师是相当不易的,它既需要丰富的项目经验也需要不断地吸取新的知识,而且在这过程中我们也要不断巩固基础知识.我也注意到了,现在主流的文章大都集 ...

  2. Java OOP(Object Oriented Programming)个人理解及总结

    面向对象编程(Object Oriented Programming,OOP,面向对象程序设计) 其三大特征:封装,继承,多态: 封装:解决数据的安全问题. 继承:解决代码的重用问题. 多态:解决程序 ...

  3. 夯实基础,彻底掌握js的核心技术(二):面向对象编程(Object Oriented Programming)

    单例设计模式(Singleton Pattern) 1. 单例模式解决的问题: 表现形式: Var obj = {xxx; xxx, - } 2. 作用: 把描述同一件事物的属性和特征进行" ...

  4. python三大特征六大原则_面向对象程序设计(Object Oriented Programming)的三大特性,六大原则...

    三大特性 封装.继承.多态性 拿简单工厂模式举例: namespace DesignMode_01 { // 计算基类 public class Operation { private double ...

  5. Object Oriented Programming面向对象编程

    OOP 面向对象编程( Object Oriented Programming)是一种 计算机编程 架构.OOP 的一条基本原则是 计算机程序是由单个能够起到子 程序作用的单元或 对象组合而成.OOP ...

  6. 面对对象编程(OOP, Object Oriented Programming)及其三个基本特性

    一千个读者,一千个哈姆雷特.对于面对对象编程,书上都会告诉我们它有三个基本特性,封装,继承,多态,但谈起对这三点的见解,又是仁者见仁智者见智,感觉还是得多去编程中体验把 . 面向对象编程(OOP, O ...

  7. Java SE 008 理解面向对象程序设计 (Inside Object Oriented Programming)

    Java SE 008 理解面向对象程序设计 (Inside Object Oriented Programming) 前言:此笔记为圣思园张龙老师讲述的java视频课程笔记,自己看视频学习时记录的, ...

  8. OOP(Object,Oriented Programming)

    1.面向对象概念 在学习面向对象之前,我们可以先了解一下面向过程.面向过程是一种思想,意思是我们要做任何事,都需要亲力亲为,强调的是过程. 面向对象也是一种编程思想,相对于面向过程,我们可以由原来问题 ...

  9. Python编程基础:第三十九节 面向对象编程Object Oriented Programming

    第三十九节 面向对象编程Object Oriented Programming 前言 实践 前言 到目前为止我们都是函数式编程,也即将每一个功能块写为一个函数.其实还有一种更常用的编程方式被称为面向对 ...

最新文章

  1. 科技|全球首款飞行汽车开始量产!下月开始预售,2023年后或可实现一键打“飞车”...
  2. python字典内存分析_Python减少字典对象占用的七成内存
  3. 处理外部信息(xml,html,js,shareObject)
  4. 发展中国家如何炼成发达国家?
  5. 獲取mysql字段的注释或描述
  6. List的Sort自定义排序实例
  7. 【机器学习、神经网络】拟合非线性函数y = x**2 - 2(部分问题未解决)
  8. RichContentLabel使用注意
  9. 苹果ipadmini1 主板 电路图 超清
  10. 小程序容器在一体化在线政务服务平台中的应用
  11. 密钥管理系统研究(一)
  12. wmv格式+java_Java调用ffmepg+mencoder视频格式转换(*)
  13. 性格类型之ISFP艺术家型——有爱心的艺术工作者
  14. VAR.P和VAR.S
  15. Java工程师找工作都有什么要求?
  16. 福州大学计算机科学非全,福大数计/软件学院2020年招收非全日制专业硕士研究生调剂方案...
  17. 论程序员成长中不可避免的选择,薪资与积累
  18. C语言基础:最简单的程序
  19. 「SequoiaDB巨杉数据库」Oma()概述2
  20. x64、x86_64、x64、AMD64

热门文章

  1. 华为NE40E安全防御体系结构
  2. ffmpeg命令行截取音频效率慢
  3. 与stem项目化学习关联
  4. 打开word时424错误
  5. 小服装店什么收银系统好用呢?
  6. 基础设施即代码工具Terraform的一些典型使用场景
  7. 四六级英语听力软件测试,12月四六级考试听力题答题技巧总结
  8. Modbus RTU协议说明
  9. windows 上帝模式
  10. 【机器学习基础】常见的9种距离度量方法,内含欧氏距离、切比雪夫距离等