JAVA封装、继承、多态
封装
- 该露的露,该藏的藏
- 我们程序设计要求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用
- 封装(数据的隐藏)
- 通常应禁止直接访问一个对象中数据的实际表达,而应通过操作接口来访问,这称为信息隐藏
- 属性私有,get/set
继承
-
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模
-
extands 的意思是“扩展”,子类是父类的扩展
-
JAVA中类只有单继承,没有多继承
-
继承是类和类之间的一种关系,除此之外,类和类之间的关系还有依赖、组合、聚合等
-
继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示
-
子类和父类之间,从意义上讲应该具有"is a"的关系
-
object类:在JAVA中,所有类都默认直接或者间接继承object类。
-
super:调用父类的属性。
-
调用父类的构造方法,必须在构造方法的第一行
必须只能出现在子类的方法或者构造方法中
-
与this对比:
-
代表的对象不同:
this:本身调用者这个对象
super:代表父类对象的引用
-
前提:
this:没有继承也可以使用
super:只能在继承条件才可以使用
-
构造方法:
this():本类的构造
super():父类的构造
-
-
public class Person {
protected String name = "bingshen";
public void print() {
}
}
//子类继承父类,就会拥有父类的全部方法,,但private无法继承
public class Student extends Person {
private String name="liu";
public void test(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
public class Application {
public static void main(String[] args) {
Student student=new Student();
student.test("冰神");
}
}
----------------------------------------------------------
冰神
liu
bingshen
public class Person {
public Person(){
System.out.println("Person无参执行了");
}
}
public class Student extends Person {
public Student(){
//隐藏代码:调用了父类的无参构造
//调用父类的构造器必须要放在子类构造器的第一行
super();//被隐藏的
System.out.println("Student无参执行了");
}
}
public class Application {
public static void main(String[] args) {
Student student=new Student();
}
}
----------------------------------------------------
Person无参执行了
Student无参执行了
-
方法重写
重写需要继承关系,子类重写父类的方法:
- 方法名必须相同
- 参数列表必须相同
- 修饰符:范围大小:public>protected>Default>>private
- 抛出的异常:范围,可以被缩小,但不能扩大:ClassNotFoundException–>Exception(大)
重写,子类的方法和父类必须保持一致:方法体不同
为什么要重写:
- 父类的功能,子类不一定需要,或者不一定满足
// 重写都是方法的重写,和属性无关
public class B {
public static void test(){
System.out.println("B->tesst()");
}
}
public class A extends B {
public static void test(){
System.out.println("A->tesst()");
}
}
//静态方法: 方法的调用只和左边,定义的数据类型有关
//非静态 :重写
public class Application {
public static void main(String[] args) {
A a=new A();
a.test();
//父类的引用指向尴尬了子类
B b=new A(); //子类重写了父类的方法
b.test();
}
}
--------------------------------------------------------
A->tesst()
B->tesst()
==========================================================
//非静态
public class B {
public void test(){
System.out.println("B->tesst()");
}
}
public class A extends B {
public void test(){
System.out.println("A->tesst()");
}
}
public class Application {
public static void main(String[] args) {
A a=new A();
a.test();
//父类的引用指向尴尬了子类
B b=new A(); //子类重写了父类的方法
b.test();
}
}
--------------------------------------------------
A->tesst()
A->tesst()
多态
- 即同一方法可以根据发送对象的不同而采用 多种 不同的行为方式
- 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
- 多态存在的条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
- 多态是方法的多态,属性没有多态性
- instanceof (类型转换)引用类型,判断一个对象是什么类型
public class Person {
public void run(){
System.out.println("run");
}
}
public class Student extends Person {
public void run(){
System.out.println("son");
}
public void eat(){
System.out.println("eat");
}
}
public class Application {
public static void main(String[] args) {
//可以指向的引用类型就不确定了:父类的引用指向子类
//Student能调用的方法都是自己的或者继承父类的
Student s1=new Student();
//Person 父类,可以指向子类,但不能调用子类独有的方法
Person s2=new Student();
Object s3=new Student();
//对象能执行哪些方法,主要看对象左边的类型,和右边关系不大.
s2.run();//子类重写了父类的方法,执行子类的方法
s1.run();
s1.eat();
//s2.eat;//报错,s2为Person类,无法调用子类的方法
}
}
--------------------------------------------------------
son
son
eat
多态注意事项:
1.多态是方法的多态,属性没有多态
2.父类和子类有联系,类型转换异常!ClassCastException!
3..存在条件,继承关系,方法需要重写,父类的引用指向子类对象。
Father f1 =new Son()
//instanceof 使用
public static void main(String[] args) {
Object object=new Student();
System.out.println(object instanceof Student);//true
System.out.println(object instanceof Person);//true
System.out.println(object instanceof Object);//true
System.out.println(object instanceof Teacher);//false
System.out.println(object instanceof String);//false
}
//子类
public class Student extends Person {
public void go(){
System.out.println("go");
}
}
//父类
public class Person {
public void run(){
System.out.println("run");
}
}
public class Application {
public static void main(String[] args) {
//类型转换:父 子
Person obj =new Student();
//student将这个对象转换为Student类型,我们就可以使用Student类型的方法
Student student=(Student) obj;
student.go();
//((Student)obj).go(); //等同上两句结合
//子类转换为父类可能丢失自己本来的一些方法
Student student1=new Student();
student1.go();
Person person=student1;
}
}
/*
1.父类的引用指向子类的对象
2.把子类转换为父类,向上转型,不用强制转换
3.把父类转换为子类,向下转型:需要强制转换
4.方便方法的调用,减少重复的代码
*/