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

第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;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌发布颠覆性研究:不训练不调参,AI自动构建超强网络,告别炼丹一大步...

来源:凹非寺 机器学习全靠调参?这个思路已经过时了。谷歌大脑团队发布了一项新研究:只靠神经网络架构搜索出的网络,不训练,不调参,就能直接执行任务。这样的网络叫做WANN,权重不可知神经网络。它…

JavaSE——面向对象进阶(封装、this、static、代码块、包、权限修饰符、main方法详解)

第2节 面向对象进阶 一、封装与private 概述: 封装的意义在于保护或者防止代码(数据)被我们无意中破坏。保护成员属性,不让类以外的程序直接访问和修改。封装原则: 隐藏对象的属性和实现细节,仅对外公开访…

孙正义:互联网流量将转化为智能AI流量,我的时代终于来了

“今后,增加软银集团的股东价值的成长引擎是什么呢?从上面的营业利润的增长来看,SVF(软银愿景基金)贡献了80%。SVF是SoftBank2.0最重要的经营引擎。首先,大约2年时间,SVF的投资对象已经超过了80…

JavaSE——面向对象高级(继承、final关键字、抽象类与接口、多态、Object类、内部类、包装类、可变参数)

第3节 面向对象高级 一、继承 1.1 概述和使用 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继…

word的公式后加编码后自动变小

如图所示,在公式后面加编码后公式也变小了: 加编码前: 加编码后: 采用样式分隔符(Ctrlaltenter)即可解决,输完公式后,按enter转行,输入你要的东西(编号什么的…

人工智能70年:科幻和现实的交融

文章素材来源:BBC图片来源:网络【导读】人类飞跑着进入人工智能(AI)时代。粗略估算现在人们日常生活中有20多种寻常的AI,从垃圾邮件过滤器到叫车软件。AI被分为两类,这些执行具体任务的AI属于“弱人工智能”…

vim 插件之commentary

下载地址 http://www.vim.org/scripts/script.php?script_id3695 如果是使用vundle来管理这个插件的话,你可以添加如下配置 tpope/vim-commentary 这个插件可以根据你当前打开的文件类型,来选择相应的注释方式。 使用的命令是 \\位移 比如,…

JavaSE——异常处理(异常简介、try-catch-finally、throws、throw)

第4节 异常处理 异常处理学习的目标: 明确说明是异常(重点) 能辨识出常见的异常及其含义(熟悉) 理解异常产生的原理(了解) 能处理异常(重点) 能够自定义异常&#x…

专访「算法之父」Michael Saunders:人工智能未来的突破点可能在自动驾驶

来源:雷锋网 AI 科技评论雷锋网 AI 科技评论按,4 月 25 日,在由涂鸦智能联合知名财经媒体《新财富》、人工智能领域知名媒体《全球智能化商业》共同举办的「全球智能化商业峰会」上,斯坦福大学荣誉教授、新西兰皇家学会荣誉成员、…

从指南针到北斗:中国导航系统促进世界互联互通

6月11日,在维也纳联合国国际会议中心,联合国外层空间事务办公室主任迪皮波(右)参观中国古代计时装置水运仪象台。本报记者 冯雪珺摄来源:人民日报核心阅读中国卫星导航系统管理办公室在维也纳联合国国际会议中心举办“…

JavaSE——常用类库(上)(泛型、Objects、Math、ArraysBigDecimal类)

第1节 常用类库(上) 面向对象更多是思想上的东西,常用类库更多是工具上的东西,熟能生巧,多整理笔记。 一、泛型 1.1 概述 泛型,即“参数化类型”。就是将类型由原来具体类型进行参数化 ,类似…

朗兰兹纲领:关于数学大一统的伟大构想

麦克斯韦方程组来源:今日头条我们经常聊到物理学家都在追寻物理学的大一统,物理学的第一次大一统是麦克斯韦的麦克斯韦方程组,将电学与磁学相统一,建立了电磁学理论,后来,爱因斯坦想继续完成麦克斯韦未竟之…

JavaSE——常用类库(下)(Date、DateFormat、Calendar、System类)

第1节 常用类库(下) 六、java.util.Date Date类表示特定的时刻,精度为毫秒。 在JDK 1.1之前, Date类还有两个附加功能。 它允许将日期解释为年,月,日,小时,分钟和秒值。 它还允许…

世界隐形冠军比拼:德国1307家、美国366家、中国68家

来源:股权投资论坛目录一、隐形冠军的概念二、隐形冠军的四个特征三、隐形冠军为何隐形四、隐形冠军到底有多牛五、如何成为隐形冠军六、中国隐形冠军多吗1隐形冠军的概念“隐形冠军”这个概念是赫尔曼西蒙教授提出的。1986年,他在研究德国出口数据时发现…

JavaSE——常用类库(String类)

第1节 常用类库——String 因为String相对之前的类来说更加常用一些,所以对字符串类进行专门的整理。 1. 概述 String类表示字符串,Java中的所有字符串文字都实现为此类的实例。字符串是不变的,它们的值在创建后无法更改 。因为它的创建是通…

VVDocumenter 使用

函数说明文档插件下载链接 https://github.com/onevcat/VVDocumenter-Xcode下载后,直接运行项目升级Xcode后可能不能再次使用,需要做一些处理从Xcode 5开始,苹果要求加入UUID证书从而保证插件的稳定性。因此Xcode版本更新之后需要在VVDocumen…

大自然创作的分形艺术

来源:http://blog.sciencenet.cn/blog-420554-363521.html数学上的分形 (Fractal) 是指“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少会大略)是整体缩小尺寸的形状”。数学家们已经创作出许多美丽的…

JavaSE——类集(上)(Collection、List、Iterator、forEach)

第2节 集合(上) 因为已经有数据结构的基础,前面有关数据结构的知识就不单独整理了,直接上Java的集合类的知识。 一、类集(集合类) 1.1 集合概述 集合: 集合是java中提供的一种容器&#xff…

第二个spring冲刺总结

讨论成员:罗凯旋、罗林杰、吴伟锋、黎文衷 第二阶段总体是做到了四则运算的demo,,包括APP进入动画,以及界面的基本效果设计,还有能进行综合计算(选择题,可以 自动生成简单,容易,困难…

图灵奖得主姚期智:求解人工智能的中国答案

来源:清华大学他是“图灵奖”创立以来首位获奖的亚裔学者,也是迄今为止获此殊荣的唯一华裔计算机科学家。2004年从普林斯顿辞去终身教职回到清华任教。2005年,他为清华本科生创立了计算机科学实验班“姚班”。如今,在中国乃至全球…