Day06 学习java(面向对象)

面向对象

1.面向对象

1.1概述

面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。

↑百度百科的↑

1.2面向对象和面向过程

所谓面向对象和面向过程,我的理解就是比如做包子。面向过程就是想吃包子。然后自己做包子(拌馅→擀皮→包起来→蒸熟)一气呵成,最终做熟一个包子,后来又想吃个饺子(拌馅→擀皮→包起来→煮熟)。而面向对象就是第一个人专门拌馅,第二个人专门擀皮,第三个人专门包起来,第四个人专门弄熟;我想吃包子第四个人就给我一个熟包子,我想吃饺子第四个人就给我一个熟饺子。在这里插入图片描述
不过可能馅不是自己喜欢吃的。

面向过程:侧重分步骤
比如要做一件事的时候先分析第一步做什么,第二步做什么
面向对象:侧重分模块
比如要做一件事的时候,分析出这件事应该交给谁去做。
总结:
面向对象优势:可扩展性,可维护性,灵活性,使程序耦合度降低
缺点:性能比面向过程相对较差

1.3构造方法

每个类都有,用于创建该类对象,如果该类中没有编写构造方法,那么编译器自动生成一个无参构造方法,如果该类中编写了构造方法,无论有无参数,默认的无参构造都不再生成。(所以写有参构造的时候,最好手写一个无参构造

构造方法语法结构

		//修饰符    方法名(必须和类名相同)  (参数列表){
							方法体
		}
		//修饰符只用权限修饰符即可,不能使用static
		//真的真的没有返回值,不是void,而是字面意思不要声明返回值类型
	    //声明了就是成员方法
	    //方法名必须和类名一致
		// 默认的无参构造
	public class Test {

		public static void main(String[] args) {
		Test test1 = new Test();//自动调用构造方法
		System.out.println(test1);
	}

}

在这里插入图片描述

//编写构造方法
public class Test {

	public static void main(String[] args) {
		Test test1 = new Test(1);
		Test test2 = new Test();//会报错
		System.out.println(test1);
	}

	public Test(int i) {
		System.out.println("有参构造方法");
	}
}

在这里插入图片描述
下面重写带参数的构造方法同时再写一个无参构造方法

public class Test {

	public static void main(String[] args) {
		Test test1 = new Test(1);
		Test test2 = new Test();
		System.out.println(test1);
		System.out.println(test2);
	}

	public Test(int i) {
		System.out.println("有参构造方法");
	}

	public Test() {
		System.out.println("无参构造方法");
	}
}

在这里插入图片描述

1.4类和对象、实例化

:描述了这一类事物的属性和特征,进而抽象出的模板
对象:某一个具体的事物,是类的实现,保存了属性的值
在编程中,通过需求或现实事物的属性和特征来定义相关的类,通过不同的属性值来定义不同的对象
如果对象和对象之间有相同的属性共享的值,就使用静态变量,如果相同的属性不共享的值,就使用成员变量

实例化
1.加载对应类文件
2.new在堆内存创建空间
3.执行构造方法,对堆内存对象进行初始化
4.构造方法弹栈,并把堆内存地址返回给变量 s1,s2,s3

			//Student.java
			
	public class Student {
	// 国籍,假如全是中国人
		static String country = "中国";
	// 姓名
		String name;
	// 学号
		int id;
	// 性别
		boolean sex;
}
				//更改成员变量
public class Test {

	public static void main(String[] args) {
		Student s1 = new Student();
		s1.name = "三三";
		Student s2 = new Student();
		s2.name = "四四";
		System.out.println(s1.name);
		System.out.println(s2.name);
	}

}

在这里插入图片描述

					//更改静态成员
	public class Test {

	public static void main(String[] args) {
		Student s1 = new Student();
		System.out.println("s1:" + s1.country);
		Student s2 = new Student();
		System.out.println("s2:" + s2.country);
		s1.country = "China";
		System.out.println("s2:" + s2.country);
		Student s3 = new Student();
		System.out.println("s3:" + s3.country);
	}

}

在这里插入图片描述

1.5javaBean

就是公共的类,私有化的属性,公共的获取属性的方法(getter/setter),公共的无参构造

							//Number.java
public class Number {
	private int i = 0;

	public int getI() {
		return i;
	}

	public void setI(int i) {
		this.i = i;
	}

}

public class Test {

	public static void main(String[] args) {
		Number num = new Number();
		num.i=5;//报错
		System.out.print(num.i);//报错
	}

}

在这里插入图片描述

public class Test {

	public static void main(String[] args) {
		Number num = new Number();
		// num.i=5;
		// System.out.print(num.i);
		num.setI(5);
		System.out.print(num.getI());
	}

}

在这里插入图片描述

1.6常见异常

空指针异常:使用null访问成员属性

public class Test {

	public static void main(String[] args) {
		Number num = new Number();
		num = null;
		System.out.print(num.getI());
	}

}

在这里插入图片描述

1.7对象调用静态属性

//调用静态属性使用类名调用
public class Test {
	static int i = 10;

	public static void main(String[] args) {
		Test t1 = new Test();
		System.out.println(Test.i);
		System.out.println(t1.i);
	}

}

在这里插入图片描述

易错点

1.静态调用成员

//静态方法中,无法直接使用非静态属性
//需要使用对象调用才行
public class Test {
	static int a = 1;
	int b = 2;

	public static void main(String[] args) {
		System.out.println(b);
	}

}

在这里插入图片描述

public class Test {
	static int a = 1;
	int b = 2;

	public static void main(String[] args) {
		// System.out.println(b);
		System.out.println(new Test().b);
	}
}

在这里插入图片描述

2.传值和传址(真的很易错)

public class Test {
	int j = 0;

	public static void main(String[] args) {
		// 基本数据类型传值
		int i = 0;
		add(i);
		System.out.println("main->i=" + i);

		// 引用数据类型传址
		Test test = new Test();
		System.out.println("调用add之前j=" + test.j);
		add(test);
		System.out.println("调用add之后j=" + test.j);
	}

	public static void add(int i) {
		i++;
		System.out.println("add->i=" + i);
	}

	public static void add(Test a) {
		a.j++;
	}
}

在这里插入图片描述

1.3区分成员方法和构造方法

构造方法没有返回值!void都没有,且和类名一样

public class Test {
	int i = 0;

	public static void main(String[] args) {
		Test t1 = new Test();
		Test t2 = new Test(8);//会报错
	}

	public void Test(int i) {
		this.i = 5;
	}
}

在这里插入图片描述

public class Test {
	int i = 0;

	public static void main(String[] args) {
		Test t1 = new Test();//会报错
		Test t2 = new Test(8);
		System.out.println(t2.i);
	}
		//成员方法可以和类名相同
	public void Test(int i) {
		this.i = 5;
	}
	public Test(int i) {
		this.i = 5;
	}
}

在这里插入图片描述
在这里插入图片描述

真的没有返回值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值