Java基础二 面向对象

本文深入探讨了Java面向对象编程的特点,包括面向过程与面向对象的对比、new关键字的作用、构造方法和普通方法的区别。重点讲解了单例和多例设计模式,阐述了它们在内存管理、对象创建和垃圾回收中的影响,以及如何通过静态属性和代码块实现。同时,文章提到了引用传递和不同类型的代码块,强调了在实际开发中合理使用设计模式以优化资源利用和程序性能的重要性。
摘要由CSDN通过智能技术生成

面向对象和面向过程比较:

Java是纯面向对象的语言,Java中是单继承。
具体区别:
面向过程简介:根据程序的因果关系来实现,因为A所以B,因为B所以C,...
面向过程开发一步一步实现功能。应用在实现方法的功能,小程序(代码量低)编程;

优点:使用面向过程开发效率比面向对象高,面向对象需要实例化对象,消耗资源大。
缺点:程序后期不易维护,不易扩展,代码复用性不高,耦合度太高。

面向对象简介:把程序用的单元转换成对象使用,以对象驱动程序,这样更符合人类思维逻辑。
优点:代码易维护,易扩展,代码复用性高,程序耦合度底。
缺点:开发效率没有面向过程高,实例化对象消耗资源大。

面向对象编程三步曲:分析、设计、编程
面向对象由类和对象组成。

new 关键字

只要有new就会在堆中开辟新的内存;
一个栈内存只能保存一个堆内存的地址数据,如果发生更改,则之前的地址数据将会从栈内存中彻底消失。
1.引用与垃圾产生简单分析
引用传递的是内存地址,操作对象的内存地址。
没有任何栈内存所指向的堆内存空间就会成为垃圾,所有的垃圾将被GC(Garbage Collector、垃圾收集器)不定期进行回收并释放无用内存空间,但是如果垃圾过多,一定影响到GC的处理性能。从而降低程序的运行性能。在实际的开发之中,对于垃圾的产生应该越少越好。

构造方法和普通方法的区别

构造方法是在类的实例化的时候调用的;
普通方法是在类的实例化之后调用的;
构造方法如果加上返回值,就会被程序认为是普通方法!

匿名对象

匿名对象没有名字,直接new 类名()进行构造。
例如:new person(“倒霉熊”,20).show();

但是该对象没有任何的栈内存引用,所有在使用了一次后就会成为垃圾,所有的垃圾将被GC进行回收与释放。

Static定义属性

使用static 将属性改变为公共属性。
static属性保存在全局数据区。不在堆内存中了。
注意:但是对于static属性的访问需要注意一点:由于其本身是一个公共的属性。
虽然所有的对象都能进行访问,但是我们应该是通过所有对象的最高代表(类)来进行访问。
static可以由类名称直接调用,这是最合适的。
static属性虽然定义在类之中,但是并不受到类实化对象的控制。
static属性可以在没有实例化对象的时候使用。

Static定义方法
static方法和普通方法的区别在与是否需要实例化对象调用。这一点和static属性一样。
static方法,只允许调用static属性和static方法。
非static方法允许调用static属性和static方法。

static定义的方法或者属性都不是代码编写之初需要考虑的内容,只有在回避实例话对象并且是描述公共属性的情况下下才会考虑使用static定义的方法!

代码块

在程序中使用“{}”定义的结构就称为代码块,
而后根据代码块出现的位置以及定义的关键字的不同代码块可以分为普通代码块、构造块,静态块、同步代码块,
其中对于同步代码块,是在多线程的时候使用。

普通代码块

普通代码块的主要特点是定义在一个方法之中的代码块。
普通代码块的特征:可以在一个方法之中进行一些结构的拆分,以防止相同变量名所带来的互相影响。

构造代码块

构造代码块是在一个类之中的。
构造块会优先于构造方法执行,并且每一次实例化新对象都会调用构造块中的代码!

静态代码块

静态代码块主要指的是使用static关键字定义的代码块,
静态块的定义需要考虑两种情况:1.主类静态块。2.非主类静态块。
静态块主要是为static属性初始化的,大部分时候static属性都有初始值。
静态代码块会优先于构造块执行,并且不管有多少个实例化对象出现静态代码块只会执行一次。
主要目的是为类中的静态属性初始化。

在主类中定义的代码块:静态代码块优先于主方法。主方法为程序起点。
但是可以通过静态代码块,做优先准备工作。

引用传递

引用传递是整个Java开发与设计过程之中最为重要的技术组成,
对于引用传递对我们实际的生活密切相关。
这些关系的匹配都是通过引用数据类型的关联来完成的

类关联结构
类中有其它类作为私有属性,其它类也需要此类作为属性,有些属性不应该在被实例化的时候初始化。在需要的时候使用set方式赋值。
例如:人和汽车类,人有汽车这个属性,汽车有人这个属性。通过人可以找到这个人的汽车,通过汽车可以找到主人。
自身关联
自身类也可以作为自身的属性,例如,人这个类有孩子的属性,孩子又是人这个类。
合成设计模式
假设说,现在要求你定义出一种可以描述电脑组成的类,那么在这样的状态下就必须进行拆分。电脑分为两个部分:显示器,主机。而主机上需要设置有一系列的硬件。

单例设计模式

单例设计模式和多例设计模式主要是一种控制实例化对象产生个数的设计操作
单例设计:只允许某个类提供一个实例化对象。那么此时,首先应该控制的就是构造方法。
因为所有的新的实例化对象产生一定哟啊调用构造方法。如果构造方法“没有了”,那么就无法实例化对象。
范例:构造方法私有化了。在别的类中就无法通过new关键字产生实例化对象。
现在的要求是:必须产生有一个实例化对象。
1.例如:

class Singleton{
	private Singleton instance =new Singleton();
	private Singleton(){}//构造方法私有化了
	public void print(){
		System.out.println(“hahahhah”);
	}
}


此时,Sigleton类内部的instance属于一个普通的属性,
而普通属性是在有实例化对对象产生以后才会被调用的。
那么这个时候外部无法产生实例化对象,所以这个属性就不能访问到了,
那么就必须考虑如何在没有实例化对象的时候获取此属性。
那么只有static属性能够满足这个条件。
类中的属性需要被封装后使用,
所以此时的instance需要被封装起来,
那么就需要一个static方法获得。
Class Singleton{
Private static Singleton instance =new Singleton();
Private Singleton(){}//构造方法私有化了
Public static Singleton getInstance(){
Return instance;
}
Public void print(){
System.out.println(“hahahhah”);
}
}

4.整个代码从头强调的是只有一个实例化对象,这个时候虽然提供有static的实例化对象,但是这个对象依然可以被重新实例化。所以需要保证此时Singleton类内部的instance无法直接再次实例化,应该使用final来定义。
最终饿汉式单例设计如下:

class Singleton{
	private static final Singleton INSTANCE =new Singleton();
	private Singleton(){}//构造方法私有化了
	public static Singleton getInstance(){
	return INSTANCE;
}
	public void print(){
	System.out.println(“hahahhah”);
	}
}
应用场景:程序运行过程中一直存在的对象。
就像ue4中instance一样。instance可以保存关卡信息。
不会因为游戏切换关卡就从新生成对象实例,抛弃之前关卡的状态,
例如获取的金币,血量,经验不会被重置。

单例设计模式分为:懒汉式和饿汉式。在之前定义的都是饿汉式。在系统加载时就有一个Singleton类的实例化,而还有一种懒汉式在第一次使用的时候进行实例化对象处理。

懒汉式单例设计模式如下:

class Singleton{
	private static Singleton instance;
	private Singleton(){}//构造方法私有化了
	public static Singleton getInstance(){
	if(instance==null){//第一次使用实例化,以后便不再实例化。
		Instance=new Sigleton();//实例化对象!
	}
	return instance;
	}
	public void print(){
	System.out.println(“hahahhah”);
	}
}

特点: 懒汉是需要考虑线程同步的问题构造方法私有化,类内部提供static方法获取实例化对象,这样不管外部如何操作,内部永远只有一个实例化对象提供。

多例设计

与单例设计对应的还有一个称为多例设计,
单例设计指的是只保留有一个实例化对象,而多例设计指的是可以保留有多个实例化对象。
例如:如果现在要定义一个描述性别的类,那么该对象只有两个:男、女。
或者描述基色的类,这个类对象只有三个:红,蓝,绿
class Color{
	private static final Color RED=new Color(“红色”);
	private static final Color BLEU=new Color(“蓝色”);
	private static final Color GRENN=new Color(“绿色”);
	private String title;
	//构造方法,构造方法私有化也可以通过protected或者默认的default
	private Color(String title){
		this.title=title;
	}
	public static Color getInstance(String color){
		switch(color){
			case “red”: return RED;
			case “blue”: return BLUE;
			case “green”: return GREEN;
			default: return null;
		}
	}
	public String toString(){
		return this.title;
	}
}

多例设计与单例设计的本质是相同的,一定都会在内部提供有static方法以返回实例化对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值