第1节 面向对象基础

一、面向对象思想

1.1 概述

   面向对象(Object Oriented)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段的产物。面向对象是相对于面向过程来讲的,指的是把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。

面向过程到面向对象思想层面的转变:

  • 面向过程关注的是执行的过程,面向对象关注的是具备功能的对象。

  • 面向过程到面向对象,是程序员思想上 从执行者到指挥者的转变。

此概念如果直接去理解的话可能会比较抽象,因为大家缺少对原始的面向过程的开发语言的了解,下面我们举一个栗子:

1.2 三大思想

面向对象思想从概念上讲分为以下三种:OOA、OOD、OOP

  1. OOA:面向对象分析(Object Oriented Analysis)

  2. OOD:面向对象设计(Object Oriented Design)

  3. OOP:面向对象程序(Object Oriented Programming)

1.3 三大特征

  1. 封装性:所有内容对外部不可见

  2. 继承性:将其他的功能继承下来继续发展

  3. 多态性:方法的重载本身就是一个多态性的体现

二、类与对象

2.1 概念与关系

   类表示一个  共性的  产物,是一个综合的特征,而对象,是一个  个性的  产物,是一个个体的特征。类必须通过对象才可以使用,对象的所有操作都在类中定义。

类由属性和方法组成:

  • 属性:就相当于人的一个个的特征

  • 方法:就相当于人的一个个行为,例如:说话、吃饭、唱歌、睡觉

2.2 类的定义格式

class 类名称{成员属性成员方法
}

注意:

  • 类必须编写在.java文件中。

  • 一个.java文件中,可以存在N个类,但是只能存在一个public修饰的类。

  • .java文件的文件名称,必须与public修饰的类名完全一致,否则会报错。

2.3 属性和方法

属性定义格式:数据类型 属性名;
属性定义并赋值的格式:数据类型 属性名 = 初始化值;方法定义格式:权限修饰符 返回值类型 方法名(形式参数列表) {//方法体return 返回值;}

2.4 对象的创建与使用

一个类想要真正的进行操作,则必须依靠对象,对象的定义格式如下:类名称 对象名称 = new 类名称();如果要想访问类中的属性或方法(方法的定义),则可以依靠以下的语法形式:访问类中的属性:  对象名.属性名;调用类中的方法:  对象名.方法(实际参数列表);

示例如下:

/*** class 类名{*     成员属性;*     成员方法;* }** 类必须编写在.java文件中。* 一个.java文件中,可以存在N个类,但是只能存在一个public修饰的类* .java文件的文件名称必须与public修饰的类名完全一致**/
public class classobject {public static void main(String[] args) {//创建对象的格式://类名 对象名 = new 类名();Person p = new Person();//对象属性赋值://格式:对象名.属性名p.name = "张三";p.age = 18;p.sex = '男';p.say();int sum = p.sum(100, 200);System.out.println(sum);}
}/*** 类就像是图纸*/
class Person{//属性 - 特征String name;int age;char sex;//方法 - 行为/*** 返回值类型 方法名称(形式参数列表) {*     方法体*     return 返回值;* }** 调用格式:* 对象名.方法名称(实际参数列表);*/void say() {System.out.println("自我介绍,我是"+name+",我的年龄:"+age+"我的性别:"+sex);}int sum(int x, int y) {return x + y;}//    void xxx() {//        if (true) {//            //return表示结束方法
//            return;
//        }
//        System.out.println("haha");
//    }
}
public class classobject2 {public static void main(String[] args) {Book b1 = new Book();Book b2 = new Book();b1.name = "三体";b1.info = "科幻小说";b2.name = "平凡的世界";b2.info = "纪实小说";b1.say();b2.say();}
}class Book {String name;String info;void say() {System.out.println("书名:"+name+",简介:"+info);}
}

2.5 创建对象内存分析

2.5.1 栈

   Java栈的区域很小,大概2M左右,特点是存取的速度特别快。栈存储的特点:先进后出存储速度快的原因:

    - 栈内存,通过“栈指针”来创建空间与释放空间,指针向下移动,会创建新的内存,向上移动,会释放这些内存

   这种方式速度特别快,仅次于PC寄存器,但是这种移动的方式,必须要明确移动的大小与范围。明确大小与范围是为了方便指针的移动,这是一个对于数据存储的限制,存储的数据大小是固定的,影响了程序的灵活性。由于不太灵活,所以把更大部分的数据存储到了堆内存中。

存储的内容有:

   **基本数据类型的数据**  以及 **引用数据类型的引用** 例如:
int a = 10;
Person p = new Person();

10存储在栈内存中,对象的引用p存储在栈内存中。

2.5.2 堆

存放的内容是:类的对象。

Java是一个纯面向对象语言,限制了对象的创建方式:所有类的对象都是通过new关键字创建,new关键字,是指告诉JVM,需要明确的去创建一个新的对象,去开辟一块新的堆内存空间。

优点:与栈内存相对,创建对象时,不必关注堆内存中需要开辟多少存储空间,也不需要关注内存占用时长。

堆内存中内存的释放是由GC(垃圾回收器)完成的。

垃圾回收器 回收堆内存的规则:

当栈内存中不存在此对象的引用时,则视其为垃圾,等待垃圾回收器回收。

例如:

Person p0 = new Person();
Person p1 = p0;
Person p2 = new Person();

2.5.3 方法区

存放的内容是:

  • 类信息

  • 静态的变量

  • 常量

  • 成员方法

方法区中包含了一个特殊的区域(常量池)(存储的是使用static修饰的成员)

2.5.4 PC寄存器

PC寄存器保存的是 当前正在执行的JVM指令的 地址

2.5.5 本地方法栈

保存本地(native)方法的地址。

给个例子:

   上述代码中,创建对象时,对象的引用(b1,b2)存放在栈内存中,另外在堆内存中开辟真正的空间用于存放对象的属性,而类的方法会存在方法区中。当b2=b1时,就是将b1内存放的地址值赋值给b2,那么b2也就指向了b1,堆内存中0x124位置的内容就没有引用了,后续会被GC回收。

三、构造方法

   在对象创建时,`Person p = new Person();`在Person右侧的小括号,其实就是在调用构造方法。

3.1 概述

作用 :用于对象初始化(个人理解比较像Python的__init__()函数)

执行时机 :在创建对象时,自动调用,如果类中没写,默认调用无参构造方法。

特点 :所有Java类中都会至少存在一个构造方法,如果一个类中没有明确的编写构造方法,则编译器会自动生成一个无参构造方法,构造方法中没有任何代码!(但是最好还是养成写的习惯)。

注意 :如果自行编写了任意一个构造器,则编译器不会再自动生成无参的构造方法。

3.2 定义格式

定义的格式:与普通方法基本相同,区别在于:方法名称必须与类名相同,没有返回值类型的声明!
例如:public class Demo3 {Person p = new Person();p = new Person();}class Person{public Person(){System.out.println("对象创建时,此方法调用");}}
public class constructorfunction {public static void main(String[] args) {Person2 p1 = new Person2("张三");p1.age = 18;p1.say();}
}class Person2 {String name;int age;Person2(String n) {name = n;}void say() {System.out.println("自我介绍,我是:"+name+",我的年龄:"+age);}
}

3.3 构造方法设计

  • 建议自定义无参构造方法 ,不要对编译器形成依赖,避免错误发生。

  • 当类中有非常量成员变量时,建议提供两个版本的构造方法,一个是无参构造方法,一个是全属性做参数的构造方法

  • 当类中所有成员变量都是常量或者没有成员变量时,建议不提供任何版本的构造。

四、方法的重载

4.1 概念

   一个类中定义的方法,是允许重载的。

满足下列要求的方法称之为重载:

  1. 方法名称相同;

  2. 参数列表长度 或 参数列表类型 或 参数类型顺序不同;

  3. 与返回值类型无关

    方法的重载,可以让我们在不同的需求下,通过传递不同的参数调用方法来完成具体的功能。
    
class Math{int sum(double x, int y) {return y;}int sum(int y, double x) {return y;}double sum(double x, double y) {return x + y;}
}

4.2 构造方法的重载

一个类可以存在多个构造方法:

参数列表的长度或类型不同 即可完成构造方法的重载。

作用 :构造方法的重载,可以让我们在不同的创建对象的需求下,调用不同的方法来完成对象的初始化。

public class constructor_overload {public static void main(String[] args) {Person3 p = new Person3("张三", 18);p.say();Person3 p2 = new Person3("李四");p2.say();}
}class Person3{Person3(String name2, int age2){name = name2;age = age2;}Person3(String name2) {name = name2;}String name;int age;void say() {System.out.println("自我介绍,姓名:"+name+",年龄:"+age);}
}

五、匿名对象

没有对象名称的对象,就是匿名对象。

匿名对象只能使用一次,因为没有任何的对象引用,所以将称为垃圾,等待被GC回收。只使用一次的对象可以通过匿名对象的方式完成,这一点在以后的开发中将经常被使用到。

public class Anonymousobject {/*** 匿名:  没有名字,相当于栈内存中没有创建引用,只在堆内存中开辟了空间* 使用完毕后,该对象就会被回收*/public static void main(String[] args) {//        Math2 m = new Math2();
//        int num = m.sum(100, 200);
//        System.out.println(num);int num = new Math2().sum(100, 200);System.out.println(num);}
}class Math2{int sum(int x, int y) {return x + y;}
}

JavaSE——面向对象基础(思想、类与对象、构造方法、重载、匿名对象)相关推荐

  1. Java_面向对象基础(类、对象、方法和构造函数)

    Java的面向对象基础(类.对象.方法和构造函数) 面向对象的基本概念 面向对象的设计思想 什么是类 什么是对象 类的定义 设计面向对象的例子 步骤一:设计动物这个类 步骤二:创建具体的动物 步骤三: ...

  2. 7 面向对象(成员变量和局部变量的区别,类作为形式参数的问题,匿名对象,封装,private关键字,this关键字,构造方法,类的初始化过程,static关键字)

    1:成员变量和局部变量的区别(理解) (1)在类中的位置不同 成员变量:类中方法外 局部变量:方法定义中或者方法声明上 (2)在内存中的位置不同 成员变量:在堆中 局部变量:在栈中 (3)生命周期不同 ...

  3. 面向对象【思想、概念、构造方法、构造代码块】

    面向对象[思想.概念.构造方法.构造代码块] 1.面向对象思想 1.1.概述 面向对象是相对于面向过程而言的,面向过程强调的是其功能,而面向对象则强调的是将功能封装成对象. 1.2.思想 (1)符合人 ...

  4. Java_Day6 构造方法、匿名对象、Scanner、Random、ArrayList

    构造方法 当一个对象创建时,构造方法用来初始化对象,给对象的成员变量赋值. 方法名和类名一致 无返回值 无论是否自定义构造方法,所以类都有构造方法,因为java会自动提供给我们一个无参构造方法.一旦自 ...

  5. 【C++学习】类和对象 | 友元 | 内部类 | 匿名对象 | 内存管理 | new

    目录 1. 友元 1.1 友元函数 1.2 友元类 2. 内部类 3. 匿名对象 4. 内存管理 5. C++的动态内存 写在最后: 1. 友元 1.1 友元函数 来看这段代码: #include & ...

  6. JAVASE面向对象基础

    概述 面向过程是一种自上而下的程序设计方法,主要思路专注于算法的实现 自上而下的设计方法,设计者用一个main函数概括出整个应用需要做的事情,然后把main方法拆解成不同的步骤,对应不同的函数 过程式 ...

  7. Java面向对象——基础1 类及类的成员

    目录 一.面向对象概要 1.1.面向过程和面向对象的对比 ​ 1.2面向对象的思想概述 1.3面向对象举例 二.类和对象 2.1 java类及类的成员 ​ ​ 2.1 类的语法格式 ​ 2.2 如何使 ...

  8. 类与对象、引用传递、封装、构造方法、匿名对象笔记

    类与对象 类与对象的基本概念  类:是抽象的概念集合,表示的是一个共性的产物,类中定义的是属性和行为(方法):(不能用)  对象:对象是一种个性的表示,表示一个独立的个体,每个对象拥有自己独立的属 ...

  9. Python基础:面向对象基础 (一) 类及其属性和魔法方法

    定义类,添加和获取对象属性 # 定义类 格式如下 # class 类名: # 方法列表# 新式类定义形式 # info 是一个实例方法,第一个参数一般是self,表示实例对象本身 class Hero ...

最新文章

  1. linux web高级编程,寒假学习 第16.17天 (linux 高级编程)
  2. dubbo下使用selectKey获取自增主键为0问题
  3. 如何在Github打造你的爆款开源项目
  4. 关于跨DB增量(增、改)同步两张表的数据小技巧
  5. OllyDbg捕捉MFC程序按钮事件
  6. php this指针的用法,C#_C#中this指针的用法示例,本文实例展示了C#中this指针的 - phpStudy...
  7. 数据库每日一题 2020.04.29
  8. Soul 网关源码阅读(三)请求处理概览
  9. [NVIDIA] Ubuntu 20.04 安装 nvidia-460 + cuda-11.2
  10. opencv contourArea() 计算面积(转)
  11. mysql事件【定时器】
  12. 运算符之前加加后加加的运算规则
  13. 企业微信标签在哪?如何设置?
  14. vue 刷新、重新加载app
  15. vue多页面多路由开发环境
  16. springboot启动报Whitelabel Error Page
  17. 程序员快速成长的核心原则
  18. 鲁大师网卡版 v3.71.14 离线驱动版
  19. stm32使用AD转换读取光敏电阻的值(光敏电阻5516)
  20. Kubernetes滚动更新(无中断平滑发布)

热门文章

  1. 去腾讯等BAT面试完的Mysql面试55题总结,含答案大赠送!
  2. 技术动态 | 67 亿美金搞个图,创建知识图谱的成本有多高你知道吗?
  3. Java总结:Spring5框架(1)
  4. JAVA:线程总结及多线程实现的两种方法
  5. http协议的状态码400,401,403,404,500,502,503,301,302等常见网页错误代码
  6. springcloud流程图
  7. 为Openstack制作CentOS7镜像
  8. css pointer-event
  9. nyoj_111_分数加减法_201311281341
  10. 【开始研究Community Server,转贴一点东西】Community Server资料收集