面向对象基础

学习面向对象,首先要了解的是面向过程,什么是面向过程呢?

如果从发展的角度来看,首先有的是面向过程,它主要完成的一些小的,简单的,不需要协作的事物。相当于我们古代的手工作坊。

面向对象

可以理解为流水线作业,每个(类)完成特定的功能。总而言之:面向对象适用复杂的,需要协作,大型的场合。

可以这么来看:一个汽车对象,它有自己的属性,比如:颜色、牌子、样式、座位数…,也有自己的方法,用来描述这个车的功能。

面向对象和面向过程的总结:

1、都是解决问题的方式。
2、面向对象只是在宏观方面,面向过程做细节。

(class)可以看做是一个模板,或者图纸,系统根据类的定义早出对象。由类构造对象的过程称为创建类的实例。

对象

object/instance(实例)
需要明白对象的三个主要特性:

  1. 对象的行为(behavior):可以对对象施加那些操作,活可以对对象使用那些方法?
  2. 对象的状态(state):当施加那些方法时,对象如何响应?
  3. 对象的标识(indentity):如何辨别具有相同行为与状态不同的对象。

2.1内存分析

内存分为栈和堆,堆中包括(方法区和)
:栈是一块内存,有一些特别的约定,一般“先进后出,后进先出”。计算机系统主要使用栈


2.2 构造方法

分为无参构造,有参构造。

无参构造

  1. 通过new关键字来调用
  2. 构造方法不能定义返回值类型,不能在构造器里面return返回某个值。
  3. 如果我们没有定义构造器,则编译器会自动定义一个无参的构造函数,如果我们已经自己定义,编译器就不用管了。
  4. 构造方法的名字必须和类名一样。
    构造方法的第一句总是super();
public class User {
	int id;
	String name;
	String pwd;
	
	public User() {
		
	}
	
	public User(int id, String name) {
		this.id =id;
		this.name = name;
		
	}
	
	public User(int id ,String name,String pwd) {
		super();
		this.id=id;
		//this.name =name;
		this.pwd =pwd;
	}
	public static void main(String[] args) {
		User u1 = new User();
		User u2 = new User(101,"chenxiaoheng");
		User u3 = new User(102,"陈恒","1001");
				
	}
//测试构造方法/构造器
public class _03Test {
	public static void main(String[] args) {
		point p = new point(3.0,4.0);
		point origin = new point (0.0,0.0);
		
		System.out.println(p.getDistance(origin));
	}
	

}



class point {
	double x,y;
	
	
	public point(double _x, double _y) {
		
		x=_x;
		y=_y;
	}
	
	public double getDistance(point p) {
		return Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));
	}

2.3垃圾回收机制

内存管理
java的内存管理很大程度指的就是对象的管理,其中包括独享空间的分配和释放。
空间分配:通过new关键字创建对象
空间释放:将对象赋值null即可,垃圾回收负责回收所有“不可达”对象的内存空间。

无用对象指的就是没有任何变量引用该对象。

过程
1.发现对象。
2.清理无用对象。

垃圾回收相关算法

1、引用计数法
该对象被引用一次,计数加一,缺点“循环引用的无用对象”不能识别。

public class Garbage {
	String name;
	int id;

	public static void main(String[] args) {
		Garbage g1 = new Garbage();
		Garbage g2 = new Garbage();
		g1.name = g2.name;
		g1.id = g2.id;
		g1=null;
		g2 =null;

		
	}

这里g1和g2的值实际上null。
2、引用可达法(根据搜索算法)

2.4通过分代的垃圾回收机制

2.5 jvm调优和 Full Gc

2.6开发中容易造成内存泄漏的操作

2.7 对象的创建过程和this 本质

创建对象分为如下四步:
1、分配对象空间,赋初始值为0或null;
2、执行属性值的显示初始化
3、执行构造方法
4、返回对象的地址给相关变量

功能
1、this代表当前对象

public class User01 {
	int id;
	String name;
	String pwd;
	
	
	public User01() {
		
	}
	
	public User01(int id, String name) {
		System.out.println("正在初始化已经创建好的对象:"+this);
		this.id = id;//不写this,无法区分局部变量id和成员变量id
		this.name=name;
	}
	public void login() {
		System.out.println(this.name +"要登录");   
	}
	
	public static void main(String[] args) {
		User01 u1 = new User01(101,"ch");
		u1.login();
	}

2、this代表重载方法


public class TestThis {
	int a, b, c;
	
	TestThis(){
		System.out.println("正在初始化一个hello对象");
		
		
	}
	TestThis(int a ,int b){
		this();		//调用无参的构造方法,并且必须位于第一行
		a =a ;
		//这里区分成员变量和局部变量
		this.a=a;
		this.b=b;
	}
	TestThis(int a, int b, int c){
		//调用带参构造方法,并且必须位于第一行
		this(a,b);
		this.c =c;
	}
	
	void sing () {
		System.out.println(a+""+b);
	}
	
	void eat() {
		this.sing();//调用本类中的sing();
		System.out.println("你妈妈喊你回家吃饭");
	}
	public static void main(String[] args) {
		TestThis tt = new TestThis(1,2);
		tt.eat();
	}

2.8 static关键字

static修饰变量和方法,修饰的内容从属于类。
普通变量和普通方法从属于对象。

//练习Static
public class _04Test {
	int id;
	String name;
	String pwd ;
	static String company =  "巨轮";
	
	public _04Test(int id, String name) {
	this.id=id;
	this.name =name;
	
	}
	public void login() {
		System.out.println("登录:"+name);
	}
	
	public static void printCompany() {
		//login;	调用非静态成员,编译会不通过
		System.out.println(company);
	}
	
	public static void main(String[] args) {
		_04Test t = new _04Test(101,"ch");
		t.printCompany();
		t.company = "金轮";
		t.printCompany();
	}

不能使用动态方法,原因是编译器找不到是哪个对象的。

2.9静态初始化块

//静态初始化的使用
public class User02 {
	int id;
	String name;
	String pwd;
	static String company;
	
	static {
		System.out.println("执行初始化工作");
		company = "巨轮";
		printCompany();
		
	}
	
	public static void printCompany() {
		System.out.println(company);
	}
	
	public static void main(String[] args) {
		User02 u2 =null;
	}

2.10Java中的值传递

Java中,方法中所有参数都是值传递,也就是传递的都是值的副本。也就是说我们得到的是复印件,而不是原件。
基本数据类型参数的传值
传递的是值的副本。副本改变不会影响原件。
引用类型参数的传值
传递的是值的副本。但是引用类型指的是“对象的地址”。因此,副本和原参数都指向了同一个“地址”,改变“副本指向地址对象的值”,也就意味着原参数指向对象的值也发生了改变。

特殊情况
多个变量指向同一个值时,其中一个变量改变值地址之后,值会发生变化。

public class User04 {
	int id;
	String name;
	String pwd;
	
	
	public User04() {
		
	}
	
	public User04(int id, String name) {
		System.out.println("正在初始化已经创建好的对象:"+this);
		this.id = id;//不写this,无法区分局部变量id和成员变量id
		this.name=name;
	}
	public void testPapmeterTransfer01(User04 u) {
		u.name ="cxh";
	}
	
	public static void main(String[] args) {
		User04 u1 = new User04(101,"ch");
		u1.testPapmeterTransfer01(u1);
		System.out.println(u1.name);
	}

2.11Java中的包机制

相当于文件夹,目的分类,方便管理。
命名:通常域名到这写 例如:com.taobao.*** 、 cn.awacky.***

JDK中的主要包

Java中的常用包

java.lang

包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。

java.awt

包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。

java.net

包含执行与网络相关的操作的类。

java.io

包含能提供多种输入/输出功能的类。

java.util

包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。

2.12import导入类

如果使用其他包中的类,就需要导入包,也就是在类前输入地址。

//测试包的导入
import java.lang.Math;
public class _05Test {
	public static void main(String[] args) {
		System.out.println(Math.PI);
	}

2.13静态导入

static import 是在JDK1.5新增加的功能,其作用是用于导入指定的静态属性,这样我们可以直接使用静态属性。

//测试包的静态导入
import static  java.lang.Math.*;   //注意区别
public class _06Test {
	public static void main(String[] args) {
		System.out.println(PI);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值