1.面向过程与面向对象
- 面向过程开发,其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求,所以在面向过程开发中,每一步的过程都很重要,当其中有一步出错时,都不能达到目的,当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高。可随着需求的更改,功能的增多,发现需要面对每一个步骤很麻烦了,所以我们就需要一种更方便的方式。
- 这时就开始思索,能不能把这些步骤和功能在进行封装,封装时根据不同的功能,进行不同的封装,功能类似的封装在一起。这样结构就清晰了很多。用的时候,找到对应的类就可以了。这就是面向对象的思想。
- 举例:洗衣服
面向过程:脱衣服——节水——浸泡——揉搓——漂洗——晾干
面向对象:直接用洗衣机,一键洗衣。
2.对象与类
- 现实生活中由好多事物,比如一个学生,一个人,一棵树等等,而Java语言中的类就相当于一个事物,现实生活中每个事物都有它所对应的属性和行为,比如一个人他有姓名,年龄,职业这些就是属性,他每天还要睡觉,吃饭这些就是行为,对应到类中就是成员变量和成员方法。
- 所以定义一个类就是定义它的成员变量和成员方法。
- 而对象是该类事物的具体体现,比如学生就是是一个类,而班长就是一个对象。
- 创建对象:类名 对象名 = new 类名();
- 访问类中的成员变量和方法:对象名.变量名,对象名.方法名。
- 例一:创建一个学生类,然后画出内存图
package org.westos.demo;
public class Test1 {
public static void main(String[] args) {
student st = new student();
st.name="李四";
st.age=12;
student st1 = new student();
st1.name="王五";
st1.age=23;
student st2=st;
st2.name="嘻嘻";
st2.age=45;
System.out.println(st.name);//嘻嘻
System.out.println(st.age);//45
System.out.println(st1.name);//王五
System.out.println(st1.age);//23
System.out.println(st2.name);//嘻嘻
System.out.println(st2.age);//45
}
}
class student{
String name="张三";
int age;
}
内存图如下,通过内存图,我们就能很好的理解
- 例二:当一个方法的形参是一个类类型时
package org.westos.demo4;
public class MyTest {
public static void main(String[] args) {
String name="张三";
int age=20;
Student student = new Student();
test(name,age,student);//传该类的一个对象
System.out.println(student.name);//张三
System.out.println(student.age);//20
}
public static void test(String name,int age,Student student){ //形参时类类型时
System.out.println(student);
System.out.println(student.name);//李四
System.out.println(student.age);//23
student.name=name;
student.age=age;
}
}
class Student{
String name="李四";
int age=23;
}
3.成员变量和局部变量不同(很重要)
-
位置不同
- 成员变量在类中方法外
- 局部变量在方法定义中或方法声明中
-
在内存中的位置不同
- 成员变量在堆内存中
- 局部变量在栈内存中
-
生存周期不同
- 成员变量随着对象的创建而创建随着对象的回收而消失
- 局部变量随着方法的调用而产生,随着方法的调用结束而消失
-
初始化值不同
- 成员变量有初始化默认值
- 局部变量没有初始化默认值,必须定义,赋值然后才能 使用
4.匿名对象
匿名对象:就是没有对象名的对象,
使用场合:
(1)调用方法,仅仅只调用一次的时候
(2)还可以作为实际参数传递
package org.westos.demo;
public class MyDemo4 {
public static void main(String[] args) {
dog d1 = new dog();
d1.show();
new dog().show();
String name = new dog().name; //匿名对象也可以调用成员变量和方法,这个方法只需要调用一次时,也可以用
test(new dog());
}
public static void test(dog dog1){
dog1.show(); //匿名对象作为参数传递,移后会经常用到
}
}
class dog{
String name="小小";
public static void show(){
System.out.println("嘻嘻嘻");
}
}
5.封装
(1)封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
(2)private关键字
private是一个权限修饰符,可以修饰成员变量和成员方法,但被其修饰的成员只能在本类中被访问。
(3)priavte常见的应用
(1):把成员变量用private修饰
(2):提供对应的getXxx()和set3xx()方法
//写一个学生类,其中包含name和age用private修饰,写出set和get方法
package org.westos.demo5;
public class Student {
private String name;
private int age;
public void setName(String name1){
name=name1;
}
public String getName(){
return name;
}
public void setAge(int age1){
age=age1;
}
public int getAge(){
return age;
}
}
5.this关键字
//当我们的局部变量和成员变量相同的时候,如果我们不使用this关键字,那么会导致一个问题:就是局部变量隐藏了成员变量的问题。
//例如,以上面的那个代码为例
public class Student {
private String name;
public void setName(String name){
name=name;//这样就会出错,
}
}
this 代表本类的一个引用,你可以认为this代表的是一个本类对象,哪个对象调用这个方法,那么方法中的this就代表谁。
//写一个学生类,用private修饰成员变量,成员变量和局部变量写一样,用this关键字,并给出测试。
package org.westos.demo5;
public class Student {
private String name;
private int age;
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return this.age;
}
}
//测试
package org.westos.demo5;
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.setName("张三");
student.setAge(20);
System.out.println(student.getName());
System.out.println(student.getAge());
}
}