一.面向对象的四大支柱:
- 1.抽象:定义一个类的过程就是抽象的过程(数据抽象、行为抽象),
通过抽象我们可以将数据和操作数据的方法以“对象”的概念绑定在一起;
抽象的过程是一个仁者见仁智者见智的过程,对同一个对象进行抽象可能会有不同的结果;
- 2.封装:隐藏一切可以隐藏的实现细节,只向外界提供最简单的编程接口;
- 3.继承:从一个已有的类创建一个新类的过程,提供继承信息的叫父类(超类、基类),
得到继承信息的叫子类(派生类、衍生类),继承是是现代码复用的一种手段
- 4.多态: 同样的引用类型调用了相同的方法做了不同的事情
-实现多态的两个关键步骤:1方法重写(注意与方法重载的区别),2对象造型
二.通常程序员能在内存里操控的三块区域
- 栈---快、小-临时变量/局部变量(方法里面的变量)
- 堆---稍慢、特别大(可调整,理论上可以调到物理内存的大小)-对象
- 方法区---代码,常量
三.继承-extends
1.多态的使用
- 同样的类型调用相同的方法(发出同样的消息)但是做了不一样的事情-这就是多态(polymorphism)
- 如何实现多态:
1.方法重写-子类在继承父类得过程中对父类的方法给出自己的实现版本
2.对象造型-用父类型的变量保存子类的对象
2.枚举的定义
- enum
3.instaanceof运算符
- instanceof是一种运算符,可以判断对象是不是某种类型,结果产生的是布尔值
- 该运算符是在程序运行时判断对象的类型-RTTI
4.抽象类和抽象方法-abstract
- 抽象方法:
1.一个方法暂时无法给出实现,那么可将其声明为抽象方法;用abstract关键字修饰,且没有方法体
2.一个类如果包含抽象方法(说明该类不完整),那么该类也必须要声明为抽象类
3.抽象类不能实例化(不能创造抽象类的对象)
4.抽象类是专门留给其他类去继承的类
5.方法重写(注意与方法重载的区别)
@Override
方法重写(置换,覆盖,覆写),父类有这个方法可能实现了,可能没实现
子类把父类的这个方法重新实现一次(给出自己的版本)
- 重载:同一个类中有同名的方法,只要参数列表不相同就可以共存-overload
- 重写:子类在继承父类当中对父类已有的方法给出新的实现版本-override
6.四种访问修饰符
java四种访问修饰符:private<default<protectd<public
- 1.private:同类
- 2.default:同类,同包
- 3.protected:同类,同包,子类
- 4.public:同类,同包,子类,不同包
package Day12_12_01;
public class PetTest
{
public static void main(String[] args)
{
//temp在栈上,它保存了堆上的Cat对象的地址
//通过temp就可以找到堆上的对应的Cat对象并给对象发消息
//所以我们通常把对象类型的变量称为对象的引用
//java中的类型分为两大类:
// 1.基本数据类型(8种)和枚举类型
// 2.引用类型
Pet temp=new Cat("花花", Sex.FEMLE, "蓝色");
Pet[] petsArray=
{
new Dog("旺财", Sex.MALE, true),
new Cat("咪咪", Sex.FEMLE, "黄色"),
new Dog("欢欢", Sex.FEMLE, false),
new Pig("发财", Sex.FEMLE,100)
};
for(Pet pet:petsArray)
{
pet.eat();
pet.play("球球");
pet.makeVoice();
if(pet instanceof Dog)
{
((Dog) pet).keepTheDoor();
}else if(pet instanceof Cat){
((Cat) pet).climbUpTheTree();
}else if(pet instanceof Pig){
System.out.println(pet.getNickname()+"重"+((Pig) pet).showWeight()+"公斤");
}
}
}
}
- 父类
package Day12_12_01;
/**
* 宠物
* @author YY
*
*/
public abstract class Pet
{
private String nickname;
private Sex sex;
/**
*构造器
* @param nickname
* @param sex
*/
public Pet(String nickname, Sex sex)
{
this.nickname = nickname;
this.sex = sex;
}
/**
*得到名字
* @return
*/
public String getNickname()
{
return nickname;
}
/**
* 得到性别
* @return
*/
public String getSex()
{
return sex==Sex.MALE?"公":"母";
}
/**
* 吃东西
*/
public void eat()
{
System.out.println(nickname + "正在吃东西");
}
/**
* 玩耍
* @param thing 玩的东西
*/
public void play(String thing)
{
System.out.println(nickname + "正在玩" + thing);
}
/**
* 发出声音
*/
public abstract void makeVoice();
}
- 子类-Cat
package Day12_12_01;
public class Cat extends Pet
{
private String colorOfEye;
public Cat(String nickname, Sex sex,String colorOfEye)
{
super(nickname, sex);
this.colorOfEye=colorOfEye;
}
public String getColorOfEye()
{
return colorOfEye;
}
public void climbUpTheTree()
{
//this可以换成super,或者去掉
System.out.println(this.getNickname()+"正在爬树");
}
@Override
public void makeVoice()
{
System.out.println(this.getNickname()+"喵喵叫");
}
}
- 子类Dog
package Day12_12_01;
/**
* 狗类
*
* @author YY
*
*/
public class Dog extends Pet
{
private boolean large;
/**
* 构造器
*
* @param nickname
* @param sex
* @param large
*/
public Dog(String nickname, Sex sex, boolean large)
{
super(nickname, sex);
this.large = large;
}
/**
* large的访问器
*
* @return
*/
// 布尔类型的访问器前缀不是get,而是is;
public boolean isLarge()
{
return large;
}
/**
* 看
*/
public void keepTheDoor()
{
System.out.println(this.getNickname() + "正在看门");
}
public void makeVoice()
{
System.out.println(this.getNickname()+"汪汪叫");
}
}
- 子类Pig
package Day12_12_01;
public class Pig extends Pet
{
private int weight;
public Pig(String nickname, Sex sex,int weight)
{
super(nickname, sex);
this.weight=weight;
}
public int showWeight()
{
return this.weight;
}
@Override
public void makeVoice()
{
System.out.println(this.getNickname()+"猪猪叫");
}
}
- 枚举的定义
package Day12_12_01;
public enum Sex
{
MALE,FEMLE
}