Target:
1. 了解面对对象的三大特征。(继承性、封装性、多态性)
2. 掌握类与对象的关系、定义和使用。
3. 掌握对象的创建格式,可以创建多个对象。
4. 掌握对象的内存分配过程。
5. 掌握封装性的概念和使用。
6. 掌握构造方法的定义格式、调用时机、构造方法的重载、构造方法的私有化意义。
7. 掌握匿名对象的概念及应用。
8. 掌握String类的特点及其主要的操作方法。
9. 掌握this关键字的作用,并可以使用this关键字完成对象的比较操作。
10. 掌握static关键字的作用,并可以阐述出static属性及static方法的特点。
11. 掌握主方法的组成及运行时的参数传递。
12. 掌握java中的普通代码块、构造块、静态块3种代码块的使用方法。
13. 掌握内部类的特点及应用,以及内部类调用方法中参数的要求。
5.1面对对象的基本概念
1.封装性:一层含义是指把对象的属性和行为看成一个整体;另一层含义指”信息隐蔽”,为封装在一个整体内的变量及方法规定不同级别的“可见性”或访问权限。
2.继承性: 大大增强了程序代码的可复用性,提高开发效率,降低程序产生错误的可能性,为程序的修改扩充提供了便利。
*****只能单继承,JAVA通过接口interface的方式来弥补了不能多继承的问题******
*****多继承,子类可以共享多个父类的成员特点*******
3.多态性:多态是允许程序中出现重名现象。JAVA语言中含有方法重载与对象多态两种形式的多态。
**方法重载:在一个类中,允许多个方法使用同一个名字,但是方法的参数不同,功能也不同**
**对象多态: 子类对象可以与父类对象进行相互转换,而且根据其使用的子类的不同,完成的功能也不同**
*******多态使程序的抽象程度和简捷程度更高*******
5.2类与对象
1.类和数组都属于引用数据类型,引用数据类型的定义格式及实例化 栈内存里面包成的是堆内存的访问地址,new关键字开辟堆内存空间。
2.类的定义class XXX {},对象的创建 XXX yyy = new XXX()
3.访问对象中的属性和方法: 对象名称.属性名 对象名称.方法名()
*******对象使用前必须实例化*******
4.一个栈内存空间只能指向一个堆内存空间,如果再指向其他的堆内存空间,必须先断开已有的指向才能分配新的指向。没有被任何栈内存空间所引用的堆内存空间形成垃圾空间,等待垃圾收集机制Garbage Collection (GC)进行回收。
5.3 封装性 就是对外部不可见
1.为属性封装:private属性类型 属性名称;
为方法封装:private 方法返回值 方法名称(参数列表){}
2.为解决属性必须封装且又必须访问的矛盾,JAVA开发中队私有属性的访问有了一下的明确定义:”只要是被封装的属性,则必须通过setter和getter方法设置和取得”.此时,setter和getter方法应该是public的。另外,java反射机制会利用setter和getter设置和取得属性内容。
*****类中的方法直接写上方法名称就可以完成本类中的方法调用,如果在此时非要强调是本类中的方法,也可以在调用时按“this.方法名()”的形式编写*****
*****在代码中是否使用this明确地表示当前类中的方法并没有严格要求,建议最好采用“this.方法名()”的形式,比较标准一点,查错时也更加方便*****
5.4构造方法
1.构造方法可以在对象实例化时就直接把对象的值赋给属性。
2.在面对对象程序中,构造方法的主要作用是为类中的属性初始化。
构造方法定义格式:
class类名称{
访问权限 类名称 (类型1 参数1,类型2 参数2, …… ){
程序语句;
……. //构造方法没有返回值!!
}
}
在构造方法的声明中,要注意以下几点:
-
构造方法的名称必须与类名一致
-
构造方法的声明处不能有任何返回值类型的声明
-
不能在构造方法中使用return返回一个值
-
在类中定义了构造方法,但是只有当调用new关键字实例化对象时才会调用构造方法
-
只要是类就必须存在构造方法,在Java中如果一个类中没有明确地声明一个构造方法,在编译时会直接生成一个无参数的、什么都不做的构造方法
-
一个类中应保证至少有一个构造方法
-
构造方法也是可以重载的,只要每个构造方法的参数类型或参数个数不同,即可实现重载
5.5匿名对象
匿名对象就是没有明确给出名字的对象。一般匿名对象只使用一次,而且匿名对象只在堆内存中开辟空间,而不存在栈内存的引用。
匿名对象在实际开发中基本上都是作为其他类实例化对象的参数传递的,匿名对象实际上就是一个堆内存空间。
*****对象不管是匿名还是非匿名,都必须在开辟堆内存空间之后才可以使用*****
5.6 实例讲解 -- 类设计分析
分析的思路:
-
根据要求写出类所包含的属性
-
所有的属性都必须进行封装private
-
封装之后的属性通过setter和getter设置和获取
-
如果需要,可以加入若干个构造方法
-
-
再根据其他要求添加相应的方法
-
类中的所有方法都不要直接输出,而是交给被调用处输出。
题目: 定义并测试一个名为Student的类,包括的属性有“学号”、“姓名”以及3门课程“数学”、“英语”和“计算机”的成绩,包括的方法有计算机3门课程的“总分”、“平均分”、“最高分”和“最低分”。
-
本类中的属性及类型
序号 属性 属性类型 属性名称
1 学号 String stuno
2 姓名 String name
3 数学成绩 float math
4 英语成绩 float English
5 计算机成绩 float computer
-
定义出需要的方法
在本例中设计两个构造方法,一个是无参的构造方法,另外一个构造方法可以为5个属性进行赋值
序号 方法名称 返回值类型 作用
1 setXXX() && getXXX() 设置和取得5个属性值
2 sum(),avg(),max(),min() 求计算机课程的各项分
3 student(), student(string stuno, string name,float math, float english, float computer)构造方法
-
编写代码
class Student{
private String stuno;
private String name;
private float math;
private float english;
private float computer;
public Student(){
}
public Student(String stuno, String name, float math, float english, float computer){
/*
this.stuno = stuno;
this.name = name;
this.math = math;
this.english = english;
this.computer = computer;
//need to call method to set value to dimension
*/
this.setStuno(stuno);
this.setName(name);
this.setMath(math);
this.setEnglish(english);
this.setComputer(computer);
}
public void setStuno(String stuno){
this.stuno = stuno;
}
public String getStuno(){
return this.stuno;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setMath(float math){
this.math = math;
}
public float getMath(){
return this.math;
}
public void setEnglish(float english){
this.english = english;
}
public float getEnglish(){
return this.english;
}
public void setComputer(float computer){
this.computer = computer;
}
public float getComputer(){
return this.computer;
}
public float sum(){
return math + english + computer;
}
public float avg(){
return this.sum()/3;
}
public float max(){
float max = math;
max = max > english ? max : english;
max = max > computer ? max : computer;
return max;
}
public float min(){
float min = math;
min = min < english ? min : english;
min = min < computer ? min : computer;
return min;
}
}
public class StructureDemo
{
public static void main(String[] args){
Student stu = null;
stu = new Student("MLDN-33", "Lixinghua", 95.0f, 89.0f, 96.0f);
System.out.println("student No. is " + stu.getStuno());
System.out.println("student name is " + stu.getName() );
System.out.println("math is " + stu.getMath());
System.out.println("english is " + stu.getEnglish());
System.out.println("computer is " + stu.getComputer());
System.out.println("max is " + stu.max());
System.out.println("min is " + stu.min());
System.out.println("avg is " + stu.avg());
System.out.println("sum is " + stu.sum());
}
}
tips: java编译时出错 ... error: class, interface, or enum expected.
出现该问题的几类原因:
1. class等关键字拼写错误 (class关键字在我编写时头字母自动转换成大写了!!!!!)
2. 缺少括号或多括号
3. UE的编码格式不对
解决方法:
1. 检查关键字的拼写
2. 仔细检查,若代码过长,可使用二分法(注释掉一半代码进行编译。再注释掉一半代码,再编译....)直到找到出问题的代码行
3. 检查编辑器的格式。若格式错误,同样会出现下面的错误
error: unmappable character for encoding GBK.