(一)面向对象的引入
java是面向对象的计算机语言。
对象:真实存在唯一的一个事物(具体)。
类:同一种事物的公共属性以及公共功能的抽取(抽象的概念)。
现实生活中:先有对象,再有类。
java中:先有类:再有对象。
找对象的方法:
1.自定义类,然后通过自定义的类去创建对象;
自定义类的过程中会涉及到很多语法,学习这些涉及到的语法,然后才能看懂自定义类。
2.有很多已经定义好的类,只需认识这些类即可创建对象使用。
计算机是服务于人类的,为了让计算机更加贴近生活,所以面向对象的计算机语言就诞生了。
面向对象的计算机语言(更方便) 和 面向过程的计算机语言
编程思维的区别:
面向过程:侧重过程,自己遇到一个问题解决一个问题。
面向对象:找适合的对象,完成适合的事情,重点是找对象。
面向对象的核心:找适合的对象,完成适合的事情,重点是找对象。
自定义类的步骤:
1.先使用class自定义一个类
格式:
class 类名{
事物的公共属性使用成员变量描述;
事物的公共行为功能使用函数描述;(一个方法内部可以直接访问)
}
2.通过自定义的类创建对象
创建对象的格式:
new 类名();
3.访问对象的属性或者调用对象的功能。
访问对象的属性格式:
对象.属性名;
调用对象的功能行为:
对象.函数名;
如:
class Car
{
String name;
String color;
int wheels;
public static void run(){
System.out.println("跑得很快");
}
}
class duixiang
{
public static void main(String[] args)
{
//任何类都可以用于声明一个变量
Car c = new Car();//左边用自定义的类声明一个C变量,后边创建一个类的对象,=表示Car类型的变量c指向对象
c.name="兰博基尼";
c.color="蓝色";
c.wheels=4;
System.out.println("名字:"+c.name+",颜色:"+c.color+",车轮数:"+c.wheels);
c.run();
}
}
类与类之间相互独立。
(二)面向对象的内存分析
Car c = new Car(), 左边表示在栈内存中声明一个Car类型的变量c,右边表示在堆内存中创建一个Car类的对象,等号表示将对象的内存地址赋给c,即变量c指向对象。
(三)成员变量与局部变量
成员变量与局部变量的区别;
1.位置的区别
成员变量是定义在方法(函数)之外,类之内的变量;
局部变量是定义在方法之内的变量。
2.作用上的区别:
成员变量的作用是用于描述一个事物的属性的。
局部变量的作用是用于提供一个变量给方法内部使用。
3.生命周期的区别:
成员变量的生命周期是随着对象的创建而创建,随对象的消失而消失。
局部变量的生命周期是调用到对应的方法时执行到了创建该局部变量语句的时候存在,
局部变量一旦出了自己的作用域会马上消失。
4.初始值的区别;
成员变量有默认的初始值。(堆内存的特点:若一个对象的属性没有初始值,那么jvm会给属性分配默认的初始值。)
int 0
double 0.0
float 0.0f
char ' '
boolean false
String null
局部变量没有默认的初始值,只有先初始化才能使用。
(四)匿名对象
匿名对象:没有引用类型变量指向的对象称为匿名对象
匿名对象的好处:简化书写
匿名对象要注意的细节:
1.两个匿名对象不可能是同一个对象。(每遇到一个new,就会在堆内存中开辟新的内存空间,创建新的对象。)
2.一般不会给匿名对象赋予属性值,因为无法获取到。
匿名对象的应用场景;
1.若需要调用一个对象的方法一次的时候,然后该对象不再使用,可以使用匿名对象。
(匿名对象的方法被调用完一次后,由于没有引用数据类型变量指向,即变为垃圾对象,可以尽快变成垃圾对象被回收;
但是普通的对象其存在周期为到创建该对象的函数结束才截止,存在周期较长,若只需只用一次不再使用,会造成资源浪费。)
2.作为实参传递数据。new Fix().fix(new car());//匿名对象作为实参传递,调用一个方法
(五)封装
面向对象语言的三大特征:封装、继承、多态。
权限修饰符:用于控制变量或方法的可见范围。
public:公共的,修饰的变量或方法可以在任何范围内可见。
private:私有的,修饰的变量或方法只能在本类中可见。
封装步骤:
1.使用private修饰需要被封装的属性。(这样别人不能访问该属性)
2.提供公共的方法设置或获取该属性的值。
方法命名规范:
set属性名 或 get属性名
例如:
class member
{
public String userName;
private String sex;
public int salary;
//提供一个公共的方法设置性别
public void setSex(String s){
if(s.equals("男")||s.equals("女")){
sex=s;
}
else{
sex="男";//默认男
}
}
//sex是private,类外要访问需要提供一个公共的方法获取性别
public String getSex(){
return sex;
}
public void meet(){
System.out.println("姓名:"+userName+"性别:"+sex+"收入:"+salary);
}
}
class fengzhuang
{
public static void main(String[] args)
{
member mem=new member();
mem.userName="小仙女";
//mem.sex="仙";//若sex是public,这里会出现问题,因为sex是public则类外也可以访问该属性,要用封装解决
mem.setSex("女");
mem.salary=1020;
System.out.println("姓名:"+mem.userName+"性别:"+mem.getSex()+"收入:"+mem.salary);
}
}
封装的好处:
1.提高数据的安全性。
2.操作简单。
3.隐藏了实现。
封装的应用场景:
若一个属性不想被其他人直接访问,可以封装起来。
现实开发中的实体类的成员属性(成员变量)一般都会封装起来。
现实开发中的两种类:
工具类(如Arrays):提供一些功能使用。
实体类:用于描述一类事物的类。如 class Student{}
封装不一定要提供get和set方法,看需求而定。