抽象类,接口以及多态

1.抽象类

1.1抽象类声明

在Java中使用abstract修饰的类叫抽象类

在Java中使用abstract修饰的方法叫抽象方法

语法格式:

abstract class Person {

//正常类的属性
String name;
//普通的成员方法
public void eat () {
  System.out.print("吃饭");
}
//抽象方法   没有方法体的方法  没有大括号的
public abstract void sleep ();

}

abstract class Person {//抽象类
	//抽象类中可以有属性  方法  抽象方法
	
	public  void eat () {//普通方法
		System.out.println("吃饭啊");
	}
	//声明一个抽象方法  abstract  修饰符
	//是一个不完整的方法,  完整方法应该带方法体
	 public abstract void  test (int a);
	
}

//The type Man must implement(实现) the inherited abstract method Person.test()
//在普通类中 Man中,必须可以实例化的。所以Man所有的信息都要时完整的
//必须去重写 父类中 抽象的方法
class Man extends Person{
	@Override
	public void test(int a) {//是重写的 抽象的类的抽象方法
		System.out.println( a + "这个是子类重写的的抽象父类的抽象的方法");
		
	}
}
public class Demo1 {
	public static void main(String[] args) {
		//抽象类不能创建对象 咋办? 只能 被继承
//		Person person = new Person();
		Man man = new Man();
		man.eat();
		man.test();
	}
}

3.2抽象类的详解

1.如果一个类中有抽象方法,那么这个类一定是抽象类

2.抽象方法是一个没有方法体的方法,是一个不完整的方法

3.抽象类中能有普通方法吗? 可以

4.抽象类能被实例化吗? 不能

5.抽象类不能被实例化,然后可以使用普通类去继承抽象类

6.在子类中 必须去重写父类的所有的抽象方法,让抽象方法变得有意义

7.在抽象类中,非抽象的方法能在子类被重写的

8.一个抽象类可以继承另外一个抽象类

9.一个抽象类也可以继承一个非抽象的类

package com.zkf.g;
abstract class Animal{
	public abstract void play();
	public abstract void eat();
	public void sleep() {
		System.out.println("睡觉");
	}
}
class Panda extends  Animal{
	@Override
	public void play() {
		System.out.println("戏水");
	}
	@Override
	public void eat() {
	System.out.println("竹笋");
	}
	@Override
	public void sleep() {
		// TODO Auto-generated method stub
		System.out.println("靠树上");
	}
}
class Cat extends Animal{

	@Override
	public void play() {
		System.out.println("老鼠");
	}

	@Override
	public void eat() {
		System.out.println("鱼");
	}
	@Override
	public void sleep() {
		// TODO Auto-generated method stub
	System.out.println("躺被窝");
	}
}
public class Dome2 {
	public static void main(String[] args) {
	Panda panda = new Panda();
	Cat cat = new Cat();
	panda.play();
	panda.eat();
	panda.sleep();
	cat.play();
	cat.eat();
	cat.sleep();
}
}

2.final关键字

字面意思 :最终的 最后的意思 是一种修饰符

用法:

1.final可以修饰成员变量 修饰的成员变量必须初始化(赋值),一旦赋值无法更改

2.final可以修饰局部变量 修饰局部变量可以先不赋值,使用的时候必须赋值,一旦赋值就无法更改

3.final可以修饰成员方法 修饰的方法不能被子类重写

4.final可以修饰类 修饰的类不能被继承

5.final可以修饰对象的引用 引用一旦被赋值就无法被修改

3.接口

语法格式

interface 接口的名字{
    属性
    方法
}

1.使用关键字interface来声明Java中的接口

2.接口下面是可以有属性的,只不过属性必须赋值,因为默认带了public static final 是常量

3.接口中的方法都是抽象方法,尽管没带abstract 默认也是public

4.接口下面一般都是抽象方法 jdk1.8之后出现了default修饰方法 是可以带方法体的

5.接口没有构造方法,无法实例化

6.用一个普通的类去实现(implements)接口

7.实现接口的时候一定要重写所有的抽象的方法,默认的方法可以重写也可以不写

8.一个类可以实现(implements)多个接口 implements D,C,F

9.一个接口可以去继承(extends)另外一个接口

多态

1.1多态概念

通俗的来说,就是多种形态,在java中去完成某一个行为,当不同的对象去完成的时候,会有不同的效果。

动物吃 狗吃 狗粮 猫吃猫粮

就是同一件事情,放在不同的对象上面会有不同的效果

1.2方法的多态

方法的重写和重载就叫做方法的多态

package com.qf.b_duotai;

class Person {
	public void  eat () {
		System.out.println("吃饭");
	}
    //方法的重载
    @Overload
	public void eat (String name) {
		System.out.println(name+"吃饭");
	}
}
class Man extends Person {
	//方法的重写
	@Override
	public void eat() {
		System.out.println("吃腰子");
	}
}
public class Demo1 {
	public static void main(String[] args) {
		
	}
}

1.3对象的多态

父类的引用指向了子类的对象 或者说 子类对象赋值给了父类的引用

Father father = new Son();

1.必须有继承关系

2.必须重写父类的方法

3.父类的引用就可以调用子类重写方法,不能调用子类独有的方法

package com.zkf.i;
class Animal{
	public void eat() {
		System.out.println("吃东西");
	}
	public void work() {
		System.out.println("工作");
	}
}
class Dog extends Animal{
	@Override
	public void eat() {
		System.out.println("吃大骨头");
	}
	public void sleep() {
		System.out.println("趴着睡");
	}
}
public class Dome2 {
	public static void main(String[] args) {
		Animal animal=new Dog();//父类的引用指向子类的对象
		animal.eat();//子类中重写的方法
		animal.work();//父类中的方法
		//animal.sleep();   报错 父类的引用是调用不了子类独有的方法的
	}
}

1.4多态的真实开发中应用

人 喂狗 狗吃大骨头 人 喂猫 猫吃鱼

package com.zkf.i;
/*
 * 人  喂狗 狗吃大骨头   人 喂猫 猫吃鱼
 */
class People{
	public void feed(Animals animals) {
		animals.eat();
	}
}
class Animals{
	public void eat() {
		System.out.println("吃饭");
	}
}
class Dog3 extends Animals{
	@Override
	public void eat() {
		System.out.println("吃大骨头");
	}
}
class Cat extends Animals{
	@Override
	public void eat() {
		System.out.println("吃鱼");
	}
}
public class Dome3 {
	public static void main(String[] args) {
		People people = new People();
		Animals animals =new Dog3();
		people.feed(animals);
		Animals animals2=new Cat();
		people.feed(animals2);
		
	}
}

1.5多态的转型

1.5.1多态的向上转型

就是父类的引用指向了子类的对象

语法格式:

父类  父类的引用 = new  子类();

向上转型是自动转的将子类的对象赋值 父类的引用呢 小范围(子类)转为大范围(父类)的 是可以自动转的。

父类的引用可以调用父类的所有的方法,但是不能调用子类独有的方法。最终的调用结果看的是子类中重写的方法的

1.5.2向下转型

语法格式

父类  父类的引用 = new  子类();
子类  子类的引用 = (子类) 父类的引用;   强制类型转换

1.6instanceof关键字

在Java中 instanceof 是一个二元的运算符,和> >= < <= 类似的,他的结果是true或者false

A instanceof B

目的: 测试左边的额对象 是否是右边类的实例。 注意 A 是对象 B 是类

左边的辈分 只要比 右边小或者相等 就返回值true

语法格式:

对象的引用  instanceof   类 

返回值是true或者false

Animal  父类    Dog 子类
Dog dog = new Dog();
dog instanceof  Animal   true

Animal animal = new Animal();
animal instanceof Animal  true
Animal animal1 = new Dog();
animal1  instanceof Animal  

想要向下转型,必须先向上转型

package com.qf.d_duotai;


class Animal {
	public void eat() {
		System.out.println("得吃饭");

	}
}
class Dog  extends Animal{
	@Override
	public void eat() {
		System.out.println("狗吃香肠");
	}
}
class Cat extends Animal {
	@Override
	public void eat() {
		System.out.println("猫吃老鼠");
	}
}
public class Demo2 {
	public static void main(String[] args) {
		//演示语法格式
		Animal animal = new Dog();//父类  父类的引用 = new   子类();  向上转型
		//向下转型   子类  子类的引用 = (子类) 父类的引用;
//		Dog dog1 = (Dog)animal;//强转  在强转的时候一定先向上转 然后再向下转才不会报错的
//		dog1.eat();
		
		/**
		 * ClassCastException(类转换异常): com.qf.d_duotai.Animal cannot be cast to com.qf.d_duotai.Dog
	at com.qf.d_duotai.Demo2.main(Demo2.java:32)
		 */
		这个是错误的代码
//		Animal animal2 = new Animal();
//		Dog dog2 = (Dog) animal2;
//		
		//Exception in thread "main" java.lang.ClassCastException: com.qf.d_duotai.Dog cannot be cast to com.qf.d_duotai.Cat
		//at com.qf.d_duotai.Demo2.main(Demo2.java:38)

//		Cat cat1 = (Cat)animal;
//		Dog dog1 = new Dog();
		
		
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值