返回顶部
首页 > 资讯 > 后端开发 > Python >java基础的详细了解第八天
  • 737
分享到

java基础的详细了解第八天

2024-04-02 19:04:59 737人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录1、多态性1.1 向上转型1.2 向下转型2、抽象类2.1 抽象类的基本概念抽象方法为什么不能实例化对象?关于抽象类的若干中疑问?3、接口3.1 接口的基本概念3.2 接口的使用

1、多态性

多态性是面向对象的最后一个特征,它本身主要分为两个方面:

​ 方法的多态性:重载与覆写

1、重载:同一个方法名称,根据参数类型以及个数完成不同功能;

2、覆写:通一个方法,根据操作的子类不同,所完成的功能也不同。

​ 对象的多态性:父子类对象的转换。

1、向上转型:子类对象变为父类对象,父类 父类对象 = 子类 子类对象 自动;

2、向上转型:父类对象变为子类对象,格式:子类 子类对象 = (子类)父类实例,强制;


class A{
	public void print(){
		System.out.println("A输出");
	}
}
class B extends A{
	public void print(){
		System.out.println("B输出");
	}
}
public class TestDemo1{
	public static void main(String args[]){
		B b = new B();
		//B输出
		b.print();
	}
}

这种操作主要观察两点:

1、 看实例化的是哪一类(new);

2 、看new的这个类之中是否被覆写了父类调用的方法。

1.1 向上转型


public class TestDemo1{
	public static void main(String args[]){
		A a = new B();  //向上转型
        //B输出
		a.print();
	}
}

1.2 向下转型


public class TestDemo1{
	public static void main(String args[]){
		A a = new B();  //向上转型
        B b = (B) a;    //向下转型
		b.print();
	}
}

public class TestDemo1{
	public static void main(String args[]){
		A a = new A();  //没有转型
        B b = (B) a;     //向下转型
		b.print();
	}
}

以上的程序在编译的时候没有发生任何错误信息,但是在执行的时候出现了“ClassCastException”错误提示,表示的是类转换异常,即:两个没有关系的类互相发生了对象的强制转型。

转型的因素:

  • 在实际工作之中,对象的向上转型为主要使用,向上转型之后,多有方法以父类的方法为主,但是具体的实现,还是要看子类是否覆写了此方法;。
  • 向下转型,因为在进行向下转型操作之前,一定要首先发生向上转型,以建立两个对象之间的联系,如果没有这种联系,是不可能发生向下转型的,一旦发生了运行中就会出现“ClassCastException”当需要调用子类自己特殊定义方法的时候,菜需要向下转型。
  • 不转型,在一些资源较少的时候,如:移动开发

class A{
	public void print(){
		System.out.println("A输出");
	}
}
class B extends A{
	public void print(){
		System.out.println("B输出");
	}
	public void funB(){
		System.out.println("funB");
	}
}
public class TestDemo1{
	public static void main(String args[]){
		A a = new B();    //向上转型
		System.out.println(a instanceof A);
		System.out.println(a instanceof B);
		if (a instanceof B){
			B b = (B) a;
			b.funB();
		}
	}
}

为了日后的操作方便,在编写代码的时候,尽量不要去执行向下的转型操作,子类尽量不要去扩充新的方法名称(父类没有的方法名称),依据父类定义的操作完善方法。

例题:利用对象向上转型完成


class A{
	public void print(){
		System.out.println("A输出");
	}
}
class B extends A{
	public void print(){
		System.out.println("B输出");
	}
}
class C extends A{
	public void print(){
		System.out.println("C输出");
	}
}
public class TestDemo2{
	public static void main(String args[]){
		fun(new B());
		fun(new C());
	}
	public static void fun(A a){
		a.print();
	}
}

这样以来就得到了类型的统一,就算有再多的子类出现,方法或者是类也不需要进行修改了,但是在这块必须强调的是:子类操作的过程之中,尽量向父类靠拢。

以后所有的代码之中,都会存在对象的转型问题,并且向上转型居多。

在日后的所有开发之中,像之前程序那样,一个类去继承另外一个已经实现好的类的情况,是不可能出现的。即:一个类不能去继承一个已经实现好的类,只能继承抽象类或实现接口。

2、抽象类

在以后你进行的项目开发中,绝对不要出现一个类继承一个已经实现好的类。

对象多态性的核心本质在于方法的覆写,这样的操作有些不合要求,所以要对子类的方法进行强制的要求就必须采用我们的抽象类进行实现。

2.1 抽象类的基本概念

普通类就是一个完善的功能类,可以直接产生对象并且可以使用,里面的方法都是带有方法体的,而抽象类之中最大的特点是包含了抽象方法,而抽象方法是只声明而未实现(没有方法体)的方法,而抽象方法定义的时候要使用abstract关键字完成,而抽象方法一定要在抽象类之中,抽象类要使用是用abstract声明。


abstract class A{
	private String msg = "www.baidu.com";//属性
	public void print(){	//普通方法
		System.out.println(msg);
	}
	//{}为方法体,所有的抽象方法上是不包含有方法体的
	public abstract void fun() ; //抽象方法
}
public class ChouXiang{
	public static void main(String args[]){
	
		A a =new A();
	}
}

抽象类比普通类多了抽象方法而已,没有上面特殊的。

抽象方法为什么不能实例化对象?

抽象类中包含抽象方法,而抽象方法与普通方法最大的区别就是没有方法体,不知道具体的实现,而如果产生了实例化就意味着以可以调用类中的所有操作。

抽象类的使用原则:

  • 所有抽象类必须要含有子类抽象类的子类
  • 必须覆写抽象中的全部抽象方法——方法覆写一定要考虑到权限问题,抽象方法可以使用任意权限,要求权限尽量public
  • 抽象对象可以通过对象多态性,利用子类为其实现实例化

abstract class A{
	private String msg = "www.baidu.com";//属性
	public void print(){	//普通方法
		System.out.println(msg);
	}
	//{}为方法体,所有的抽象方法上是不包含有方法体的
	public abstract void fun() ; //抽象方法
}
//一个子类只能够利用extends来继续继承抽象类,所以依然存在单继承局限 
class B extends A{//定义抽象类的子类
	public void fun(){
		System.out.println("Hello");
	}
}
public class ChouXiang{
	public static void main(String args[]){
		A a =new B();//向上转型
		a.print();
		a.fun();
	}
}

通过以上的一个程序,现在就可以清楚的发现,与之前类不一样的是,抽象类定义出了子类必须要覆写的方法,而之前的类子类可以有选择性的来决定是否覆写。而且可以发现,抽象类实际上就比普通类多了一些抽象方法而已,其他的定义和普通类完全一样。如果把普通类比喻成一盘炒熟的菜,那么抽象类就是一盘半成品。

关于抽象类的若干中疑问?

1、抽象类能否使用final定义?

不能,因为final定义的类不能有子类,而抽象类必须有子类。

2、抽象类之中能否包含构造方法?

可以,因为抽象类之中除了包含抽象方法之外,还包含了普通方法和属性,而属性一定要在构造方法执行完毕之后才可以进行初始化操作;

3、抽象类之中能否不包含抽象方法?

可以,抽象类之中可以没有抽象方法,但是反过来来讲,如果有抽象,则一定是抽象类。即使抽象类之中没有抽象方法也不能被直接实例化。

4、抽象类能否使用static声明?

如过定义的是外部抽象类,则不能够使用static声明,可是如果定义的是内部类,那么这个内部的抽象类使用了static声明之后,就表示一个外部的抽象类。


abstract class A{
	private String str = "Hello,China";
	static abstract class B{
		public abstract void print();
	}	
}
class C extends A.B{
	public void print(){
		System.out.println("你好,中国");
	}
}
public class ChouXiang{
	public static void main(String args[]){
		A a =new B();//向上转型
		a.print();
	}
}

结论:如果构造方法没有执行,类中对象中属性一定都是其对应数据类型的默认值。

抽象类的最大特点在于强制规定了子类的实现结构。

3、接口

抽象类和普通类最大的特点就是约定了子类的实现要求:但是抽象类有一个缺点——单继承局限,如果要想要求以及避免单继承局限,就需要使用接口。在以后的开发中,接口优先,在一个操作中既可以使用抽象类又可以使用我们的接口,优先考虑接口。

3.1 接口的基本概念

接口就是一个抽象方法和全局常量的集合,属于一种特殊的类,如果一个类定义的时候全部由抽象方法和全局常量所组成的话,那么这种类就称为接口,但是接口是使用interface关键字定义的。


interface A{//定义接口
	public static final String INFO="Hello,World";
	public abstract void print();
}
interface B{
	public abstract void get();
}

那么在接口之中,也同样存在了抽象方法,很明显,接口对象无法进行对象的实例化操作,那么接口的使用原则如下:

1、每一个接口必须定义子类,子类使用implement关键字实现接口;

2、接口的子类(如果不是抽象类)则必须覆写接口之中所定义的全部抽象方法;

3、利用接口的子类,采用对象的向上转型方式,进行接口对象的实例化操作。

image-20210805114718379

在Java之中每一个抽象类都可以实现多个接口,但是反过来讲,一个接口却不能继承抽象类,可是Java之中,一个接口却可以同时继承多个接口,以实现接口的多继承操作。


//因为接口和类的定义命名要求相同,所以为了区分接口和类
//建议在所以的接口前面追加一个字母I
interface IMessage{
	public static final String MSG = "www.baidu.com";
	public abstract void print();//抽象方法
}
interface INews{
	public abstract String get();
}
class MessageImpl implements IMessage,INews{
	public void print(){
		System.out.println("IMessage中print方法:" +IMessage.MSG);
	}
	public String get(){
		return "INews中get方法:" + IMessage.MSG;
	}
}
class NewsImpl implements INews{
	public String get(){
		return null;
	}
}
public class InFa{
	public static void main(String args[]){
		IMessage ms = new MessageImpl();
		//InFa
		ms.print();
		INews m = new MessageImpl();
		//INews中get方法:www.baidu.com
		System.out.println(m.get());
		
		INews mn = new NewsImpl();
		IMessage m1 = (IMessage) mn;
		System.out.println(mn.get());
	}
}

但是需要说明的是:接口之中的全部组成就是抽象方法和全局常量,那么在开发之中一下的两种定义接口的最终效果是完全一样的:

3.2 接口的使用限制

完整定义:


interface A{ 
	public static final String INFO="接口A";
	public abstract void print();
}

简化定义:


interface A{//定义接口
	 public String INFO="接口A";
	 public void print();
}

接口之中所有访问权限只有一种:public,即:定义接口方法的时候就算没写上public,最终也是public.

1.在以后的编写接口的时候,大部分的接口里面只会提供抽象方法,很少在接口里面看见许多的全局常量。很多时候防止避免开发者出现混乱,所以接口的方法都会加上public。

2.当一个子类需要实现接口又需要继承抽象类的时候,请先使用extends继承一个抽象类,再使用implements实现多个接口。


//因为接口和类的定义命名要求相同,所以为了区分接口和类
//建议在所以的接口前面追加一个字母I
interface INews{
	public String get();//抽象方法
}
//可以再类上进行明确描述,在以后的开发之中也经常出现以下的命名习惯
abstract class AbstractMessage{
//只有接口中的abstract中才可以省略,抽象类中的不能省略
	public abstract void print();
}
class NewsImpl extends AbstractMessage implements INews{
	public String get(){
		return "www.baidu.com";
	}
	public void print(){}	//有方法体就叫覆写
}
public class InFa1{
	public static void main(String args[]){
		INews news = new NewsImpl();
		System.out.println(news.get());
		//NewsImpl是抽象类和接口的共同子类
		AbstractMessage am = (AbstractMessage) news;
		am.print();
	}
}

3.一个抽象类可以使用implements实现多个接口,但是接口不能够去继承抽象类;


//因为接口和类的定义命名要求相同,所以为了区分接口和类
//建议在所以的接口前面追加一个字母I
interface INews{
	public String get();//抽象方法
}
//可以再类上进行明确描述,在以后的开发之中也经常出现以下的命名习惯
abstract class AbstractMessage implements INews{
//只有接口中的abstract中才可以省略,抽象类中的不能省略
	public abstract void print();
}
class NewsImpl extends AbstractMessage{
	public String get(){
		return "www.baidu.com";
	}
	public void print(){}	//有方法体就叫覆写
}

public class InFa1{
	public static void main(String args[]){
		INews news = new NewsImpl();
		System.out.println(news.get());
		//NewsImpl是抽象类和接口的共同子类
		AbstractMessage am = (AbstractMessage) news;
		am.print();
	}
}

实际上此时关系属于三层继承。

接口与抽象类


//因为接口和类的定义命名要求相同,所以为了区分接口和类
//建议在所以的接口前面追加一个字母I
interface INews{
	public String get();//抽象方法
	public void pirnt();  
}
//假设一个接口可能有无数个子类,但是对于一个方法的实现是一样的
abstract class AbstractMessage implements INews{
	public  void print(){
		System.out.println("www.baidu.com");
	}
}
//生怕别人不知道NewsImpl是INews接口的子类,做一个重复标记而已
class NewsImpl extends AbstractMessage implements INews{
	public String get(){
		return "www.baidu.com";
	}
	public void print(){}	//有方法体就叫覆写
}

public class InFa1{
	public static void main(String args[]){
		INews news = new NewsImpl();
		System.out.println(news.get());
		//NewsImpl是抽象类和接口的共同子类
		AbstractMessage am = (AbstractMessage) news;
		am.print();
	}
}

image-20210805172013189

4.一个接口可以使用extends来继承多个父接口。


interface A{
	public void pirntA();  
}
interface B{
	public void pirntB();  
}
interface C extends A,B{
	public void pirntC();
}
class Impl implements C{
	public void pirntA();  
	public void pirntB();  
	public void pirntC();  
}
public class InFa1{
	public static void main(String args[]){
	}
}

5.接口可以定义一系列的内部接口,包括:内部普通类、内部抽象类、内部接口,其中使用static定义的内部接口就相当于是一个外部接口

而在开发之中,内部类是永远不会受到概念限制的,在一个类中可以定义内部类,在一个抽象类之中也可以抽象内部类,在一个接口里面也可以定义内部抽象类或内部接口.但是从实际的开发来讲用户去定义内部抽象类或内部接口的时候是比较少见的(Android开发中见过),而且在定义内部接口的时候如果使用了static,表示一个外部接口。


interface A{
	public void printA();
static interface B{  //外部接口
		public void printB();
	}
}
class X implements A.B{
	public void printA(){
		System.out.println("A");
	}
	public void printB(){
		System.out.println("B");
	}
}
public class Inter{
	public static void main(String args[]){
		A.B ab = new X();
		ab.printB();
	}
}

3.3 使用接口定义标准

以上对于接口的概念并不是很难理解,但是需要强调的是,在实际开发之中,接口有三大主要功能:

  • 制定操作标准;
  • 表示一种能力;
  • 服务器端的远程方法试图暴露给客户端。

image-20210805175619590

定义USB接口:


interface USB{
	public void install();	//进行安装
	public void work();	//进行工作
}

定义USB的子类:


class Computer{
	public void plugin(USB usb){
		usb.install();
		usb.work();
	}
}
class Flash implements USB{
	public void install(){
		System.out.println("安装U盘驱动");
	}
	public void work(){
		System.out.println("U盘进行工作");
	}
}
class Printer implements USB{
	public void install(){
		System.out.println("安装打印机驱动");
	}
	public void work(){
		System.out.println("打印机进行工作");
	}
}

源代码:


interface USB{
	public void install();	//进行安装
	public void work();	//进行工作
}
class Computer{
	public void plugin(USB usb){
		usb.install();
		usb.work();
	}
}
class Flash implements USB{
	public void install(){
		System.out.println("安装U盘驱动");
	}
	public void work(){
		System.out.println("U盘进行工作");
	}
}
class Printer implements USB{
	public void install(){
		System.out.println("安装打印机驱动");
	}
	public void work(){
		System.out.println("打印机进行工作");
	}
}
public class InFa3{
	public static void main(String args[]){
	
		Computer cm = new Computer();
		cm.plugin(new Flash());
		cm.plugin(new Printer());
	}
}

发现使用接口和对象多态性结合,对于参数的统一更加明确。而且可以发现接口时再类之上的设计。

image-20210805181329318

3.4 抽象类与接口的区别

区别 抽象类 接口
定义关键字 使用abstract class进行声明 使用interface进行声明
组成 全局常量、全局变量、构造方法、抽象方法、普通方法 全局变量、抽象方法
权限 可以使用任何权限 只能使用public权限
关系 一个抽象类可以实现多个接口 接口不能继承抽象类,却可以继承多个接口
使用 子类使用extends 子类使用implements
设计模式 模板设计模式 工厂模式、代理模式
局限 一个子类只能继承一个抽象方法 一个子类可以实现多个接口

通过上面的分析可以得出结论:在开发之中,抽象类和接口实际上都是可以使用的,并且使用哪一个都没有明确的限制,可是抽象类有一个最大的缺点—一个子类只能够继承一个抽象类,存在单继承的局限,所以当遇到抽象类和接口都可以实现的情况下,优先考虑接口,避免单继承局限。

除了单继承的局限之外,实际上使用抽象类和接口都是类似的,但是在实际的开发中,抽象类的设计比接口的复杂。

image-20210806112850364

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: java基础的详细了解第八天

本文链接: https://lsjlt.com/news/132214.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java基础的详细了解第八天
    目录1、多态性1.1 向上转型1.2 向下转型2、抽象类2.1 抽象类的基本概念抽象方法为什么不能实例化对象?关于抽象类的若干中疑问?3、接口3.1 接口的基本概念3.2 接口的使用...
    99+
    2024-04-02
  • java基础的详细了解第一天
    目录1、Java主要特点2、计算机的高级汇编语言类型:3、JVM(Java Visual Machine)4、编写第一个Java程序并运行5、CLASSPATH指的是类加载路径6、程...
    99+
    2024-04-02
  • java基础的详细了解第二天
    目录1、方法的基本定义2、方法重载3、方法的递归调用4、面向对象的前身是面向过程5、类与对象内存分析引用传递总结1、方法的基本定义 限制条件:本次所讲解的方法指的是在主类中定义,并且...
    99+
    2024-04-02
  • java基础的详细了解第三天
    目录1、private实现封装处理2、构造方法与匿名对象3、简单java类4、数组总结1、private实现封装处理 如果像想要知道封装,首先必须清楚如果没有封装会怎么样? 没有封装...
    99+
    2024-04-02
  • java基础的详细了解第四天
    目录1、数组数组的引用传递数组的静态初始化数组与方法的调用Java对数组的支持数组的数据分析数组排序数组的转置数组的二分查找法对象数组总结1、数组 数组的引用传递 public ...
    99+
    2024-04-02
  • java基础的详细了解第五天
    目录1、String类1.1两种对象实例化方式1.2字符串比较1.3字符串常量是String的匿名对象1.4String两种实例化方式区别1、分析直接赋值方式2、构造方法赋值1.5字...
    99+
    2024-04-02
  • java基础的详细了解第六天
    目录1、this关键字1.1 “this.属性”表示本类属性1.2“this”表示调用本类方法1.3“this”表示当前对象1.4引用传递进阶分析1.5对象比较1.6引用传递实际应用...
    99+
    2024-04-02
  • java基础的详细了解第七天
    目录1、static关键字1.1 使用static关键字定义属性1.2 使用static定义方法1.3 分析主方法1.4 关键字的使用2、代码块2.1 普通代码块2.2 构造块2.3...
    99+
    2024-04-02
  • java基础的详细了解第九天
    目录1、匿名内部类2、Object类简介 2.1 取得对象信息toString()2.2 对象的比较equals()2.3 Object接口引用数据类型3、包装类3.1 装箱与拆箱3...
    99+
    2024-04-02
  • 第八天- 基础数据操作补充 集合set
      字符串的操作补充:  .join() 方法用于将序列(字符串/列表/元组/字典)中的 元素 以指定的字符连接生成一个新的字符串 1 str = "人生苦短我用python!" # 用于字符串 2 s = ".".join(str...
    99+
    2023-01-30
    操作 基础 第八天
  • 从零开始学Python第八周:详解网络编程基础(socket)
    一,Socket编程 (1)Socket方法介绍 Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接“,而打开一个Socket需要知道目标计算机的IP地址和端口...
    99+
    2022-06-04
    详解 从零开始 网络编程
  • Java面试题冲刺第一天--基础篇1
    目录面试题1:Java 中操作字符串都有哪些类?它们之间有什么区别? 正经回答:深入追问:追问1:这三者在效率上怎么说?追问2:那StringBuffer和StringBuffer线...
    99+
    2024-04-02
  • Java面试题冲刺第五天--基础篇2
    目录面试题1:说一下抽象类和接口有哪些区别?正经回答:深入追问:追问1:说一说你对抽象类的理解吧,他到底是干啥用的追问2:用抽象类实现一个接口,和普通类实现接口会有什么不同么?追问3...
    99+
    2024-04-02
  • java基础第23天_数据库连接池\反射
    1.属性赋值-------------1.Man{50+ }Man man = new Man();man.setXxx1(...);man.setXxx2(...);...50Man copy = new...
    99+
    2024-04-02
  • Java面试题冲刺第十七天--基础篇3
    目录面试题1:JDK1.8的新特性有哪些?接口的默认和静态方法:Lambda 表达式:方法与构造函数引用:函数式接口:Annotation 注解:支持多重注解:新的日期时间 API:...
    99+
    2024-04-02
  • 【Java基础】- HttpURLConnection详解
    【Java基础】- HttpURLConnection详解 文章目录 【Java基础】- HttpURLConnection详解一、HttpURLConnection简述二、HttpURLCo...
    99+
    2023-09-09
    java servlet 开发语言 HttpURL
  • Java中的类(基础详解)
    文章目录 可以有多个类,但只能有一个public类类 = 字段+方法类的构造函数我们没写构造函数的时候如果我们自己写了构造函数构造函数中 this 的使用 类的修饰符 / 控制符第一...
    99+
    2023-09-01
    java jvm c++
  • 一文详解 Java 的八大基本类型!
    自从Java发布以来,基本数据类型就是Java语言中重要的一部分,本文就来详细介绍下每种基本类型的具体使用方法和限制。以下为译文:几年前,我开始编写了一系列有关Java入门的文章,我觉得有必要将其中一些非常细节的内容单独拿出来写成文章。这样...
    99+
    2023-06-02
  • 【Java 基础篇】Java Collection详解
    文章目录 导言一、Collection 简介二、List 接口三、Set 接口四、Map 接口总结 导言 Java的Collection框架是一组用于存储和操作对象的接口和类。它提供了...
    99+
    2023-09-14
    java 开发语言 jvm
  • 【Java 基础篇】Java Map 详解
    文章目录 导言一、Map 概述二、HashMap三、TreeMap四、LinkedHashMap总结 导言 在Java的集合框架中,Map接口用于存储键值对,提供了一种基于键进行查找和操作的数据结构。Map接口的实现类提供了...
    99+
    2023-08-30
    java 开发语言 数据结构
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作