封装
-
该露的露,该藏的藏
- 我们程序设计要追求“
高内聚,低耦合
”。高内聚就是类的内部数据操作细节我们自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用
- 我们程序设计要追求“
-
封装(数据的隐藏)
- 通常,应禁止直接访问一个对象中的实际表示,而应该通过操作接口来访问,这称为信息隐藏
-
记住这一句话:
属性私有,get/set
package com.oop.demo4;
/**
* 封装 get set方法
*/
public class Student {
//将数据私有化
private String name;
private int age;
private char sex;
//通过get方法去获取属性值
public String getName() {
return name;
}
//通过set方法给属性设置值
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
}
继承
-
继承的本质就是对某一批类的抽象,从而实现对现实世界更好的建模。
-
extents
的意思是“扩展”,子类是父类的扩展 -
java中只有单继承,没有多继承
-
继承是类和类之间的一种关系。除此以外。类和类之间的关系还有依赖、组合、聚合等
-
继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extents来表示
-
子类和父类之间,从意义上讲应该具有“is a”的关系
-
Object类 (所有的类都直接或间接的继承了Object类)
-
super
super注意点: #1.super调用父类的构造方法,必须在构造方法的第一行 #2.super必须只能出现在子类的方法或者构造方法中! #3.super和this不能同时调用构造方法 super和this: #代表的对象不同: this:代表的是本身调用者这个对象 super:代表的是父类对象的引用 #前提: this:没有继承关系也能使用 super:只能在继承关系中使用 #构造方法: this():本类的构造 super():父类的构造
-
方法重写
package com.oop.demo5; /** * 静态方法和非静态方法区别很大 加static的静态方法 看左边定义的是哪个类就调用哪个类的静态方法 * 非静态方法 看右边的类 * 重写:需要有继承关系,子类重写父类的方法! * 1.方法名必须相同 * 2.参数列表必须相同 * 3.修饰符:子类重写父类方法的修饰符不能小于父类 public>protected>default>private * 4.抛出的异常:子类重写父类方法抛出的异常不能大于父类 * 重写:子类的方法和父类必须要一致:方法体不同 * 为什么要重写? * 父类的方法不满足子类的需求 * 父类的方法不满足子类的需求 * 什么情况下不能重写: * 1.加了static的方法 static是属于类的 * 2.加了final的方法 * 3.加了private的方法 */ public class Test { public static void main(String[] args) { Student student = new Student(); // student.say("张三"); Person a=new Student(); student.say(); } }
多态
-
即同一方法可以根据发送对象的不同而采取多种不同的行为方式
-
一个对象的实际类型是确定的,但是指向对象的引用的类型有很多(父类,有关系的类)
-
多态存在的条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
-
注意:多态是方法的多态,属性没有多态概念
package com.oop.demo6;
/**
* 多态注意事项
* 1.多态是方法的多态,属性没有多态
* 2.父类和子类有关系,属性转换异常(ClassCaseException)
* 存在关系 继承 子类需要重写父类方法 父类引用指向子类
*/
public class Test {
public static void main(String[] args) {
// new Student()一个对象的实际类型是确定的 但是可以指向的引用类型就不确定了:父类引用指向子类
//能不能调用看=左边引用类型 具体调用谁是看=右边实际类型
//父类不能调用子类特有的方法 如果需要调用 则需要转型(强转)
Student student=new Student();
Person p = new Student();
student.eat();
p.eat();
student.study();
((Student)p).study();
}
}
instanceof和类型转换
instanceof 判断对象类型是否一致
Object o = new Student();
System.out.println(o instanceof Student);
System.out.println(o instanceof Person);
System.out.println(o instanceof Object);
System.out.println(o instanceof Thread);
System.out.println(o instanceof String);
Person person = new Student();
System.out.println(person instanceof Student);
System.out.println(person instanceof Person);
System.out.println(person instanceof Object);
/*System.out.println(person instanceof Thread);
System.out.println(person instanceof String);*/