package com.imooc.test;
import com.imooc.animal.Animal;
import com.imooc.animal.Cat;
import com.imooc.animal.Dog;
public class test {
public static void main(String[] args) {
//Animal one = new Animal();
/*向上转型、隐式转型、自动转型
父类引用指向实例,可以调用子类重写父类的方法,无法调用子类独有方法
小类转型为大类
*/
Animal two = new Cat();
Animal three = new Dog();
//one.eat();
two.eat();
three.eat();
System.out.println("==========================");
/*向下转型、强制类型转换
子类引用指向父类对象,此处必须进行强转
使用instanceof运算符判断能否强制转换
*/
if(two instanceof Cat) {
Cat temp = (Cat) two;
temp.eat();
temp.run();
temp.getMonth();
System.out.println("two 可以转换为 Cat");
}
if(two instanceof Dog) {
Dog temp = (Dog) two;
temp.eat();
temp.sleep();
temp.getSex();
System.out.println("two 可以转换为 Dog");
}
}
}
package com.imooc.animal;
public class Cat extends Animal{
private double weight;
public Cat() {
}
public Cat( String name, int weight, int month) {
super(name, month);
this.weight = weight;
}
public double getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public void run(){
System.out.println("小猫快乐的奔跑");
}
@Override
public void eat(){
System.out.println("猫吃鱼");
}
}
package com.imooc.animal;
public class Dog extends Animal{
public String sex;
public Dog() {
}
public Dog(String name, int month, String sex) {
this.setMonth(month);
this.setName(name);
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void sleep(){
System.out.println("小狗要午觉zzz");
}
@Override
public void eat() {
System.out.println("狗爱吃肉");
}
}
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。 由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。 父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
package com.imooc.animal;
//抽象类:不允许实例化,可以通过向上转型,指向子类实例
public abstract class Animal {
private String name;
private int month;
public Animal() {
}
public Animal(String name, int month) {
this.name = name;
this.month = month;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
//抽象方法:不允许包含方法体,子类中需要重写父类中的抽象方法;否则子类必须是抽象类
// static final private 不能与 abstract 共存
public abstract void eat();
}
接口在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
[修饰符] interface 接口名称 [extends 其他的接口名] {
// 声明变量
// 抽象方法
}
package com.imooc.Telephone;
public interface INet {
//接口中抽象方法可不加abstract
//访问修饰符默认public
//当类实现接口时,需要去实现接口中的所有抽象方法,否则需要将类设置为抽象类
public abstract void network();
//JDK1.8新增的
//可以在实现类中重写,并可以通过接口的引用调用
default void connection(){
System.out.println("默认方法");
}
//不可以被重写,可以通过接口名调用
static void stop(){
System.out.println("我是接口中的静态方法");
}
//接口中可以包含常量,默认为public static final
int temp = 20;
}
package com.imooc.Telephone;
public interface IPhoto {
public void photo();
}
package com.imooc.Telephone;
public class Computer implements INet,IPhoto{
public static final int temp = 80;
public void photo(){
System.out.println("电脑可以拍照");
}
public void videos(){
System.out.println("电脑可以看视频");
}
public void music(){
System.out.println("电脑可以听音乐");
}
@Override
public void network() {
System.out.println("电脑可以上网");
}
}
package com.imooc.test;
import com.imooc.Telephone.*;
public class telTest {
public static void main(String[] args) {
Tel4 phone = new Tel4();
phone.call();
phone.network();
System.out.println("==========================");
IPhoto ip = new Tel4();
ip.photo();
ip = new Camera();
ip.photo();
System.out.println("==========================");
//如果接口和实现类中存在同名的信息,当在程序中使用接口的引用指向实现类的时候,依然使用的接口中的信息;
//如果通过实现类的对象调用的信息使用的是实现类中的信息
System.out.println(INet.temp);
INet net = new Computer();
System.out.println(net.temp);
System.out.println("==========================");
net.connection();
}
}