JavaSE day6——面向对象
为什么要引入面向对象的思想?
我们可以将具有某一功能的代码封装到方法中,这为我们调用这个代码提供了方便,在我们需要用到这个功能时只需要调用相应的方法即可,提高了代码的复用性。但是因为我们程序中常常有多个方法的加入,所以我们想到将方法也封装,即 用 类 封装多个方法。在以后的调用中,我们只需要先找个这个 类 ,然后使用这个类中的方法 ,这种引入就是面向对象的编程方式。
面向对象思想的特征:
面向对象的三大特征:
面向对象开发:
就是不断的创建对象,使用对象,指挥对象做事情。
面向对象设计:
创建对象 ---- 使用对象 ----指挥对象做事情 实例:
public class Phone {//成员变量String brand ;int price ;String color ;//成员方法public void print() {System.out.println("这是我的手机:");}
}
对象的内存分配
java中的内存
java中为了提高程序的执行效率将内存划分为5个区:
1)栈内存:可以存放局部变量
2)堆内存:存放new出来的东西
3)方法区:
①又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
②方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
③运行时常量池都分配在 Java 虚拟机的方法区之中
内存有栈内存、堆内存。程序在执行时,首先进入main方法,由main方法在栈内存中开辟一个区域,加载类Phone。当执行Phone ph = new Phone();时,在堆内存中创建一个Phone类区,,区中存放成员变量、成员方法等。成员变量未被,初始化前会有系统默认初始化,对于字符(串)型初始值为null ,int型为0 。进行方法标记。
调用成员方法的话,一旦调用结束后立刻shut down(放入垃圾回收器中,释放内存)。
![](/assets/blank.gif)
创建两个对象的内存分配:main函数首先在栈内存中开辟一个空间,加载类加载方法Phone p申请一个栈内存空间 , 给new Phone()分配一个堆内存空间。第二个对象 p2 在创建时同样在栈内存中申请一个空间(假设内存地址为0x002),new Phone同样会在堆内存中得到空间分配地址为0x002。系统会默认初始化,多个变量(如图中brand,price,color)指向堆内存。调用class类中的方法时,方法一旦执行完毕即挂掉。
![](/assets/blank.gif)
创建三个对象,有多个对象指向同一个堆内存时(如下图中的对象p和 p3,因为将p传递给了p3),它们会使用同一个Phone类区,因为p3这个对象不用开辟一个新的堆内存区,所以这种创建方法有省内存的效果。
![](/assets/blank.gif)
成员变量和局部变量的区别
什么是成员变量?
成员变量是在类体的变量部分中定义的变量,也称为属性。
成员变量的定义是有要求的:如果该类中本身有这个属性才可以定义为成员变量。 例如我们把一个长方形看成一个类,那么这个类的长方形的长、宽可以看作是这个类中的成员变量,长方形的面积和周长可以分别看成是这个类的成员方法。
位置: 成员变量在方法外类中,局部变量在方法声明上或方法定义中。
在内存中的位置: 成员变量在堆内存中方,局部变量在栈内存中。
生命周期: 成员变量随类的加载而加载,消失而消失,局部变量随方法调用而存在,调用完毕而消失。
初始化值不同: 成员变量初始化有系统默认初始化,局部变量由我们初始化,使用前初始化使用。
使用对象名访问类中的成员变量和成员方法
匿名对象
匿名对象顾名思义就是没有名字的对象,这在我们以后的接口中会常常使用到,现在我们只需要知道匿名对象的格式就可以了。直接创建的对象是我们Phone这个类的地址,我们还可以直接创建这个匿名对象的变量并操作。
引用类型作为形式参数
一个类①的功能可能在另一个类②的方法中被使用,这样,我们需要在调用者的方法中创建被调用者的对象,这是一种传递;还有一种是,当调用者②的形式参数为被调用者①的对象(即引用类型作为形式参数)时,我们在其他方法③中调用②这个类中以①为形式参数的方法时,需要在③中同时创建②和①的对象。例如:
class PhonePrint{public void PhonePri() {System.out.println("这是一个作为形式参数的类。。");}
}
class PhoneCommd{public void PhoneCom(PhonePrint p) { // 这里定义一个引用类PhonePrint的对象p作为形式参数//调用p对象的PhonePrint方法p.PhonePri();System.out.println("我调用了PhonePrint作为我的形式参数");}//我再创建一个不用PhonePrint类的对象作为形式参数的方法public void Try() {System.out.println("我不用PhonePrint这个类的对象");}}
public class PhoneTest {public static void main(String[] args) { //创建一个PhoneCommd类的对象pcPhoneCommd pc = new PhoneCommd();
//这行就错了 pc.PhoneCom(p); // 因为形式参数是一个引用类型,所以无法直接调用PhoneCompc.Try();//创建创建一个PhonePrint的对象PhonePrint pp = new PhonePrint();pc.PhoneCom(pp); }
}
private关键字
为什么要引入private关键字?
外部类如何访问private定义的变量?
class Var{//创建私有化的成员变量private String var;private int vari;//创建公共访问方法public String getVar() {return var;}public void setVar(String var) {this.var = var;}public int getVari() {return vari;}public void setVari(int vari) {this.vari = vari;}}
public class test {public static void main(String[] args) {//无法直接访问私有变量var 和 vari//所以我们创建了他们的公共访问方法 快捷键alt +shift + s + vVar v = new Var();v.setVar("就是想试一试");v.setVari(2333);System.out.println(v.getVar() + " 这是我们输出var的值 ," + v.getVari() + " 这是我们输出vari的值。");}
}
构造方法
构造方法的特点:
构造方法的分类:
(1)无参构造:给对象进行初始化。当我们没有提供无参构造时,系统会默认给我们提供一个无参构造,所以上面的代码没有问题。。。那么如果我们写了无参构造或者有参构造,则系统不会给出。
class Test1 {public Test1() { // 方法名和类名相同;没有返回值,连void都没有System.out.println("这是一个无参构造方法");}
}
class Demo{//成员变量private String brand ;private int price ;private String color ;public Demo(){//这是一个无参构造进行初始化}public Demo(String brand , int price , String color) {//这是一个有参构造this.brand = brand ;this.price = price ;this.color = color ;}public String getBrand() {return brand;}public int getPrice() {return price;}public String getColor() {return color;}}
public class DemoTest {public static void main(String[] args) {Demo d = new Demo("HUAWEI", 2000, "黑色");//创建一个有参构造的对象System.out.println("品牌:" + d.getBrand() + " 价格:" + d.getPrice() + " 颜色:" + d.getColor());}
}
构造方法在内存中的图解:成员方法
一个标准的类的格式
实例如下:
class standardclass {//class 类名//定义成员变量private int member_variable1 ;private char member_variable2;//......private String member_variablen;//构造方法:无参构造+ (有参构造)public standardclass() {//无参构造super();}public standardclass(int member_variable1, char member_variable2, String member_variablen) {//有参构造super();this.member_variable1 = member_variable1;this.member_variable2 = member_variable2;this.member_variablen = member_variablen;}//成员方法:SetGet方法 + 我们需要的方法public int getMember_variable1() {return member_variable1;}public void setMember_variable1(int member_variable1) {this.member_variable1 = member_variable1;}public char getMember_variable2() {return member_variable2;}public void setMember_variable2(char member_variable2) {this.member_variable2 = member_variable2;}public String getMember_variablen() {return member_variablen;}public void setMember_variablen(String member_variablen) {this.member_variablen = member_variablen;}//比如说我建立一个方法打印“这是一个标准类”public void printStand(){System.out.println("这是一个标准类");}
}
static关键字
为什么要引入static关键字?
class Game{//成员变量String name ;int year;static String manufacturer ;//因为制造商都是腾讯,我们用static把他共享//构造方法public Game() {super();}public Game(String name, int year,String manufacturer) {super();this.name = name;this.year = year;this.manufacturer = manufacturer ;}public Game(String name, int year) {super();this.name = name;this.year = year;}public void show() {System.out.println("产品名:" + name + " \t出品时间:" + year + " \t出品商:" + manufacturer);}}
public class GameTest {public static void main(String[] args) {Game g1 = new Game("cf", 2008 , "tencent");g1.show();Game g2 = new Game("lol", 2011 );g2.show();Game g3 = new Game("QQspeed", 2005);g3.show();System.out.println("------------------------");//g3.manufacturer = "腾讯" ;g1.show();g2.show();g3.show();}
}
![](/assets/blank.gif)
关于static关键字:
![](/assets/blank.gif)
通过这个过程我们可以看到:我们在堆内存中创建第一个对象时将“西施” 27这两个值赋给了给成员变量,而“中国”这个被static修饰的值则被送到了static区的静态标记中了,内有占用堆内存。在我们创建第二个、第三个对象的时候,对于country这个公共变量我们只需寻址在static中的静态标记查询就可以了,这就是他省堆内存的原因。
②可以有静态成员方法也可以有非静态成员方法
JavaSE day6——面向对象相关推荐
- 【JavaSE】面向对象之多态、向上转型与向下转型
本专栏为 JavaSE 的学习笔记及相关项目,专栏长期免费更新 ❤️ ❤️ ❤️ ❤️ 个人主页:Nezuko627 欢迎来访~~~ ⭐️往期回顾: [JavaSE]继承中内存发生了什么变化?这篇文章 ...
- JAVASE学习 面向对象
JAVASE学习 面向对象 1.面向对象(构造方法Constructor概述和格式) A:构造方法概述和作用 给对象的数据(属性)进行初始化 B:构造方法格式特点 a:方法名与类名相同(大小也要与类名 ...
- day6 面向对象 类的定义访问 命名空间的声明 对象的定义创建 字段的定义创建访问 方法的创建调用
day6 面向对象 面向过程是分析解决问题的步骤,然后把步骤实现 面向对象是把构成问题的事分解成各个对象,不是为了完成步骤,为了描述在整个 类是类别 是一种抽象的数据类型 是相同特征实体的抽象 类里共 ...
- 十一Python之路,Day6 - 面向对象学习
本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你 ...
- 【JavaSe】面向对象篇(五) 三大特征之二继承
JavaSe·面向对象篇(五) 三大特征之二继承 1. 面向对象三大特质之继承 1.1 由来 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那 ...
- JavaSE(面向对象、继承、抽象类)
JavaSE 面向对象 类和对象 定义一个标准类 创建并使用对象 对象的内存图 匿名对象 匿名对象的概述 使用匿名对象 继承 继承概述 为什么要有继承 继承的含义 继承的好处 继承的格式 格式 示例 ...
- 【JavaSe】面向对象篇(七) 接口
JavaSe·面向对象篇(七) 接口 1. 接口概述 接口,是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量.构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法 ...
- day6 面向对象基础
文章目录 1. 简述 2. 继承 3. 多态 1. 简述 面向对象编程 OOP编程是利用"类"和"对象"来创建各种模型来实现对真实世界的描述,使用面向对象编 ...
- python Day6 面向对象学习
面向过程 VS 面向对象 编程范式 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大 ...
最新文章
- Egret之龙骨卡槽(slot)换皮
- 算法 有两个相同大小数组均已按升序排列好 编程计算这两个数组的中位数 C
- Android 定时器实现的几种方式和removeCallbacks失效问题详解
- 算法导论-概率发生器
- 小说里的lt什么意思_游戏cpdd网络用语是什么意思 王者荣耀里很常见
- 带父节点的平衡二叉树_平衡二叉树的左右旋以及双旋转的图文详解
- mysql常用的语句_MySQL常用语句集锦
- Android Training精要(五)讀取Bitmap對象實際的尺寸和類型
- 孔浩java web_孔浩老师JAVA WebService教程
- 微信养号技巧及防封攻略(微信养号防封大全)
- 单相半桥两电平电压型逆变器的正弦脉宽调制(SPWM)——Matlab程序
- 基于Android的背单词软件【源码+文档+答辩PPT】
- 取得目录和取得操作系统盘符以及获取系统盘可用空间
- 算法——连续性后处理(把26邻域连续的变成6邻域连续的)
- 腾讯秋招面经(WXG一面+面委一面+面委二面)
- 疑难杂症:同网段ping不通,跨网段建不了链,怎么破?
- java erp_用Java如何实现ERP系统?
- 佐治亚理工计算机科学专业排名,2020年佐治亚理工学院排名TFE Times美国最佳计算机科学硕士专业排名第6...
- flash调用swf文件服务器,FLASH如何加载(调用)外部SWF文件
- 碳刷滑环在发电机中的作用