知识点总览
(一)继承多态和接口多态
(二)内部类
(三)设计模式
继承多态和接口多态(多态的形参体现)
形式参数
基本类型(已经讲解过了,这里不再重复)
引用类型
类名: 需要的是该类的对象
抽象类:需要传入的是继承该类的子类对象,继承多态。
接口:当形式参数为接口的时候,需要外界传入的是实现该接口的子类对象,接口多态。
形参是类名的情况:
/*
*形式参数:
基本类型,引用类型,类名,抽象类,接口
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
领取专属 10元无门槛券
私享最新 技术干货