第五天总结:
1、面向对象
面向对象的思想就是指挥对象做事。
面向对象的三个特征:封装、继承、多态
面向对象的思想能把复杂的问题简单化,而且使程序员的角色发生了变化,从对象的执行者变成了对象的指挥者。
*面向对象在程序中的表现
类就是JAVA语言对现实生活中事物的描述方式。对象就是描述这类事物后实实在在存在(内存中)的那个个体。
通常一个描述一个事物就要描述它的属性和行为
class car
{
int luntai=4;//这些变量在整个类中都有效,叫成员变量(属性)
String color="red";
public void run()
{
System.out.println(luntai+","+color);
}
}
class cardemo
{
public static void main(String[] args)
{
car c =new car();
/*对象也是个实体,存放在堆内存中,通过一个new关键字建立一个car内容的实体,这句话就是一个对象,这个对象是根据car类定义的,所以对象名c前面要一个类名car
*/
c.color="bule";//对象.对象成员变量 的格式改变对象成员变量的值
c.run();//对象.对象成员函数的格式是调用对象成员函数
}
}
手动画图剖析该程序在内存中的操作过程。
局部变量的作用域有限,成员变量的作用范围最大,整个类都有效。
局部变量可以作用于语句内(for),可以作用于函数上(函数后括号内)
在上程序中的主函数中也可以写new car().luntai=9;意思是制作一个对象,改变他的轮胎属性
这是对象叫做匿名对象,也是对象的一种简写形式。
a、当我们对对象的方法进行一次调用的时候,则使用匿名对象(一个new就开辟一个堆内存的空间,产生了一个对象)
所以new car().luntai=9;
new car().color="bule"
new car().run();的输出结果是4和red,因为在内存中开辟了三个空间,当读到第二句的时候,第一句已经用完了,就已经是一个垃圾了。
b、匿名对象可以作为实际参数进行传递
public static void show(car c)
{
c.luntai =8;
c.color="bule";
c.run();
}
然后再主函数下直接输入show(new car());//就是定义了一个类类型的对象
那么这个时候上面程序的意思就是把从类car中取的对象全部改变了属性。
类类型的对象接收的肯定是对象。
2、封装
局部变量存放在栈内存中,成员变量存放的堆内存中。
一个程序是由多个类组成的,而其中只有一个类是对立运行的,因为入口是一个就够了(主函数)
private私有的,私有只修饰成员,被私有修饰的成员之在本类中有效。
封装含义就是隐藏实现细节
封装可以提高安全性
封装的最小表现形式就是函数、
私有仅仅是封装的一种在类中的体现形式而已。
通常情况下,我们都会把事物基本属性进行私有化,然后用通用的set.get方法进行公有化。
class person
{
private int age;
String name;
public void setAger(int x)
{
if(x>=0 && x<130)
age=x;
else
System.out.println("nono");
}
Public int getAge()
{
return age;
}
…………
}
3、构造函数
主函数,一般函数,构造函数
特点:
a函数名与类名相同
b不用定义返回值类型
c不可以写return语句
构造函数的出现是用于给对象进行初始化
对象首先是默认初始化,在就是显示初始化,在进行构造函数初始化,可以初始化属性也可以初始化行为
系统默认初始化也是一个构造函数,只是隐藏了,当你在类中已经定义好一个构造函数后,那么那个空的默认的构造函数就没有了。
一般函数是对象建立后才需要被调用,而构造函数是对象建立的时候已经被调用执行了。
先分析事物,事物一建立需要哪些内容就需要定义构造函数。
构造函数的前面有没有修饰符,是根据该函数所在的类所决定的,如果类前面有public等修饰符,那么构造函数前面也有。如果类前面没有那么构造函数前面也没有。
已学三种权限:public/private/什么都不写,默认
4、this关键字(this就代表本类对象)
this代表的是所在函数所属对象的应用。
通俗一点解释就是:this就是一个本类对象。哪个对象调用this所在函数,那么this就代表哪个对象。在本类中调用可以省略不写
a、写this是为了区分局部变量和成员变量的重名情况。
b、当功能(函数)内部又用到了本类对象的时候就用this来表示(什么时候用this)
this语句this();
只有在构造函数之间才可以用this语句进行构造函数调用。
this语句必须要放在调用函数里的第一行。因为构造函数是初始化函数,他的动作必须先执行。
5、static关键字(静态)
静态用来修饰成员(成员变量、成员函数)
被静态修饰的成员随着类的加载而加载
静态有限于对象而存在
静态他被所有对象所共享
静态可以直接被类名所调用 类型.静态对象名
一加载class文件,那么首先是静态成员在内存中开辟空间,但是其他的成员是在创建了对象后才会开辟空间。
*使用静态的注意事项:
a、静态方法(函数)只能访问静态成员
b、 非静态方法既能访问静态成员,也能访问非静态成员
c、静态方法不允许写this、super关键字
d、主函数是静态的,主函数不能直接访问非静态函数
e、对象能调用静态或者非静态都可以
静态随着类的加载而加载,随着类的消失而消失,意思就是静态的生命周期特别长,非常占用内存空间。所以在主函数里,我们可以通过对象调用非静态成员。
非静态成员会随着对象的加载而加载,也随着对象的消失而消失。
被静态修饰的变量都是类变量(区分开类类型变量)
6.主函数的意义
public是一个权限修饰符,他要被jvm所调用
static随着类的加载而加载,不需要对象就能使用
void是返回值类型,因为没有返回值,所以用void,主函数末尾有return,只是系统省略了
main因为jvm只认识这个主函数名,不是关键字
String[] args是一个参数,字符串数组型参数
args就是一个变量名,是可以改的,是主函数唯一可以更改的地方,只要是合法变量名都可以用。args的全称是arguments,参数的意思。
String可以转换成别的类型,JVM只认识这个String
主函数能够传值
只有实体才有哈希值
String[] args默认是一个长度为0的数组String[] args=new String[0]
class DemoMain
{
public static main(String[] args)
{
String[] x={"haha","hehe","xixi","hiahia"};
Test.main(x);//主函数直接被类名调用
}
}
class Test
{
int x=3;
public static void man(String[] args)
{
for(int x=0;x<args.length;x++)
{
System.out.print(args[x]);
}
}
}
所以主函数可以被类名调用