Java面向对象3
Java面向对象
封装 继承 多态
多态 动态编译类型 增加可扩展性
一个对象的实际类型是确定的
//可指向的引用类型就不确定了;父类的引用指向子类
Student stu = new Student();
Person stu2 = new Student();
Object stu3 = new Student();
当子类重写了父类的方法,执行子类的方法
对象能执行哪些方法,主要看左边的类型,和右边关系不大
对象能调用的方法都是自己的或者是父类的
父类性可以指向子类,但是不能调用子类独有的方法
多态注意事项
-
多态是方法的多态,属性没有多态
-
父类和子类,有联系. 类型转换异常(ClassCastException)
-
存在条件:继承关系,方法需要重写.
//父类引用指向子类对象! Father f1 = new Son(); //下面这写些方法不能重写 //static 方法,属于类,不许实例 //final 常量; //private 方法;
Instanceof
两边有关系才能比较
//关系树
//Object > String
//Object > Person > Student
//Object > Person > Teacher
//比较对象是Student;
Object object = new Student();
System.out.println(object instanceof Student);//ture
System.out.println(object instanceof Person);//ture
System.out.println(object instanceof Teacher);//false
System.out.println(object instanceof Object);//ture
System.out.println(object instanceof String);//false
System.out.println("===========================================");
Person person = new Student();
System.out.println(person instanceof Student);//ture
System.out.println(person instanceof Person);//ture
System.out.println(person instanceof Teacher);//false
System.out.println(person instanceof Object);//ture
//System.out.println(person instanceof String);//编译报错!
System.out.println("===========================================");
Student student = new Student();
System.out.println(student instanceof Student);//ture
System.out.println(student instanceof Person);//ture
System.out.println(student instanceof Object);//ture
//System.out.println(student instanceof Teacher);//编译报错!
//System.out.println(student instanceof String);//编译报错!
当父类想要调用子类方法时需要将父类强行转换为子类
//父类调用子类方法的格式
((Son)father).方法名;
子类转换为父类时,可能会丢失一些方法
多态总结
- 父类引用指向子类的对象
- 把子类转换为父类,向上转型
- 把父类转换为子类,向下转换,强制转换
- 方便方法的调用,减少重复代码!简介
Static
静态属性的使用方法
? 直接使用对象名调用属性.相当于默认属性为静态属性
同一类中
非静态方法可直接访问类中静态方法
静态方法可以直接调用静态方法
静态方法不能直接调用非静态方法
因为类加载机制
静态代码块
package com.yu.Oop.Demo07;
public class Person {
//运行顺序
{
System.out.println("匿名代码块");
}//2 作用赋初值
static{
System.out.println("静态代码块");
}//1 只执行一次
public Person() {
System.out.println("构造方法");
}//3
public static void main(String[] args) {
Person person = new Person();
}
}
运行结果com.yu.Oop.Demo07.Person
静态代码块
匿名代码块
构造方法
mathematics 数学
Math.random() 在0-1之间产生一个随机数
//静态导入包
import static java.lang.Math.random;
//下次调用可直接使用random() 输出一个随机数
//不用经过Math函数调用
抽象类(abstract)
- abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类.
- 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类
- 抽象类,不能使用new关键字来创建对象,它是用来让子类继承的
- 抽象 方法,只有方法的声明,没有方法的实现,它是用来让子类实现的
- 子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类
限制
-
不能new这个抽象类,只能靠子类去实现它:约束!
-
抽象类中可以写普通的方法
-
抽象方法必须在抽象类中
抽象的抽象:约束
问题
- 抽象类存在构造器吗
抽象类中是存在构造器的
原因:
对于一个抽象类Person,一个继承了抽象类Person的子类Student,
可以定义一个抽象类的变量p,p只能引用非抽象子类Student中的对象。
Person p = new Student("Vince Vu", "Economics");
1
在子类Student中通过super()调用抽象类Person中的构造方法。
原文链接
-
抽象类存在的意义
在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。
接口(interface)
实现多继承
接口定义的属性都是常量(一般不用)
命名规则
接口类名加Impl
与其他类的区别
- 普通类:只有具体实现
- 抽象类:具体实现和规范(抽象方法)都有!
- 接口:只有规范!
实现接口类类就必须实现接口的方法
作用
- 约束
- 定义一些方法,让不同的人实现
- 方法都是 public abstract
- 接口常量 public abstract final
- 接口不能被实例换,接口没有构造方法
- implements 可以实现多个接口
- 必须重写接口中的方法
内部类
定义
? 内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就成为内部类,而A类相对于B类来说就是一个外部类了
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
通过内部类可以获得外部类的私有属性
一个Java类中可以有多个class类但是只能有一个public class类