java之对象应用精炼

前言:

我在原来对象的基础上,为了帮助兄弟们加深和理解面向对象的思想,整理了对象应用这一篇文章,对 对象的应用做了一些的优化,包括代码和演示,再加上概念,希望兄弟们能学起来简单轻松,不沉闷。

兄弟们,盘它!

java之对象应用精炼

一.介绍 

对象(object)是一件事、一个实体、一个名词,可以获得的东西,可以想象有自己的标识的任何东西。对象是类的实例化。一些对象是活的,一些对象不是。比如这辆汽车、这个人、这间房子、这张桌子、这株植物、这张支票、这件雨衣。

概括来说就是:万物皆对象。对象需要由两部分来描述:第一部分是它的“数据”,包括对象的特性、状态等静态信息;第二部分是它的“行为”,包括该对象的操作、功能等能动信息。

我们来了解的是对象的相关应用,告诉我们如何去使用我们对象的属性与方法,比如我们有一个人类,他产生了一个对象张三,那么我们就可以通过张三去使用张三的名字,年龄等他的一些特性,除了这个以外,我们还会对张三的行为进行引用,如:唱歌,踢球,玩游戏等。

二.知识点介绍

1、对象存储

2、对象使用

3、对象生命周期

4、对象比较

5、匿名对象

三.知识点详解

1、对象的存储

    对象的存储在内存中有地址与值,那么地址与值是使用栈与堆的形式存储。那么我们先了解一下堆,栈。

    栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,   Java自动管理栈和堆,程序员不能直接地设置栈或堆。   栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享。

    堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

案例:

    堆是先进先出,先进后出

                     Person p1=newPerson();

java之对象应用精炼

如上图:当我们声明完p1对象后,在内存栈中,我们可以查看到p1的地址,在内存堆中,我们可以看到我们类中的属性与方法。在使用对象时,我们是先找到对象的栈地址,在找到堆中的实际内容。

  1.1、基本类型

      

java之对象应用精炼

    如上图:当我们声明变量a时,只是在内存栈中开辟了一个直接存放内容的空间。

1.2、引用类型

java之对象应用精炼

    如上图:当我们声明p对象时,在我们的内存栈中,我们存入了对象的地址,而这个地址,指向的是我们内存堆中的实际属性,name和sex,也就是说,我们通过内存栈中的地址也就是对象,可以找到内存堆中的name和sex这二个属性的值“小明”和“boy”

2、对象的使用

    创建新的对象之后,我们就可以使用“ 对象名.对象成员 ”的格式,来访问对象的成员(包括属性和方法)。

代码示例:

package com.Test;

public class Main {

private final static String name = "磊哥的java历险记-@51博客";

public static void main(String[] args){
Person p1 = new Person();
Person p2 =new Person();
p1.age = -30;
//不同的对象打印,不同的值
p1.shout();
p2.shout();
System.out.println("============="+name+"=============");

}
static class Person{
int age=23;
public void shout(){
System.out.println(age);
}

}
}

java之对象应用精炼

      如上例:在我们的主函数里,声明了p1,p2二个对象,p1,p2对象分别在我们的内存中开辟了二个不同的空间,那么当p1中的属性age发生变化的时候,p2里面的age是不会受到影响的。那么最后调用shout()方法的时候,我们输出的结果是p1的age是-30和p2的age是23。

2.1、对象创建

格式:

类名 对象名称 =null;         //声明对象 

对象名称 = new 类型();        //实例化对象

代码演示:
package com.Test;

public class Main {

private final static String name = "磊哥的java历险记-@51博客";

static class Person {
String name; //声明姓名属性
int age; //声明年龄属性
public void tell() //取得信息的方法
{
System.out.println("姓名:" + name +",年龄:" + age);
}
}

public static void main(String[] args)
{
Person per = new Person(); //创建并实例化对象
per.age = 25;
per.name ="磊哥java历险记";
per.tell();
}
}

java之对象应用精炼

2.2、访问属性与方法

格式:

访问属性:对象名称.属性名 

访问方法:对象名称.方法名() 

代码演示:
package com.Test;

public class Main {

private final static String name = "磊哥的java历险记-@51博客";

static class Person {
String name; //声明姓名属性
int age; //声明年龄属性
public void tell() //取得信息的方法
{
System.out.println("姓名:" + name +",年龄:" + age);
}
}

public static void main(String[] args)
{
Person per = new Person(); //创建并实例化对象
per.age = 25;
per.name ="磊哥java历险记";
per.tell();
}
}

java之对象应用精炼

3、对象的生命周期

(1)程序结束时,所有对象都回收

java之对象应用精炼

    如上图:产生了一个p1对象,当整个程序结束执行时,p1对象变成了垃圾,结束了他的生命周期。

(2)当对象为null时,对象变成垃圾

java之对象应用精炼

    如上图:产生了一个p1对象,在程序的运行过程当中,p1赋值了null,那么p1在内存栈中的地址就消失了,失去了地址的对象就变成了垃圾,等待着JVM的垃圾回收。

java之对象应用精炼

    如上图:产生了一个p1对象,将p1对象的地址给了p2,表示的是p1和p2同时拥有了同一个地址,他们同时指向了我们内存堆中的内容,当我们把p1的地址赋什为null时,p2是不受影响的,所以,p1变成了垃圾对象,而p2还是可以正常使用。

4、对象的比较

    (1)“= =”运算符 ,用于比较两个变量(基本数据类型和引用数据类型变量)的值是否相等。

代码示例:

public class Test1{   
public static void main(String args[]){
String s1=new String("abc");//产生字符串对象
String s2=new String("abc");
String s3=s1;//将s1的地址给了s3所以他二地址一样
if(s1==s2){//比较具体的地址
System.out.pirntln("s1==s2");
}else{
System.out.println("s1!=s2");
}
if(s1==s3){
System.out.println("s1==s3");
}else{
System.out.println("s1!=s3");
}

}

}

java之对象应用精炼

  (2)equals()方法是String 类的一个成员方法,用于比较两个引用变量所指向的对象的内容是否相等。

public classTest1{   
public static voidmain(String args[]){
String s1=new String("abc");
String s2=new String("abc");
Strings3=s1;
if(s1.equals(s2)){//比较具体的值
System.out.println("s1==s2");
}else{
System.out.println("s1!=s2");
}
if(s1.equals(s3)){
System.out.println("s1==s3");
}else{
System.out.println("s1!=s3");
}
}
}

java之对象应用精炼

5、匿名对象

    创建完对象后,在调用该对象的方法时,可以不定义对象的引用变量,而直接调用这个对象的方法。这样的对象叫匿名对象。

Person p=new Person();   


P. shout();

//匿名对象
new Person().shout();
匿名对象使用:

    如果一个对象只需要一次方法调用,那么就可以使用匿名对象。

    将匿名对象作为实参传递给一个函数调用,比如程序中有一个getSomeOne 函数,要接收一个Person类对象作为参数,函数定义如下:

public static void getSomeOne(Person p){
...
}
函数调用:
getSomeOne(new Person());
案例:

    需求:将小汽车改装成3个轮子的黑车。

    1:汽车类。

    2:汽车修理厂

代码演示:

package com.Test;

public class Main {

private final static String name = "磊哥的java历险记-@51博客";


/*

匿名对象 匿名信 修黑车 汽车类 黑车厂类 把汽车的改成黑色3轮车。

*/
//汽车类
static class Car {
String name = "梅赛德斯G500"; //名字
String color = "红色"; //颜色
int num = 5; //轮胎数量

void run() {
System.out.println( "车品牌:" + name+"t车颜色:"+color + "t车胎数量:" + num + "t跑起来了。。。。");
}

}

//改车工厂
static class BlackCarFactory {
String name; //工厂名字
String addr; //工厂地址

public Car CarrepairCar(Car c) { //将车改成黑色,3轮
c.num = 3;
c.color = "黑色";
System.out.println("改装成功啦。。。");
return c;

}
}

//主函数
static class Demo1 {

public static void main(String[] args) {

BlackCarFactory bcf = new BlackCarFactory(); //产生一个改车工厂对象
bcf.name = "磊哥修理厂";
bcf.addr = "陕西西安雁塔区长安路16号";

// 非匿名对象
Car c = new Car(); //产生一汽车对象
c.run(); //运行起来
// 跑到改车工厂,将车传入,进行改装
bcf.CarrepairCar(c);
// 改装完成,取车,在运行
c.run();

// 匿名对象一,只使用一次:
// 如下创建了2个对象
/*
* newCar().run();
*
* newCar().run();
*/

// 匿名对象二,作为实际参数传递
Car c2 = bcf.CarrepairCar(new Car()); //直接将车送进改装工厂
c2.run(); //改装完后运行

System.out.println();
}
}
}

java之对象应用精炼

java之对象应用精炼

  总结:

    1. 匿名对象设置的属性永远无法获取?  没有引用变量指向那个对象。

    2. 任何两个匿名对象使用==比较,永远返回false。

    3.  匿名对象主要应用于实参。

结语:

我们对对象的存储,使用,生命周期,比较,匿名挨个做了详细的描述,希望对兄弟们有所帮助,希望我聊的某一句对大家有帮助都是我最大的心愿!

希望初学者兄弟们,自己动手敲一敲代码,这也是我写文章的初心吧!

感谢大家的持续关注! 

java之对象应用精炼

发表评论

相关文章