1、面向对象
把大象装进冰箱的例子,冰箱就是对象;冰箱.打开,冰箱.存储,冰箱.关闭。
面向对象特征:封装,继承,多态。
开发:找对象,建对象,用对象。以及维护对象之间的关系。
类和对象的关系:
类就是现实生活中的事物的描述。是对具体对象的抽象。
对象就是这类事物实实在在存在的个体。
映射到Java中,描述就是class定义的类。具体对象就是对应Java在堆内存中的实体。
定义类,就是描述事物,就是在定义属性和行为。属性和行为共同成为类中的成员(成员变量和成员方法);
属性对应的是类中变量,行为对应的是类中的函数();
先创建一个car类,用new建立对象
Car c=new Car(); //创建一个c变量,c是类类型变量。
类类型变量,是一种引用型变量,就是把一个变量指向一个对象,具体的实体。
成员变量和局部变量:
作用范围:成员变量作用于整个类中。局部变量作用于函数中,或者语句中。
内存中的位置:成员变量在堆内存中,因为对象的存在,才在内存中存在。局部变量存在栈内存中。
匿名对象:
匿名对象是对象的简化形式
匿名对象两种使用情况:①、当对象方法仅进行一次调用时(调用属性没意义),如果对一个对象进行多个成员调用,必须给这个对象起个名字。
②、匿名对象可以作为实际参数进行传递
2、封装
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
优点:将变化隔离;便于使用;提高重用性;提高安全性。
封装原则:①、将不需要对外提供的内容都隐藏起来。
②、把属性都隐藏,提供公共方法对其访问。
private关键字:私有,权限修饰符;用于修饰类中的成员(成员变量,成员函数)。私有变量只在本类中有效。
将变量私有化以后,类以外即使建立了对象也不能直接访问,对外提供对应的set、get方法对其进行访问,提高对数据访问的安全性。
一个成员变量,通常对应两个访问方式。一个获取,一个输出。
注意:私有仅仅是封装的一种表现形式。
之所以对外提供访问方式,就是因为可以在访问方式中加入逻辑判断等语句,对访问的数据进行操作。提高代码的健壮性。
3、构造函数
特点:函数名与类名相同;不要定义返回值类型;不可以写return语句;
作用:给对象进行初始化(对象一建立就会调用与之对应的构造函数)
注意:默认构造函数的特点;(当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数;当在类中自定义了构造函数后,默认的构造函数就没有了)
多个构造函数是以重载的形式存在的。
构造函数与一般函数的区别:
①、 格式不同
②、 运行上不同:构造函数是在对象一建立就运行,给对象初始化;而一般方法是对象调用才执行,给对象添加对象具备的功能。
③、 一个对象建立,构造函数只运行一次(再运行构造函数,要重新建立一个新对象),而一般方法可以被该对象调用多次。
什么时候定义构造函数?
答:当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中。
构造代码块:对象一建立就运行,而且优先于构造函数执行。
作用:给对象进行初始化。
构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化。
构造代码块中定义的是不同对象共性的初始化内容。
关键字this:区分成员变量和局部变量(变量出现同名时,一定要用this区分)
this代表它所在函数所属对象的引用,简单说,哪个对象在调用this所以的函数,this就代表哪个对象。
同一个类中,成员变量之间的调用,实际都是不同对象的调用。
this的应用:当定义类中功能时,该函数内部要用到该函数的对象时,这时用this来表示这个对象。但凡本类功能内部使用了本类对象,都有this表示。
构造函数间的调用要用this语句调用【this(参数);】,而不可以用普通的:【函数名();】
一般函数,不能调用构造函数。因为this语句只能用于构造函数间。
this语句只能定义在构造函数中的第一行。因为初始化动作要先执行。
Day51.java
/*
面向对象/封装private
*/
class Person
{
privateint age; //定义一个私有的age变量,把它的属性封装
publicvoid setAge(int a) //在set方法中对输入的age值进行逻辑判断
{
if(a>0 && a<130)
{
age=a;
speak();
}
else
System.out.println("feifaage");
}
publicint getAge() //get方法
{
return age;
}
voidspeak()
{
System.out.println("age="+age);
}
}
class Day51
{
publicstatic void main(String[] args)
{
Person p=new Person(); //创建类Person的p对象
p.setAge(-30); //a赋值给的是对象p中的age,不是私有的那个age
//p.age(20);
//p.speak(20);
}
}
Day52.java
/*
构造函数
函数的重载以及与一般函数的区别
*/
class Person
{
privateString name;
privateint age;
/*
构造代码块
因为对象都具有cry()的功能
*/
{
System.out.println("person coderun");
cry();
}
Person()
{
System.out.println("A:name="+name+",,,,age="+age);
//cry(); 方法中的,只有在创建对象时调用一次
}
Person(Stringa) //函数的重载
{
name=a;
System.out.println("B:name="+name+",,,,age="+age);
}
Person(Stringa,int b)
{
name=a;
age=b;
System.out.println("C:name="+name+",,,,age="+age);
}
publicstatic void cry()
{
System.out.println("cry!!!!!!!");
}
}
class Day52
{
publicstatic void main(String[] args)
{
Person p1=new Person();
//p1.cry(); 对象p1可以多次调用cry()这个功能
Person p4=new Person(); //每次创建,都是一个新的对象,且对象名不可相同
Person p2=newPerson("KAI"); //根据方法中定义的参数的个数和类型,调用对应的函数
Person p3=new Person("LAI",17);
}
}
Day53.java
/*
关键字this的应用
*/
class Person
{
privateint age;
privateString name;
Person(intage) //为了变量读的有意义,局部变量与成员变量同名,此时,用this区分
{
this.age=age;
//System.out.println("age="+age);
}
Person(Stringname,int age)
{
this.name=name;
this.age=age;
}
publicvoid speak()
{
System.out.println("A:name="+name+",,,,age="+age);
}
/*
判断两个人,是否是同龄人
*/
publicboolean compare(Person p) //只需传一个人的属性就可以进行比较,所以不可以定义两个person
//p2是参与比较的对象,所以,p2的age传给了这里的p
{
return this.age==age; //this.age代表的就是p1的age
//也可以用if语句。赋值“==”本来就具有判断的功能,这样更简便
}
}
class Day53
{
publicstatic void main(String[] args)
{
Person p1=new Person(21);
//p.speak();
Person p2=new Person(20);
boolean b=p1.compare(p2); //p1调用了compare()函数
System.out.println(b);
/*Person p1=newPerson("kai",21);
p1.speak();*/
}
}
Day54.java
/*
this关键字在构造函数间的调用
*/
class Person
{
privateString name;
privateint age;
Person(Stringname)
{
this.name=name;
speak();
}
Person(Stringname,int age)
{
this(name); //调用了Person(String name)
this.age=age;
speak();
}
publicvoid speak()
{
System.out.println("A:name="+name+",,,,age="+age);
}
}
class Day54
{
publicstatic void main(String[] args)
{
Person p=new Person("kai",29);
//Person p1=new Person("lei");
}
}