java是一种完全面向对象的编程语言,而类和对象则是面向对象编程的核心。
1,什么是对象
在现实生活中,某一个具体的事物就是一个对象。
比如:一头奶牛,一支铅笔,一辆卡车,一只小怪兽。。。
当我们去描述这些对象时,通常会从这两个方面来进行描述:
当以一个人为例时:
1,特征:身高,体重,年龄,性别,籍贯,姓名。。。
2,行为:吃饭,喝水,打球,跑步,唱歌。。。
而当以一台电脑为例时:
1,特征:型号,生产厂家,尺寸,品牌,颜色,内存,cpu。。。
2,功能:开机,关机,亮度调节,音量调节,显示,运行软件。。。
2,类的组成
程序中的类由两个部分组成;
1,属性:由对象的特征进行定义
2,方法:由对象的行为进行定义
3,类的定义
public class 类名 {
//属性的格式
public 数据类型 属性名;
//方法的格式
public 返回值类型 方法名(数据类型 参数名,...){
}
}
//属性的格式
public 数据类型 属性名;
//方法的格式
public 返回值类型 方法名(数据类型 参数名,...){
}
}
实例化对象的关键字:new
格式:
类名 对象名 = new 类名();
调用属性和方法的格式:
对象名.属性名
对象名.方法名(参数值,...);
格式:
类名 对象名 = new 类名();
调用属性和方法的格式:
对象名.属性名
对象名.方法名(参数值,...);
4,举例(1)
回合制对战游戏:奥特曼和小怪兽进行Pk,直到一方的血量为0时结束战斗
public class Lei {
public static class Autman{ //定义奥特曼类
public int live; //血量属性
public String name; //姓名属性
public void fight(Monster mon){ //定义方法
if(live > 0){
live--;
System.out.println("奥特曼"+name+"被小怪兽"+mon.name+"打了,血量为"+live);
}
if(live == 0){
System.out.println("奥特曼死掉了。。。");
}
}
}
public static class Monster{
public int live;
public String name;
public void fight2(Autman aut){
if(live > 0){
live--;
System.out.println("小怪兽"+name+"被奥特曼"+aut.name+"打了,血量为"+live);
}
if(live == 0){
System.out.println("小怪兽死掉了。。。");
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Autman aut = new Autman(); //实例化对象
aut.name = "大象"; //设置对象初值
aut.live = 10;
Monster mon = new Monster();
mon.name = "小花";
mon.live = 9;
while((aut.live != 0) && (mon.live != 0)){
aut.fight(mon);
mon.fight2(aut);
}
}
}
5,构造函数
1,构造函数的作用: 初始化
this表示谁?
this表示当前调用对象的对象名。
this表示当前调用方法或属性的对象。
this的作用有哪些?
Java中参数名和属性名完全一致的情况下,会优先使用离其最近的参数,然后把参数赋给参数和属性没有任何关系。
此处可以使用this关键字,来区分属性和参数,加上this.的表示属性,没有加的则表示参数。
this(参数值,...) 表示调用对应参数的构造方法
this表示当前调用对象的对象名。
this表示当前调用方法或属性的对象。
this的作用有哪些?
Java中参数名和属性名完全一致的情况下,会优先使用离其最近的参数,然后把参数赋给参数和属性没有任何关系。
此处可以使用this关键字,来区分属性和参数,加上this.的表示属性,没有加的则表示参数。
this(参数值,...) 表示调用对应参数的构造方法
void init(String n,String s,int a){
name = n;
sex = s;
age = a;
}
此时,n,s,a均为局部变量,代表形参
void init(String name,String sex,int age){
this.name = name;
this.sex = sex;
this.age = age;
}
此时,标志该变量属于类中的成员,非局部变量
2,构造函数的规则:
1),函数名必须和类名完全一致
2),不含返回类型
注意:1,构造函数可以被重载,即一个类中可以定义多个构造函数。实例化对象时,系统根据参数的不同,调用不 同的构造函数;
2,一个类中,如果没有定义构造函数,系统会自动为这个类产生一个默认的构造函数,该函数没有参数,也 不做任何事情,如Customer Zhang = new Customer(); 但定义类构造函数后就必须带参,如Customer Zhang = new Customer("张三","男");
6,函数参数的传递
1,简单数据类型,采用值传递
//简单数据类型,采用值传递
public class ZhiChuanDi {
void fun(int a){
a += 1;
}
}
public class Text1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 10; //整形属于简单数据类型
ZhiChuanDi z1 = new ZhiChuanDi();
z1.fun(a); //此时的a和fun()形参的a不是同一个内存单元
System.out.println("a = "+ a);
}
}
2,引用数据类型,采用引用传递
public class YinYong {
void fun(int[] arr){
arr[0] += 1;
}
}
public class Text2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = {10}; //数组和对象都属于引用数据类型
YinYong y = new YinYong();
y.fun(arr); //此时的arr与fun()中的形参不是同一个内存单元,但指向同一数组内存空间
System.out.println("arr[0] = "+arr[0]);
}
}
7,函数重载
一个类中可以定义多个函数名称相同
函数重载的条件:
1,函数参数个数不同;
2,函数参数个数相同,但类型不同;
3,函数参数个数相同,类型相同,但在参数列表中出现的顺序不同
注:函数的返回值不同,不能重载
8,静态变量和静态函数 static
普通成员变量,不同对象各自拥有一份;如果需要定义各个对象各自拥有一份的成员变量,则将其定义为静态变量
例:
public class Customer {
String name;
static String bankname;
}
public class Text3 {
public static void main(String[] args){
Customer cus1 = new Customer();
cus1.name = "张三";
Customer cus2 = new Customer();
cus2.name = "李四";
Customer.bankname = "中国银行";
}
}
(注:静态函数中不能直接访问类中的非静态成员变量和成员函数,也不能用this关键字
同一类中的静态函数可以直接引用另一个静态函数 )
9,访问控制修饰符
1,public:可以在定义它的类的内部被访问,也可以被包内包外所有其他类所访问;
(如果一个类被定义为public类,其类名必须与文件名相同,因此一个.java文件中只能有一个public类)
2,protected:可以在类的内部访问,也可以被这个包中的其他类访问,也可以被包外的其他子类访问
3,default:可以在类的内部被访问,也可以被这个包中 其他类访问
4,private:只能在定义它的类的内部被访问