高内聚,低耦合:
高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
低耦合:仅暴露少量的方法给外部使用。
一、封装:
含义:
1. 指把对象的属性和行为看成一个密不可分的整体,将这两者“封装”在一个密不可分的独立单位(即对象)中;
2. 指“信息隐藏”,把不需要外界知道的信息隐藏起来,有些对象的属性及行为为允许外界用户知道或使用,但不允许更改,而另一些属性或行为,则不允许外界知道,或只允许使用对象的功能,而尽可能隐蔽对象的功能实现细节。通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。
public class Student {
//姓名
private String name;
//手机号码
private String number;
//性别
private char sex;
//年龄
private int age;
//提供一些可以操作这个属性的方法
//提供一些public的get、set方法
//get 获得这个数据
public String getName(){
return this.name;
}
//set 给这个数据设置值
public void setName(String name){
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age > 120 || age < 0) {
this.age = 3;
}else{
this.age = age;
}
}
}
/*
封装
*/
public class Application {
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("燚晗");
s1.setAge(18);
s1.setSex('女');
s1.setNumber("186XXXX7052");
Student s2 = new Student();
s2.setName("杨焕");
s2.setAge(23);
s2.setSex('男');
s2.setNumber("173XXXX2809");
System.out.println("姓名:"+
s1.getName()+"\n"+"年龄:"+s1.getAge()+"\n"+
"性别:" + s1.getSex()+"\n"+
"手机号码:"+s1.getNumber()+"\n");
System.out.println("姓名:"+
s2.getName()+"\n"+"年龄:"+s2.getAge()+"\n"+
"性别:" + s2.getSex()+"\n"+
"手机号码:"+s2.getNumber());
}
}
二、继承:
extends的意思是"扩展"。子类是父类的扩展。
Java只有单继承(这样理解:一个儿子只能有一个爸爸,一个爸爸可以拥有多个儿子),没有多继承!实现多继承要用interface。
继承只是类与类之间的一种关系。除此之外,还有依赖、组合、聚合等。
继承关系的俩个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。
子类和父类之间,从意义上讲应该具有"is a"的关系。
子类可以继承父类的所有方法。
在子类方法中访问一个变量:
1.子类局部范围找
2.子类成员范围找
3. 父亲成员范围找
4. 如果都没有就报错(不考虑 父亲的父亲)
继承中构造方法的访问特点:
子类中所有的构造方法(无参/带参构造)默认会访问父类中无参的构造方法!原因: 1. 因为子类会继承父类的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化; 2. 每一个子类构造方法的第一条语句默认都是:super()。
this指向当前类、super指向父类,访问父类的属性
重写:需要有继承的关系,子类继承父类的方法!
* 重写都是方法的重写,和属性无关
* //A是子类,B是父类。父类B的引用指向子类A
1.方法名必须相同、参数列表必须相同
2.子类不可以重写父类中的私有方法(private)
3.修饰符:子类的修饰符访问权限不可以低于父类的修饰符的访问权限(范围可以扩大:public > protect > default > private)
4.重写可能抛出异常:范围,可以缩小,但不能扩大;ClassNotFoundException -->Exception(大)
重写,子类的方法和父类要一致:方法体不同!
为什么需要重写:父类的功能,子类不一定需要,或者不一定满足;
快捷键:Alt + Insert,然后选中overside;
方法重写 VS 方法重载(覆盖):
区别 | 重写 | 重载 |
---|---|---|
英文: | override | overload |
位置不同: | 同一个类中 | 子类和父类间 |
作用不同: | 在一个类里面为一种行为提供多种实现方式并提高可读性 | 父类方法无法满足子类的要求,子类通过方法重写满足要求 |
修饰符: | 无关 | 大于等于 |
返回值: | 无关 | 小于等于 |
方法名: | 相同 | 相同 |
参数: | 不同 | 相同 |
抛出异常: | 无关 | 小于等于 |
public class Animals {
private String name;
private int age;
public Animals() {
}
public Animals(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Cat extends Animals {
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
public void catchMouse(){
System.out.println("开始抓老鼠!");
}
}
public class Dog extends Animals {
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
public void lookDoor(){
System.out.println("狗开始看门!");
}
}
/*
继承
*/
public class Test {
public static void main(String[] args) {
Cat cat = new Cat();
cat.setName("汤姆");
cat.setAge(3);
System.out.println(cat.getName()+","+cat.getAge());
cat.catchMouse();
Dog dog = new Dog("小黑",5);
System.out.println(dog.getName()+","+dog.getAge());
dog.lookDoor();
}
}
三、多态:
即同一方法可以根据发送对象的不同而采用多种不同的行为方式
public class Animal {
public int age = 40;
public void eat(){
System.out.println("动物吃东西~");
}
}
public class Cat extends Animal { //多态条件一 : 继承
public int age = 20;
public int weight = 10;
@Override //多态条件二 : 重写
public void eat() {
System.out.println("猫爱吃鱼!");
}
public void playGame(){
System.out.println("猫捉迷藏!");
}
}
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗爱吃骨头!");
}
}
public class AnimalOperator {
public void useAnimal(Animal a){
a.eat();
}
}
public class AnimalDemo {
public static void main(String[] args) {
/*
// 多态条件三 : 用父类引用子类对象
Animal a = new Cat();//多态的形式创建的对象
System.out.println(a.age); //结果输出:40
// System.out.println(a.weight); //报错,Animals中没有weight
a.eat(); // 结果输出:猫吃鱼
// a.playGame(); //报错,Animals中没有playGame()
*/
//创建动物操作类的对象,调用方法
AnimalOperator ao = new AnimalOperator();
Cat c = new Cat();
ao.useAnimal(c);
Dog d = new Dog();
ao.useAnimal(d);
}
}
/*
Animals a = new Cat();//多态的形式创建的对象
多态的形式访问成员变量:编译看左边(父类Animals),运行看左边(父类Animals)
多态的形式访问成员方法:编译看左边(父类Animals),运行看右边(子类Cat)
*/