1-面向对象的三大特征:
1继承、2封装、3多态
什么是类?什么是对象?什么是面向对象?什么是方法?
类是模子,确定对象将会拥有的特征(属性)和行为(方法)(虚拟的)
对象是类的实例化表现 (看得到摸得着)
面向对象:就是关注对象、根据事物特征做程序设计
例如:去宠物店买猫的例子
店员:你要买什么样子的猫呢?
我:我要,小一点的,可爱一点的,不掉毛的猫
然后店员就推荐了一只叫花花英短猫、凡凡的田园猫
进宠物店买猫的过程:
就是面向对象的过程
对象就是这两个实体的猫,类是提出的我要猫的描述,是虚拟的
属性:对象有的静态属性:(体色、名字)
方法:对象能做什么,动态属性:(猫能跑、能跳)
package com.demo.day4.object;
public class Cat {
//成员属性//静态的;对象的特征
String name;//定义猫的名字
int age;//定义猫的年龄
double weight;//定义猫的体重
String species;//定义猫的品质
//成员方法:动态的;可以对象干什么
//猫能跑、能吃
public void run(String name) {
System.out.println(name+"快跑");
}
public void eat(String name) {
System.out.println(name+"吃鱼");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
类实例化对象,对象调用方法
对象名.方法名
对象名.属性
package com.demo.day4.object;
public class CatTest {
public static void main(String[] args) {
// 实例化对象
Cat one=new Cat();
System.out.println("猫的名字"+one.name);
System.out.println("猫的年龄"+one.age);
System.out.println("猫的体重"+one.weight);
System.out.println("猫的品质"+one.species);
//对应一个类当中的成员属性,是有默认值得
/*
* 猫的名字null (String)默认值
* 猫的年龄0 (int)默认值
* 猫的体重0.0 (double)默认值
* 猫的品质null
*/
one.name="花花";
one.run(one.name);
one.eat(one.name);
}
输出结果:
猫的名字null
猫的年龄0
猫的体重0.0
猫的品质null
花花快跑
花花吃鱼
2实例化对象
·实例化对象的过程可以分成两部分
-声明对象 Cat one
-实例化对象 new Cat()
第一步:在内存栈空间中声明了一个one的对象
第二步:在内存堆当中通过new关键字开辟一个新的对象空间
接下来通过赋值符号 Cat one=new Cat();
将在堆当中的内存地址存放到栈里面的对象空间中
此时对象名来操作具体对象的信息,栈中存储其实是堆当中地址的引用
new关键字是在内存堆当中开辟一新空间。
例如:使用new关键字开辟空间相当于做了一栋大房子,通过赋值号,就是将这个房子的钥匙存放到对象名的栈空间,对象名通过这把钥匙,可以对对象进行一系列的操作
如果再声明一个对象名:Cat two=one;
相当于,这个房子的第二把钥匙交给了,two对象名存放的栈空间,two也可以对这个对象进行一系列的操作。
3.构造方法
构造方法必须配合new关键字
语法结构:
1.构造方法与类名必须相同,且没有返回值,可以有参数,也可以无参数
2.构造方法的语句格式
3.只能在对象实例化进行调用 new Cat();
4.当我们再程序当中,没有指定构造方法时,系统会自动添加无参的构造方法
5.当制定有构造方法时,无论是有参、无参的构造方法,系统都不会自动添加无参的构造方法
6.一个类中可以有多个构造方法
7.构造方法不能再普通方法中调用,但可以在构造方法间调用; this();就可以调用,有参数就讲参数放在括号里就可以了。
this();调用重载构造方法,this();必须放在构造方法里的第一条!
this.方法名();调用成员方法
this 关键字:
this.name=name;
this指的是当前对象,谁调用了name的属性,谁就是当前对象
Cat one=new Cat("name");//实例化对象 one调用了name,所以this是指当前one这个对象
--------------------------
//有参构造函数中
public Cat(String name){
this.name=name;
}
构造方法案例:
分别使用无参构造函数,和带参构造函数进行输出:
package com.demo.day4.object;
public class Monkey {
String name;
String feature;
// 无参构造方法
Monkey(){
System.out.println("我是使用无参构造产生的猴子");
}
//带参的构造方法
Monkey(String name,String feature){
System.out.println("我是使用带参构造产生的猴子");
this.name=name;//this指的是当前对象,谁调用这个属性,谁就是当前对象;two调用了
this.feature=feature;
}
public static void main(String[] args) {
//声明并实例化对象
Monkey one=new Monkey();
one.name="长尾猴";
one.feature="尾巴长";
System.out.println("名称:"+one.name);
System.out.println("特征:"+one.feature);
System.out.println("======================");
//声明对象并实例化对象
Monkey two=new Monkey("白头叶猴","头上有毛,喜欢吃树叶");
System.out.println("名称:"+two.name);
System.out.println("特征:"+two.feature);
}
输出:
我是使用无参构造产生的猴子
名称:长尾猴
特征:尾巴长
======================
我是使用带参构造产生的猴子
名称:白头叶猴
特征:头上有毛,喜欢吃树叶