马士兵JAVA视频教程第03章面向对象.docx
《马士兵JAVA视频教程第03章面向对象.docx》由会员分享,可在线阅读,更多相关《马士兵JAVA视频教程第03章面向对象.docx(61页珍藏版)》请在冰点文库上搜索。
![马士兵JAVA视频教程第03章面向对象.docx](https://file1.bingdoc.com/fileroot1/2023-7/12/586d4df2-6fb2-47c8-8f4b-6ca2f1622806/586d4df2-6fb2-47c8-8f4b-6ca2f16228061.gif)
马士兵JAVA视频教程第03章面向对象
第三章.面向对象编程
一、面向对象编程思想:
从现实世界中客观存在的事物出发来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式
面向对象更加强调运用人类在日常的思维逻辑中经常才赢的思想方法与原则,如抽象分类,继承,聚合,多态
二、对象和类的概念
1.对象用计算机语言对问题域中事物的描述,对象通过“属性(attribute)”和“方法(method)”来分别对应事物所具有的静态属性和动态属性
对象是属性(成员变量)和方法的集合。
{一类事物的具体的某一个东西(符合这类事物的具体特征的某个东西)叫对象}
2.类是同种对象的集合与抽象,类中定义了这一类对象所应具有的静态和动态属性。
关系:
类可以看成一类对象的模板,对象可以看成该类的一个具体实例,瓶子是一个类,某个瓶子就是对象
三、面向对象设计思想和步骤:
(1)分析问题中有哪些类那些对象
(2)分析这些对象中应该具有的属性和方法
(3)分析类与类之间的关系
四、Java与面向对象
1.对象是Java程序的核心,在java程序中“万事万物皆对象”。
(先定义类才有对象)
2.对象可以看成静态属性(成员变量)和动态属性(方法)的封装体
3.类是用来创建统一类型的对象的“模板”,在一个类中定义了该类对象所应具有的成员变量以及方法
4.J2SDK提供了很多类供编程人员使用,编程人员也可以自定义自己的类
5.
五、Java类的定义
类的定义主要由成员变量和方法组成
声明成员变量:
[]type[=defaultValue]
例如:
privateintid;privateintage=20;
声明方法:
[]([]){
[]
}
例如:
publicintgetAge(){returnage;}
publicclassPerson{
intid;
intage=20;
voidPerson(int_id,int_age){
id=_id;
age=_age;
}
publicstaticvoidmain(String[]args){
Persontom=newPerson();
tom.Person(1,25);
//Personjerry=newPerson();
Pointp=newPoint();
}
}
classPoint{
Point(){}
intx;
inty;
}
六、成员变量:
1:
成员变量可以使用java语言中任何一种数据类型(包括基本类型和引用类型);2:
作用范围为整个类体;3:
在定义成员变量时可以对其初始化,如果不对其初始化,,java系统会默认给你赋初始值
注意:
局部变量必须赋初始值才可以使用
Byte,short,int---->0
Long----->0L
char----->’\u0000’
float----->0.0F
double----->0.0D
bloolean----->false
所有引用类型----->Null
七、引用类型(C中的指针,占两块内存)
除了java语言中基本类型以外的变量类型
Java中的对象是通过引用对其操作的内存值
/*声明string类型的引用变量,但是没使它指向一个对象*/
Stringsnull
/*使用new语句创建一个String类型的对象并
用S指向它,以后可以通过S完成对其的操作*/
S=newString(“helloworld!
”);0X3a123b
如何在内存中区分类和对象?
类是静态的概念,代码区
对象是new出来的,位于堆内存,类的每个成员变量在不同的对象中都有不同的值(除了静态变量)
而方法只有一份,执行的时候才占用内存
八、对象的创建和使用
1.必须使用new关键字创建对象
2.使用:
对象(引用).队员变量来引用对象的成员变量
3.使用:
对象(引用).方法(参数列表)来调用对象的方法
4.同一对象的每个对象有不同的成员变变量存储空间
5.同一类的每个对象共享该类的方法
Java的方法定义
Java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,声明格式为:
[修饰符1修饰符2…..]返回值类型方法名(形式参数列表){
Java语句;………
}
语法解释:
1.形式参数:
在方法被调用时用于接收外界输入的数据。
2.实参:
调用方法时实际传给方法的数据。
3.返回值:
方法在执行完毕后返回给调用它的环境的数据。
4.返回值类型:
事先约定的返回值的数据类型,无返回值,必须给出返回类型viod。
A.Java语言中使用下述形式调用方法:
对象名.方法名(实参列表)
B.实参的数目、数据类型和次序必须和所调用方法声明的形式列表匹配。
C.return语句中止方法的运行并指定要返回的数据。
Java中进行函数调用中传递参数时,遵循传递的原则:
基本类型传递的是该数据本身,引用类型传递的是对象的引用,不是对象本身
九、类和对象关系(内存中)
一十、构造函数2009-12-913:
44
构造函数是定义在java类中的一个用来初始化对象的函数
1.构造函数名字与类的名字相同,大小写也保持一致
2.使用new+构造方法创建一个新的对象
3.构造函数与类同名且没有返回值。
即便是void也不能写
4.注意:
当无指定构造函数时,编译器为类自动添加形为:
类名(){}的构造方法
例如:
Person类的构造函数
publicclassPerson{
intid;
intage=20;
Person(int_id,int_age){
Id=_id
Age=_age;
}
}
Publicstaticvoidmain(String[]agrs){
Persontom=newPerson(1,25);
Personjrry=newPerson(1,27);
}
内存详细过程详解:
一十一、约定俗成的命名规则
类名的首字母大写
变量名和方法名的首字母小写
运用驼峰标示
一十二、内存分析过程
视频:
J2SE_5.0_第03章_面向对象06_内存解析_1.avi07_内存解析_2.avi
源码:
TestBirthdate\Test.java
classBirthDate{
privateintday;
privateintmonth;
privateintyear;
publicBirthDate(intd,intm,inty){
day=d;
month=m;
year=y;
}
publicvoidsetDay(intd){
day=d;
}
publicvoidsetMonth(intm){
month=m;
}
publicvoidsetYear(inty){
year=y;
}
publicintgetDay(){
returnday;
}
publicintgetMonth(){
returnmonth;
}
publicintgetYear(){
returnyear;
}
publicvoiddisplay(){
System.out.println
(day+"-"+month+"-"+year);
}
}
publicclassTest{
publicstaticvoidmain(Stringargs[]){
Testtest=newTest();
intdate=9;
BirthDated1=newBirthDate(7,7,1970);
BirthDated2=newBirthDate(1,1,2000);
test.change1(date);
test.change2(d1);
test.change3(d2);
System.out.println("date="+date);
d1.display();
d2.display();
}
publicvoidchange1(inti){
i=1234;
}
publicvoidchange2(BirthDateb){
b=newBirthDate(22,2,2004);
}
publicvoidchange3(BirthDateb){
b.setDay(22);
}
}
调用过程演示
(1)
调用过程演示
(2)
调用过程演示(3)
调用过程演示(4)
调用过程演示(5)
调用过程演示(6)
调用过程演示(7)
调用过程演示(8)
调用过程演示(9)
调用过程演示(10)
08_内存解析_3.avi
练习:
视频:
09_练习.avi10_答案.avi11_内存解析.avi
源码:
TestPoint\TestPoint.java
classPoint{
doublex,y,z;
Point(double_x,double_y,double_z){
x=_x;
y=_y;
z=_z;
}
voidsetX(double_x){
x=_x;
}
doublegetDistance(Pointp){
return(x-p.x)*(x-p.x)+(y-p.y)*(y-p.y)+(z-p.z)*(z-p.z);
}
}
publicclassTestPoint{
publicstaticvoidmain(String[]args){
Pointp=newPoint(1.0,2.0,3.0);
Pointp1=newPoint(0.0,0.0,0.0);
System.out.println(p.getDistance(p1));
p.setX(5.0);
System.out.println(p.getDistance(newPoint(1.0,1.0,1.0)));
}
}
内存调用过程见视频
2009-12-919:
43:
33
一十三、方法重载OverLoad2009-12-1110:
45:
05
方法的重载指一个类中可以定义有相同的名字,但参数个数不同和参数类型不同的多个方法。
调用时会根据不同的参数表选择对应方法
能被编译器区分的方法既是构成重载构造函数(方法)也可以重载见二十三、继承中的构造方法P20
方法重载可以改变返回值的类型。
(不知道为什么2009-12-1221:
24:
11)
例子112_方法重载与内存解析.avi
TestOverLoad.java
publicclassTestOverLoad{
publicstaticvoidmain(String[]args){
Personp=newPerson();
Personp1=newPerson(400);
Personp2=newPerson(2,500);
p.info();
p.info("ok");
}
}
classPerson{
//定义三个灵活的方法
Person(){
id=0;
age=20;
}
Person(int_id){
id=_id;
age=23;
}
Person(int_id,int_age){
id=_id;
age=_age;
}
//成员变量定义
privateintid;
privateintage=20;
//方法定义
publicintgetAge(){returnage;}
publicvoidsetAge(inti){age=i;}
publicintgetId(){returnid;}
voidinfo(){
System.out.println("myidis:
"+id);
}
voidinfo(Stringt){
System.out.println(t+"id"+id);
}
}
例子212_方法重载与内存解析.avi
TestOverload\test.java
publicclassTest{
voidmax(inta,intb){
System.out.println(a>b?
a:
b);
}参数类型不同,可以被
编译器识别
voidmax(shorta,shortb){
System.out.println("short");
System.out.println(a>b?
a:
b);
}
voidmax(floata,floatb){
System.out.println(a>b?
a:
b);参数返回类型不同,构
}成重名不能被编译器
识别
intmax(floata,floatb){
System.out.println(a>b?
a:
b);
}
publicstaticvoidmain(String[]args){
Testt=newTest();
t.max(3,4);
shorta=3;
shortb=4;
t.max(a,b);
}
}
一十四、对象创建与使用_复习与练习
源码:
TestCircle.java视频:
14_TestCircle程序分析_1.avi15_TestCircle程序分析_2.avi16_TestCircle程序分析_3.avi
classPoint{
privatedoublex;
privatedoubley;
Point(doublex1,doubley1){
x=x1;
y=y1;
}
publicdoublegetX(){returnx;}
publicdoublegetY(){returny;}
publicvoidsetX(doublei){x=i;}
publicvoidsetY(doublei){y=i;}
}
//
classCircle{
privatePointo;
privatedoubleradius;
Circle(Pointp,doubler){
o=p;
radius=r;
}
Circle(doubler){
o=newPoint(0.0,0.0);
radius=r;
}
booleancontains(Pointp){
doublex=p.getX()-o.getX();
doubley=p.getY()-o.getY();
if(x*x+y*y>radius*radius)returnfalse;
elsereturntrue;
}
publicvoidsetO(doublex,doubley){
o.setX(x);
o.setY(y);
}
publicPointgetO(){returno;}
publicdoublegetRadius(){returnradius;}
publicvoidsetRadius(doubler){radius=r;}
publicdoublearea(){
return3.14*radius*radius;
}
}
publicclassTestCircle{
publicstaticvoidmain(Stringargs[]){
Circlec1=newCircle(newPoint(1.0,2.0),2.0);
Circlec2=newCircle(5.0);
System.out.println("c1:
("+c1.getO().getX()+","
+c1.getO().getY()+"),"+c1.getRadius());
System.out.println("c2:
("+c2.getO().getX()
+","+c2.getO().getY()+"),"+c2.getRadius());
System.out.println("c1area="+c1.area());
System.out.println("c1area="+c2.area());
c1.setO(5,6);
c2.setRadius(9.0);
System.out.println("c1:
("+c1.getO().getX()+","
+c1.getO().getY()+"),"+c1.getRadius());
System.out.println("c2:
("+c2.getO().getX()+","
+c2.getO().getY()+"),"+c2.getRadius());
System.out.println("c1area="+c1.area());
System.out.println("c1area="+c2.area());
Pointp1=newPoint(5.2,6.3);
System.out.println(c1.contains(p1));
System.out.println(c1.contains(newPoint(10.0,9.0)));
}
}
一十五、this关键字
定义:
在类的方法定义中使用this关键字代表使用该方法的对象引用
使用this(argument_list)调用本类的另外的构造方法
使用this.xxx=xxx获取本类另外一个构造方法传来的值
构造函数和一般成员函数在继承中的区别的练习
使用:
当必须指出当前使用方法的对象是谁时要使用this
有时使用this可以处理方法中成员变量和参数重名情况
this可以看做一变量,它的值是当前对象引用
publicclassLeaf{
inti=0;
leaf(inti){this.i=i;}
leafincreament(){
i++;
returnthis;
}
voidprint(){System.ot.println(“i=”+I);}
publicstaticvoidmain(String[]args){
Leafleaf=newLeaf(100);
Leaf.increament().increament().print();
}
}
一十六、Static关键字
1.在类中,使用是static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对该类的所有对象来说,static成员变量只有一份。
2.用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。
-----静态方法不再是针对某个对象调用,所以不能访问非静态成员
3.可以通过对象引用或者类名(不需实例化)访问静态成员。
4.我觉得就是在使用内部类时使用,如果不需要内部类队形想与其外围类之间有联系,那么可以将内部类声明为static,这通常叫嵌套类.
嵌套类意味着:
1要创建嵌套类的对象,并不需要其外围类的对象.
2不能从嵌套类的对象中访问非静态类的外围类对象!
5.例子源码:
Cat.java视频:
18_static关键字_1.avi19_static_关键字_2.avi
publicclassCat{
privatestaticintsid=0;
privateStringname;
intid;
Cat(Stringname){
this.name=name;
id=sid++;
}
publicvoidinfo(){
System.out.println
("Mynameis"+name+"No."+id);
}
publicstaticvoidmain(Stringarg[]){
Cat.sid=100;
Catmimi=newCat("mimi");
mimi.sid=2000;
Catpipi=newCat("pipi");
mimi.info();
pipi.info();
}
}
一十七、package和import2009-12-1115:
00:
21
1.java引入包(package)机制提供类的多重类命名空间。
2.package语句作为java源文件第一句,指明该文件定义的类所在包。
packagepkg1[.pkg2[.pkg3….]];约定俗成的命名:
com.域名.xxx
3.java编译器把语句对应于文件系统的目录管理,package语句中使用”.”点值指明包(目录)层次