抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在 Java 中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
在抽象类中子类必须重写父类的抽象方法;
示例:
动物类:
public abstract class Animal {
private String name;
private String age;
public Animal() {
}
public Animal(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public abstract void eat();
public void show(){
System.out.println(name+","+age);
}
}
猫类:
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫喜欢吃鱼");
}
public Cat() {
}
public Cat(String name, String age) {
super(name, age);
}
}
狗类:
public class Dog extends Animal{
public Dog() {
}
public Dog(String name, String age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("狗喜欢啃骨头");
}
}
测试类:
public class AbstraDemo {
public static void main(String[] args) {
//多态的使用
Animal a1 = new Cat();
a1.setName("加菲猫");
a1.setAge("1");
System.out.println(a1.getName()+","+a1.getAge());
a1.eat();
a1.show();
Animal a2 = new Cat("加菲","1");
System.out.println(a2.getName()+","+a2.getAge());
a2.eat();
a2.show();
Animal a3 = new Dog();
a3.setName("明明");
a3.setAge("2");
System.out.println(a3.getName()+","+a3.getAge());
a3.eat();
a3.show();
Animal a4 = new Dog("花花","2");
System.out.println(a4.getName()+","+a4.getAge());
a4.eat();
a4.show();
}
}
多态
多态:多态是同一个行为具有多个不同表现形式或形态的能力。
例如:
一个抽象类:里面有一个吃的行为
在狗的类里面表现的是吃骨头,在猫的类里面表现的是吃鱼的行为;
也可以这样简单理解:
一个抽象类不能实例化对象,必须依靠子类来创建对象
在抽象类中已经使用了多态:
Animal a = new Cat();
Animal a3 = new Dog();
多态就是同一个接口,使用不同的实例而执行不同操作;
多态使用的前提:
1、有继承关系
2、有方法重写
3、父类指向子类对象
动物类:
public class Animal {
public int age=8;
public void eat(){
System.out.println("动物类有的喜欢吃鱼");
}
}
猫类:
public class Cat extends Animal{
public int age=6;
public int weight;
@Override
public void eat() {
System.out.println("猫爱吃鱼");
}
public void catchmouth(){
System.out.println("猫喜欢抓老鼠");
}
}
测试类:
public class Duotai02 {
public static void main(String[] args) {
Animal a1 = new Cat();
//多态方法编译看左边,运行看右边(子类的)
a1.eat();
// 多态中使用的方法父类也要有
// a1.catchmouth();
//运行中成员变量使用的是父类的
System.out.println(a1.age);
//父类也要有变量才可以使用
// System.out.println(a1.weight);
}
}
接口
简介:接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过实现接口的方式,从而来实现接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。
接口使用示例:
接口:
public interface Jumping {
public abstract void jump();
}
动物类:
public abstract class Animal {
private String name;
private String age;
public Animal() {
}
public Animal(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public abstract void eat();
}
猫类:
public class Cat extends Animal implements Jumping{
public Cat() {
}
public Cat(String name, String age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("猫吃鱼");
}
@Override
public void jump() {
System.out.println("猫可以调高了");
}
}
测试类:
public class Interfacempl {
public static void main(String[] args) {
//猫使用无参构造,狗使用带参构造
Animal a1 = new Cat();
a1.setName("加菲");
a1.setAge("2");
System.out.println(a1.getName()+","+a1.getAge());
a1.eat();
Jumping j1 = (Cat) a1;
j1.jump();
/*Animal a2 = new Dog("花花","1");
System.out.println(a2.getName()+","+a2.getAge());
a2.eat();
Jumping J2 = (Dog) a2;
((Dog) a2).jump();*/
//具体实现的时候使用最多的就是直接使用Cat来创造对象
//因为它可以直接使用抽象类和接口里面的方法
Cat c = new Cat("加菲猫","2");
System.out.println(c.getName()+","+c.getAge());
c.eat();
c.jump();
}
}
抽象类,接口,继承综合案例
题目:
分析:
英语接口
public interface SpeakEnglish {
public abstract void speakEnglish();
}
教练类:
public abstract class Coach extends Person{
public Coach() {
}
public Coach(String name, String age) {
super(name, age);
}
public abstract void teach();
}
运动员类:
public abstract class Player extends Person{
public Player() {
}
public Player(String name, String age) {
super(name, age);
}
public abstract void study();
}
篮球教练类:
public class BasketballTeacher extends Coach{
public BasketballTeacher() {
}
public BasketballTeacher(String name, String age) {
super(name, age);
}
public void eat(){
System.out.println("篮球教练在吃饭");
}
public void teach(){
System.out.println("篮球教练教如何运球和投篮");
}
}
篮球运动员类:
public class BasketballStudent extends Player{
public BasketballStudent() {
}
public BasketballStudent(String name, String age) {
super(name, age);
}
@Override
public void study(){
System.out.println("篮球运动员在学习打篮球");
}
@Override
public void eat() {
System.out.println("篮球运动员在吃饭");
}
}
兵乓球教练类:
public class PingpangTeacher extends Coach implements SpeakEnglish{
public PingpangTeacher() {
}
public PingpangTeacher(String name, String age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("乒乓球教练在吃饭");
}
@Override
public void teach(){
System.out.println("乒乓球教练教如何发球");
}
@Override
public void speakEnglish(){
System.out.println("乒乓球教练说英语");
}
}
乒乓球运动员类:
public class PingpangStudent extends Player implements SpeakEnglish{
public PingpangStudent() {
}
public PingpangStudent(String name, String age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("乒乓球运动员在吃饭");
}
@Override
public void study(){
System.out.println("学习乒乓球");
}
@Override
public void speakEnglish(){
System.out.println("乒乓球运动员会说英语");
}
}
测试类:
public class Demo {
public static void main(String[] args) {
BasketballStudent bs = new BasketballStudent();
bs.setName("王明");
bs.setAge("21");
System.out.println(bs.getName()+","+bs.getAge());
bs.eat();
bs.study();
System.out.println("----------------------");
PingpangStudent ps = new PingpangStudent();
ps.setName("王浩");
ps.setAge("22");
System.out.println(ps.getName()+","+ps.getAge());
ps.eat();
ps.study();
ps.speakEnglish();
System.out.println("----------------------");
BasketballTeacher bt = new BasketballTeacher();
bt.setName("姚明");
bt.setAge("23");
System.out.println(bt.getName()+","+bt.getAge());
bt.eat();
bt.teach();
System.out.println("----------------------");
PingpangTeacher pt = new PingpangTeacher("李华","24");
System.out.println(pt.getName()+","+pt.getAge());
pt.eat();
pt.teach();
pt.speakEnglish();
}
}
形参
这里主要介绍的是类作为形参,类作为返回值的情况; 代码中有注释直接看代码即可 下面直接给出示例: 猫类:public class Cat {
public void eat(){
System.out.println("猫吃鱼");
}
}
猫操作类:
public class Catoperator {
//类作为形参传递的是一个具体的对象
public void useCat(Cat c){
c.eat();
}
//Cat作为返回值类型返回的是一个Cat对象
public Cat getCat(){
Cat c = new Cat();
return c;
}
}
测试类:
public class CatDemo {
public static void main(String[] args) {
//创建一个操作类对象
Catoperator co = new Catoperator();
Cat c = new Cat();
co.useCat(c);
Cat c2 = co.getCat();
c2.eat();
}
}