面向对象
一,对象的概念
1.什么是程序
程序是利用计算机帮助用户处理客观存在的事物。
商品 商品 客户
对于程序而言,要实现这些功能第一件事就是将这些现实中的事物用计算机的形式表现出来。
2.对象的概念
对于现实中的用户在计算机的体现如下:
计算机中的对象:复杂的客观事物在Java程序中的一种表现形式。
3.对象的组成
对象包含:
1)静态特征(身高,体重,颜色,年龄,性别,姓名等等),
静态特征被称为:对象的属性
2)动态特征:(能做什么,会做什么:吃喝拉撒,坑蒙拐骗)
动态特征:方法
例如:描述一班班长
Student 属性: 姓名:朱腾飞 年龄:18 性别:男 籍贯:河南 方法: 吃(),喝(),嫖(),赌(),抽(),坑()蒙()拐()骗()偷()
4.什么是类
在计算机中:使用类来对对象进行描述,类用来说明对象有哪些属性, 具有哪些方法
5.类和对象的关系
类是对象的模版,对象是类的实例
一个类可以创建多个对象
二,类和对象的使用
1.类的创建
/**学生类*/
public class Student {
//属性:用变量表示属性,必须在类中方法外
String name;
int age;
String sex;
String address;
/**自我介绍*/
public void introduce(){
System.out.println("姓名:"+name);
System.out.println("性别:"+sex);
System.out.println("年龄:"+age);
System.out.println("籍贯:"+address);
}
/**学习*/
public void study(){
System.out.println(name+"正在学习");
}
}
2.对象的创建
public static void main(String[] args) {
//创建对象,实例化对象
//语法 类名 别名=new 类名(); new 类名()是真正的创建,前边是声明
Student stu=new Student();
//访问对象的属性
//对象名(别名).属性进行访问
stu.name="朱腾飞";//给属性赋值
stu.age=18;
stu.sex="女";
stu.address="高老庄";
//使用属性
String name=stu.name;
System.out.println("姓名:"+name);
System.out.println("籍贯:"+stu.address);
//方法的调用: 对象名.方法名();
stu.introduce();
stu.study();
}
总结:
1.创建对象又叫实例化对象
2.创建对象的语法 类名 别名=new 类名();
3.给属性赋值: 对象名(别名).属性名=值
4.使用属性: 变量类型 变量名= 对象名(别名).属性名
5.调用方法: 对象名.方法名();
三,成员变量与局部变量的区别
** ** | 局部变量 | 成员变量 |
---|---|---|
定义位置 | 定义在方法内 | 定义在类以内,方法以外 |
默认值 | 无默认值 | 具有默认值 |
使用范围 | 从定义位置开始,到定义它的代码块结束 | 至少在本类中有效 |
命名冲突 | 在重合作用范围内,不允许重名 | 可与局部变量重名,局部变量优先 |
public class Dome01 {
int a;
int b=9;
public void aa(){
int c=10;
int d;
//Variable 'd' might not have been initialized没有初始值
System.out.println(d);
System.out.println(a);
System.out.println(c);
if(c>9){
System.out.println(c);
//Variable 'c' is already defined in the scope
int c=10;
}
}
public void bb(){
//Cannot resolve symbol 'c'
//System.out.println(c);局部变量只能在自己的大括号代码块中使用
//可与局部变量重名,局部变量优先
int b=12;
System.out.println(b);//优先使用局部变量
}
}
实例方法
对象的实例方法,包含两部分:方法的声明和方法的实现。 方法的声明: 代表对象能做什么 组成:修饰符 返回值类型 方法名(形参列表)异常 注意:一个方法中可以有多个修饰符(0~n个),并且修饰符之间没有位置先后的顺序。 异常今后课程会详细讲解,不需要关注。 方法的实现: 代表对象怎么做:即如何实现对应的功能。 组成:{}
四,方法重载
1.需求
2.概念.
方法的重载(overload):在一个类中,方法名相同,但是参数列表不同的方法。 方法重载的要求: 方法名相同 形式参数列表不同(个数、顺序、类型) 返回值、修饰符、异常没有要求 注意:两个方法只是参数名字不同,不是方法的重载。 使用: 当程序被编译时,如果出现方法的重载,Java编译器会根据调用者传递的实际参数,来匹配对应的方法。
package com.baizhi.test;
public class Person {
/**吃东西*/
public void eat(){
System.out.println("吃东西");
}
/**吃水果*/
public void eat(String fruits){
System.out.println("在吃水果:"+fruits);
}
/**吃药*/
public String eat(String drugs,int num){
return "吃了"+num+"片"+drugs;
}
public static void main(String[] args) {
Person p=new Person();
p.eat();
p.eat("苹果");
String str=p.eat("阿莫西林",2);
System.out.println(str);
}
}
五,构造方法
1.概念
构造方法:也称为构造器,是一种特殊的方法。 构造方法的语法: 方法名必须和类名一致 没有返回值类型(void都没有):修饰符 类名(形参列表){} 构造方法允许重载 构造方法不允许手动调用 使用:构造方法在创建对象时,JVM自动调用一次 注意: 如果一个类中没有定义构造方法,系统会自动添加一个公开、无参数的构造方法 如果类中已经定义构造方法,系统不会再自动添加公开、无参数的构造方法
2.构造方法的实际应用
对象创建的过程 new :开辟空间,为属性赋默认值 构造方法:调用构造方法 注意:如果属性在定义时有初始化的内容,则JVM会默认将属性初始化的语句移交给到 每一个构造方法内部的最前面
package com.baizhi.test;
/**学生类*/
public class Student2 {
/*构造方法:方法名和类名一致,没有返回值类型 如果没有写构造方法,jvm自动提供一个无参构造
* 构造器在对象创建时执行* */
public Student2(){
System.out.println("无参构造器执行了!!!");
}
//添加有参构造的快捷方式 ALT+Insert +constructor
public Student2(String name,int age,String sex,String address){
//使用有参构造器可以给属性 动态赋值
//this代表当前对象,用在本类的成员方法和或构造方法中,
//代表访问当前对象的属性或方法
this.name=name;
this.age=age;
this.sex=sex;
this.address=address;
System.out.println("有参构造执行了");
}
String name;
int age;
String sex;
String address;
/**自我介绍*/
public void introduce(){
System.out.println("姓名:"+name);
System.out.println("性别:"+sex);
System.out.println("年龄:"+age);
System.out.println("籍贯:"+address);
}
/**学习*/
public void study(){
System.out.println(name+"正在学习");
}
}
public static void main(String[] args) {
Student2 s=new Student2();
Student2 s2=new Student2("zs",18,"男","河南焦作");
s2.introduce();
}
3.this关键字
this的第一种应用:this.
含义:this代表当前对象,用在本类的成员方法和或构造方法中,代表访问当前对象的 属性或方法
this.属性名:代表访问当前对象的属性
this.成员方法名(实参); : 代表访问当前对象的成员方法
注意:this 通常可以省略,但是当成员变量和局部变量命名冲突时,必须使用 this.区分实例变量**
this的第二种应用:this()
this()用在本类的构造方法第一行,代表调用本类的其他构造方法 应用: this():调用无参数的构造方法 this(实参):调用有参数的构造方法 注意: this()/this(实参) 不能递归应用 如果一个构造方法的第一行语句为this()/this(实参),则JVM不再移交给此构造方法 属性初始化的语句。
Dome02(){
this(18,20.5);//调用有参构造
System.out.println("无参构造");
}
public Dome02(int age, double score) {
//this();//Recursive constructor invocation递归调用
this.age = age;
this.score = score;
//调用构造函数必须在第一行
//this();//Call to 'this()' must be first statement in constructor body
}
引用
Java中的数据类型分为基本数据类型和对象数据类型。其中基本数据类型有8种,对应的变量称为基本数据类型变量;除了8种基本数据类型以外,其余都是对象类型,那么对象类型的变量称为引用。
-
引用:存储对象在堆空间的地址
-
每一个新创建的对象在堆空间中相互独立
-
引用可以先声明,再赋值,null可以作为引用的初始数据
-
如果以null调用对象的属性和方法,则运行报错,错误信息为: java.lang.NullPointerException(空指针异常)
-
引用之间传递的是对象在堆空间中的地址;基本数据类型的变量传递的是数值