面向对象高级知识(五)

知识点总览

(一)继承多态和接口多态

(二)内部类

(三)设计模式

继承多态和接口多态(多态的形参体现)

形式参数

基本类型(已经讲解过了,这里不再重复)

引用类型

类名: 需要的是该类的对象

抽象类:需要传入的是继承该类的子类对象,继承多态。

接口:当形式参数为接口的时候,需要外界传入的是实现该接口的子类对象,接口多态。

形参是类名的情况:

/*

*形式参数:

基本类型,引用类型,类名,抽象类,接口

1.当形式参数为类名的时候,需要外界传入的是该类的对象

*/

public class ArgsDemo01 {

public static void main(String[] args){

//需求:我想要测试学生类的学习方法

Student s = new Student();

s.study();

//需求2:我想要测试StudentDemo类的method的方法

StudentDemo sd = new StudentDemo();

//这里需要我传入一个学生类

Student s1 = new Student();

sd.method(s1);

}

}

class Student{

public void study(){

}

}

class StudentDemo{

public void method(Student t){

t.study();

}

}

形参是抽象类的情况:

/*

*形式参数:

基本类型,引用类型,类名,抽象类,接口

2.当形式参数为抽象类的时候,需要传入的是该类的子类对象

*/

public class ArgsDemo02 {

public static void main(String[] args) {

//需求:我想要测试Teacher类的teach方法

//由于Teacher类是抽象类,可以直接创建吗? 不可以,怎么办呢?

Teacher t = new XTeacher();//继承多态

t.teach();

//需求2:我想要测试TeacherDemo的method方法

TeacherDemo td = new TeacherDemo();

Teacher t1 = new XTeacher();

td.method(t1);

//有没有更简便的方法呢?

//匿名对象,开发中经常使用

new TeacherDemo().method(new XTeacher());

}

}

abstract class Teacher{

public abstract void teach();

}

class XTeacher extends Teacher{

public void teach(){

}

}

class TeacherDemo{

public void method(Teacher t){

t.teach();

}

}

当形式参数为接口的情况

/*

*形式参数:

基本类型,引用类型,类名,抽象类,接口

3.当形式参数为接口的时候,需要传入的是实现该接口的子类对象

*/

public class ArgsDemo03 {

public static void main(String[] args) {

//需求:我想要测试Swimming类的swim方法

Swimming s = new LaoWang();//接口多态

s.swim();

//需求2:我想要测试Demo类的method方法

Demo d = new Demo();

d.method(s);

//有没有更简单的方法呢?

//匿名对象,开发中常用

new Demo().method(s);

}

}

interface Swimming{

void swim();

}

class LaoWang implements Swimming{

public void swim(){

}

}

class Demo{

public void method(Swimming s){

s.swim();

}

}

2. 接口多态(多态的返回值体现)

返回值类型

基本类型(已经讲解过了,这里不再重复)

引用类型

类名: 需要的是该类的对象。

抽象类:需要外界接收的是继承该类的子类对象,继承多态。

接口:需要外界接收的是实现该接口的子类对象,接口多态。

返回值类型为类名

/*

*返回值类型:

基本类型,引用类型,类名,抽象类,接口

1.当返回值类型为类名的时候,需要外界接受的是该类的对象。

*/

public class ReturnDemo01 {

public static void main(String[] args) {

//需求:我想要通过StudentDemo类的method方法来测试study()方法

StudentDemo sd = new StudentDemo();

Student s = sd.method();

s.study();

//有没有更简单的方法呢?开发中常用

new StudentDemo().method().study();

//上述方法叫什么呢? ---链式编程

}

}

class Student{

public void study(){

}

}

class StudentDemo{

public Student method(){

//Student s = new Student();

//return s;

return new Student();

}

}

返回值类型为抽象类

/*

*返回值类型:

基本类型,引用类型,类名,抽象类,接口

2.当返回值类型为抽象类的时候,需要外界接受的是该类的子类对象

*/

public class ReturnDemo02 {

public static void main(String[] args) {

//需求:我想要通过TeacherDemo类的method方法测试teach方法

TeacherDemo td = new TeacherDemo();

Teacher t = td.method();

t.teach();

//有没有更简单的方法呢? 链式编程

new TeacherDemo().method().teach();

}

}

abstract class Teacher{

public abstract void teach();

}

class XTeacher extends Teacher{

public void teach(){

}

}

class TeacherDemo{

public Teacher method(){

return new XTeacher();

}

}

返回值类型为接口

/*

*返回值类型:

基本类型,引用类型,类名,抽象类,接口

3.当返回值类型为接口的时候,需要外界接受的是实现该接口的子类对象。

*/

public class ReturnDemo03 {

public static void main(String[] args) {

new LaoWangDemo().method().sing();

}

}

interface Sing{

public void sing();

}

class LaoWang implements Sing{

public void sing(){

}

}

class LaoWangDemo{

public Sing method(){

return new LaoWang();

}

}

3. 内部类

内部类概述

在类的内部定义另一个类

如果在类Outer的内部再定义一个类Inner,此时Inner就称为内部类,而Outer则称为外部类。

内部类定义的格式

修饰符 class 外部类的名称{

//外部类的成员

修饰符 class 内部类的名称{

//内部类的成员

}

}

内部类的特点

1.内部类可以直接访问外部类的所有成员。

2.内部类可以声明为private或者protected!而外部类不可以。

3.外部类不能直接访问内部类的的成员。

4.当内部类声明成public或private等时,对其访问的限制与成员变量和成员方法完全相同。

5.编译一下,我们看到目录中出现了两个class文件,其中有一个文件名叫做Outer$Inner.class,带了一个$符号,这个特点让我们很容易的认出来这是内部类编译后的class文件。

6.内部类结构会使程序结构不清楚,慎用。

内部类的好处

1.内部类可以很好的实现隐藏

一般的非内部类,是不允许有 private 与protected权限的,但内部类可以。

2.当某个类除了它的外部类,不再被其他的类使用时。

3.适当使用内部类,使得代码更加灵活和富有扩展性。

内部类的分类

分为四类,分别是成员内部类,静态内部类,局部内部类,匿名内部类。

/*

* 内部类的分类:成员内部类,静态内部类,局部内部类,匿名内部类

* 成员内部类

* 定义在成员的位置称之为成员内部类

* 定义在局部的位置称之为局部内部类

*/

public class InnerClassDemo02 {

}

class Outer1{

private int num = 0;

//成员位置

class Inner{

//局部位置

}

public void method(){

//局部内部类

class Inner{

}

}

//静态内部类

static class Inner_{

//局部位置

}

//匿名内部类??

}

课堂案例:

程序填空

class Outer {

public int num = 10;

class Inner {

public int num = 20;

public void show() {

int num = 30;

}

}

}

在控制分别输出:30,20,10

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180118G073V300?refer=cp_1026

同媒体快讯

扫码关注云+社区