接口测试【封装、继承、多态】

本文详细解析了Java中父类与子类的继承关系,接口的实现,以及多态的应用。通过具体示例,展示了如何在子类中重写父类方法,实现接口中的抽象方法,同时介绍了接口与抽象类的区别,以及JDK1.8后接口的新特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、父类

package com.wyq.study;

public class Pers {
	//书写类
	//书写属性
	private String name;
	private int age;
	//提供共有的取值赋值方法
	public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return name;
	}
	public void setAge(int age){
		this.age = age;
	}
	public int getAge(){
		return age;
	}
	//无参构造
	public Pers(){
		super();
		System.out.println("这里是父类的无参构造");
	}
	//带参构造
	public Pers(String name,int age){
		super();
		this.name = name;
		this.age = age;
		System.out.println("这里是父类带参的构造方法"+this.name+"\t"+this.age);
	}
	//父类的普通方法 
	public void speak(String language){
		System.out.println("这里是父类的测试:\n"+name+"今年"+age+"岁了,正在说"+language);
	}
}

2、接口1

package com.wyq.study;

public interface Dance {
	//接口中的属性
	public static final int DanceAge = 10;
	//接口中的抽象方法
	public abstract void dan();
}

2、接口2

package com.wyq.study;

//抽象类
public interface Sing {
	//抽象类中的属性
	public static final String danceName = "草原";
	//抽象类中的普通方法
	public abstract void sin(String sinName);
}

3、子类【继承父类,重写父类的方法,实现子类,实现子类中的方法】

package com.wyq.study;

public class LaoWang extends Pers implements Dance,Sing{
	private String job;
	public void setJob(String job){
		this.job = job;
	}
	public String getJob(){
		return job;
	}
	public LaoWang(){
		super();
		System.out.println("这里是子类的无参构造");
	}
	public LaoWang(String name,int age,String job){
		super(name,age);
		this.job = job;
		System.out.println("这里是子类的带参构造方法,其参数为:"+super.getName()+"\t"+super.getAge()+"\t"+job);
	}
	
	@Override
	public void speak(String language) {
		super.speak(language);
		System.out.println("这里是重写父类的方法,老王会说"+language+"\t"+super.getName()+"\t"+super.getAge()+"\t"+job);		
	}
	@Override
	public void dan() {
		System.out.println("测试子类中的跳舞方法"+job+"\t"+super.getName()+"\t"+getAge()+this.DanceAge);		
	}
	@Override
	public void sin(String sinName) {
		System.out.println("这里是测试唱歌的方法"+danceName+"\t"+this.DanceAge);
		
	}
	
}

4、测试类

package com.wyq.study;

public class TestLaoWang {
	public static void main(String[] args) {
		/**
		 * 使用多肽,父类new子类对象
		 * 这种情况只能调用父类中的方法
		 */
		Pers p = new LaoWang("张三",18,"程序员");
		p.speak("昌平话");
		System.out.println("这里是测试多肽"+p.getName()+"\t"+p.getAge()+"\t");
		System.out.println("____________________________");
		/**
		 * 使用接口进行new
		 * 这种情况只能定义接口中的方法
		 */
		Dance d =  new LaoWang("李四",20,"公务员");
		d.dan();
		System.out.println("这里是测试接口类的方法"+d.DanceAge);
		System.out.println("***************************");
		Sing s = new LaoWang("王五",22,"老师");
		s.sin("旭日阳刚");
		System.out.println("这里是测试唱歌的方法"+s.danceName);
		/**
		 * 自己创建自己的对象
		 * 这种情况下,可以调用重写/实现父类中的方法,还可以调用实现接口的方法
		 */
		LaoWang lw = new LaoWang("马六",24,"交警");
		lw.dan();
		lw.sin("姑娘我爱你");
		lw.speak("英国话");
		System.out.println("这里是测试子类自己"+lw.getName()+"\t"+lw.getAge()+"\t"+lw.getJob()+lw.danceName+"\t"+lw.DanceAge);
		
	}

}

5、输出的结果

这里是父类带参的构造方法张三	18
这里是子类的带参构造方法,其参数为:张三	18	程序员
这里是父类的测试:
张三今年18岁了,正在说昌平话
这里是重写父类的方法,老王会说昌平话	张三	18	程序员
这里是测试多肽张三	18	
____________________________
这里是父类带参的构造方法李四	20
这里是子类的带参构造方法,其参数为:李四	20	公务员
测试子类中的跳舞方法公务员	李四	2010
这里是测试接口类的方法10
***************************
这里是父类带参的构造方法王五	22
这里是子类的带参构造方法,其参数为:王五	22	老师
这里是测试唱歌的方法草原	10
这里是测试唱歌的方法草原
这里是父类带参的构造方法马六	24
这里是子类的带参构造方法,其参数为:马六	24	交警
测试子类中的跳舞方法交警	马六	2410
这里是测试唱歌的方法草原	10
这里是父类的测试:
马六今年24岁了,正在说英国话
这里是重写父类的方法,老王会说英国话	马六	24	交警
这里是测试子类自己马六	24	交警草原	10

6、总结

1)一个子类只能继承一个父类,但是可以实现N多个接口

2)接口中不允许定义构造方法,因为接口不是类

3)接口中的变量都应该是public static final类型的,public static final 常常可以省略,接口中的变量被final修饰,因此必须初始化

4)jdk1.8之前,接口或者抽象类中的抽象方法是不允许有方法体的

5)在jdk1.8之后,在接口中可以定义方法,并含有方法体,单是要求必须写default关键字

6)类与接口的关系是类必须实现接口,实现接口中的方法

7)如果一个类既存在继承关系,又存在实现关系,那么要去extends继承在前,implements实现在后

8)抽象类中的抽象方法可以用abstract来修饰,abstract可以省略不写

9)如果一个类中的所有方法都是抽象方法,那么这个类就是接口

10)定义成接口之后,public abstract可以省略不写

11)接口中的方法都是默认的公共的抽象方法

### C# 中封装继承多态的概念及用法 #### 封装 (Encapsulation) 封装是面向对象编程的核心原则之一,它指的是隐藏对象的内部状态并仅暴露必要的部分给外部世界。这种机制通过访问修饰符(如 `private` 或 `protected`)控制成员的可见性和可访问性[^4]。 以下是封装的一个简单示例: ```csharp public class Person { private string name; // 私有字段,防止直接修改 public int Age { get; private set; } // 只读属性 public void SetName(string newName) { if (!string.IsNullOrEmpty(newName)) name = newName; } public string GetName() { return name ?? "Unknown"; } } // 使用封装后的 Person person = new Person(); person.SetName("Alice"); Console.WriteLine(person.GetName()); // 输出 Alice ``` --- #### 继承 (Inheritance) 继承允许一个基于另一个创建新的功能或重写现有功能。子可以从父继承所有的公共和受保护成员,并可以选择覆盖某些方法以提供特定的行为[^3]。 以下是一个简单的继承示例: ```csharp public class Animal { public virtual void Speak() { Console.WriteLine("Animal makes a sound."); } } public class Dog : Animal { public override void Speak() // 覆盖基的方法 { Console.WriteLine("Dog barks!"); } } // 测试继承 Animal animal = new Animal(); animal.Speak(); // 输出 Animal makes a sound. Dog dog = new Dog(); dog.Speak(); // 输出 Dog barks! Animal anotherDog = new Dog(); // 多态的应用 anotherDog.Speak(); // 动态绑定,输出 Dog barks! ``` --- #### 多态 (Polymorphism) 多态指同一操作作用于不同的对象时可以有不同的解释,从而产生不同的执行结果。C# 支持两种主要形式的多态:编译时多态(方法重载)和运行时多态(虚方法和接口)。运行时多态通常通过虚方法 (`virtual`) 和抽象实现[^1]。 ##### 运行时多态示例 ```csharp public abstract class Shape { public abstract double Area(); // 抽象方法 } public class Circle : Shape { private readonly double radius; public Circle(double r) { radius = r; } public override double Area() { return Math.PI * radius * radius; } } public class Rectangle : Shape { private readonly double width, height; public Rectangle(double w, double h) { width = w; height = h; } public override double Area() { return width * height; } } // 应用多态 Shape circle = new Circle(5); Shape rectangle = new Rectangle(4, 6); Console.WriteLine($"Circle area: {circle.Area()}"); // 输出圆面积 Console.WriteLine($"Rectangle area: {rectangle.Area()}"); // 输出矩形面积 ``` --- #### 结合封装继承多态的实际案例 假设我们正在开发一个人事管理系统,涉及员工的不同角色及其薪资计算方式。可以通过封装数据、定义继承层次结构以及利用多态处理各种型的员工。 ```csharp using System; public abstract class Employee { protected string Name { get; set; } protected decimal BaseSalary { get; set; } public Employee(string name, decimal salary) { Name = name; BaseSalary = salary; } public abstract decimal CalculatePay(); // 定义虚方法供子实现 } public class FullTimeEmployee : Employee { public FullTimeEmployee(string name, decimal salary) : base(name, salary) {} public override decimal CalculatePay() { return BaseSalary; // 全职员工按固定工资发放 } } public class PartTimeEmployee : Employee { private readonly decimal hourlyRate; private readonly int hoursWorked; public PartTimeEmployee(string name, decimal rate, int hours) : base(name, 0) { hourlyRate = rate; hoursWorked = hours; } public override decimal CalculatePay() { return hourlyRate * hoursWorked; // 部分时间员工按小时计费 } } class Program { static void Main() { Employee emp1 = new FullTimeEmployee("John", 5000); Employee emp2 = new PartTimeEmployee("Jane", 20, 80); Console.WriteLine($"{emp1.GetType().Name}: {emp1.CalculatePay():C}"); // John 的全职工资 Console.WriteLine($"{emp2.GetType().Name}: {emp2.CalculatePay():C}"); // Jane 的兼职工资 } } ``` 上述代码展示了如何结合封装(隐藏具体逻辑)、继承(构建统一的基础)和多态(动态调用不同实现),使程序更易于维护和扩展。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值