首页 > 编程语言 >理解JAVA封装.继承.多态

理解JAVA封装.继承.多态

时间:2025-01-07 23:57:44浏览次数:3  
标签:调用 封装 name 构造方法 子类 多态 JAVA 父类 public

JAVA面向对象的三大特征:封装,继承,多态。

1.封装

(1)封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现的细节,仅通过公开的接口和对象交互。

封装使类成为一个具有内部属性的有隐藏功能的代码模块。

通俗的理解就是将类内部的一些属性和方法隐藏起来,屏蔽细节。

(2)JAVA中通过类和访问权限来实现封装:类可以将数据和封装数据的方法结合在一起,访问权限就是用来控制方法或者属性能否在类外使用。

所以权限访问就是封装的关键,JAVA中提供了四种权限访问限定符:private,public,default,protected。

private:只能在同一包中的同一类中使用,将属性和方法设为私有,阻止类外随意修改。

public:通常用来修饰公共属性和方法,让使用者能了解最基本的信息。

default:能在同一包的同一类和同一包不同类中使用。

protected:不仅能在同一个包中使用,还能在不同包子类中使用,protected 在继承中使用,所以在封装中不多赘述。

下面通过代码演示可以更直观:

public class Test1 {  //这是一个类
    private int a = 10;//被private修饰的变量
    public int a2 = 20;//public修饰的变量

    Ststem.out.printlf(a+a2);//同一类中两者都可以调用
 
}
class Test2 {        //另一个类
    public static void main(String[] args) {
        Test1 s = new Test1();//实例化对象

        System.out.println(s.a);//private修饰的变量不能在别的类中使用,否则编译报错
        System.out.println(s.a2);//public修饰的变量访问权限最高
    }
    
}

当然,想要在类外修改被private修饰的变量,也并非不可能,我们可以在封装类添加一个方法进行赋值,在类外调用此方法,就可以实现改变。

2.继承

面向对象思想中专门提出继承的概念,进行共性提取,实现代码的复用。

(1)继承:是面向对象程序设计使代码可以复用的重要手段,它能使类在保持原有的属性的情况下进行扩展,增添新功能,这样产生的新类,叫派生类(子类),被继承的类叫基类(父类)。

为什么使用继承?举个例子:创建一个猫类,再创建一个狗类,两个类中都有name,age,color的属性和sleep方法,这样我们在使用这两个类的时候,要分别对两个类进行给予属性和方法,会大大增加代码量和出现bug的机率。但当我们创建一个动物类,将两个类中共同的属性和方法放入动物类,再让两个类继承动物类,就可以解决上述问题。

(2)继承语法:

修饰词 子类 extends 父类{ ....};

(3)子类访问父类的成员属性和方法:

当子类中的属性和方法和父类没有重名时,调用时优先先去子类中寻找,如果子类没有则去父类中寻找。

当子类中方法和属性和父类有重名时,优先调用子类;如果方法构成重载,则根据参数的不同调用合适的方法。

(4)子类构造方法

调用子类构造时,会先自动调用父类的构造方法,再调用子类自己的,通俗的讲:先有父,再有子。在代码中演示:

public class Base {   //父类

public Base(){       //父类的构造方法
System.out.println("Base()");
}

}

public class Derived extends Base{ //继承父类的子类
public Derived(){ //子类构造方法

System.out.println("Derived()");// 子类构造方法中默认会调用基类的无参构造方法:super(),没有写时, 
                                    编译器会自动添加,而且super()必须是子类构造方法中第一条语 
                                    句,并且只能出现一次
}
}
public class Test {
public static void main(String[] args) {
Derived d = new Derived();//实例化子类
}
}

结果打印:
Base()  //证明调用子类构造方法时先调用父类后调用子类
Derived()

注意:父类没有自定义构造方法时,默认有一个无参数的构造方法,此时调用子类构造方法也会进入父类调用父类的构造方法。但是当自定义父类的构造方法时,父类的构造方法带有参数,这时调用子类,就会发生编译错误。

public class Test1 {

    public Test1(int i){ //带参数的父类构造方法
        
    }
    }


class Test2 extends Test1 {

    public Test2(){  //调用子类构造方法,发生编译错误
                //当加上super(1)时,则正常编译,()内要和父类构造参数列表数据类型一致
     }
}
class tase{
    public static void main(String[] args) {
    Test2 s = new Test2();

    }
}

(5)super和this

相同点:super和this都是JAVA中的关键字,它们都可以在成员方法中来访问成员属性和成员方法;都可以作为构造方法的第一条语句,但必须是第一条语句,且两者不能同时存在。

不同点:this是当前对象的引用,即调用实例方法的对象,super相当于子类对象中从父类继承下来成员的引用。

在非静态成员方法中,this用来访问本类成员属性和成员方法,super用来访问父类方法和属性。

在构造方法中,this()用于调用本类构造方法,super()用于调用父类构造方法。

3.多态

多态通俗来说就是去完成某个行为,当不同的对象去完成时,会产生出不同的状态。

(1)多态的三个条件:

必须在继承体系下进行。

子类要重写父类的方法。

通过父类的引用调用重写的方法。

(2)实现多态

public class Animal {  //父类
String name;
int age;

public Animal(String name, int age){ //父类带参的构造方法
this.name = name;
this.age = age;

}
public void eat(){
System.out.println(name + "吃饭");
}
}

public class Cat extends Animal{  //子类
public Cat(String name, int age){ //子类带参的构造方法
super(name, age);
}
@Override
public void eat(){  //重写父类方法
System.out.println(name+"吃鱼~~~");
}
}
public class Dog extends Animal { //子类
public Dog(String name, int age){  //子类带参的构造方法
super(name, age);
}
@Override
public void eat(){
System.out.println(name+"吃骨头~~~");
}
}

public class TestAnimal {
// 编译器在编译代码时,并不知道要调用Dog 还是 Cat 中eat的方法
// 等程序运行起来后,形参a引用的具体对象确定后,才知道调用那个方法
// 注意:此处的形参类型必须时父类类型才可以
public static void eat(Animal a){
        a.eat();
}
public static void main(String[] args) {
Cat cat = new Cat("元宝",2);
Dog dog = new Dog("小七", 1);
eat(cat);
eat(dog);
}
}
运行结果:
元宝吃鱼~~~
元宝正在睡觉
小七吃骨头~~~
小七正在睡觉

标签:调用,封装,name,构造方法,子类,多态,JAVA,父类,public
From: https://blog.csdn.net/credif/article/details/144986888

相关文章

  • 后端Java开发:第十一天
    第十一天:方法重载-理解与应用今天我们继续深入Java的世界,讨论Java中的方法重载(MethodOverloading)。你可能会想,什么是方法重载?简单来说,方法重载允许你在一个类中定义多个同名方法,只要它们的参数列表不同。方法重载是Java中实现多态的一部分,也是Java面向对象编程中......
  • Java 8系列之重新认识HashMap14
    摘要HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(JavaDevelopmetKit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。简介Java......
  • Java 8系列之重新认识HashMap10
    摘要HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(JavaDevelopmetKit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。简介Java......
  • 【Java从入门到放弃 之 final 关键字】
    final关键字final关键字final字段final函数列表中的参数final方法final类final关键字Java中里面有final这个关键字,这个关键字总体上是用来表达”不能被改变“这个意思的。我们使用这个关键字表达不能被改变,有两种使用场景,有三个使用位置。使用场景设计上......
  • JavaEE初阶——计算机工作原理
    一、什么是JavaEE JavaEE(JavaPlatform,EnterpriseEdition)是sun公司(2009年4月20日甲骨文将其收购)推出的企业级应用程序版本。这个版本以前称为J2EE。能够帮助我们开发和部署可移植、健壮、可伸缩且安全的服务器端 Java应用程序。JavaEE是在JavaSE的基础上构建的,它提供......
  • 基于java的SpringBoot/SSM+Vue+uniapp的工贸学生信息管理系统的详细设计和实现(源码+l
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • springboot毕设 基于JavaWeb的博客网 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和信息时代的到来,个人表达与知识分享已成为网络文化中不可或缺的一部分。博客,作为一种集个人日记、文章发布、观点交流于一......
  • Java设计模式 —— 【行为型模式】命令模式(Command Pattern) 详解
    文章目录模式介绍优缺点适用场景结构案例实现注意事项模式介绍有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么。此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦合关系。拿订餐来说......
  • 有一个数组{1,2,3,4,5},可以将该数组进行缩减,提示用户是否继续缩减,每次缩减最后的那个元素
    importjava.util.Scanner;publicclassarray{publicstaticvoidmain(String[]args){ScannermyScanner=newScanner(System.in);int[]arr={1,2,3,4,5};do{System.out.println("===========arr当前数组=......
  • Java从入门到精通(第6版)PDF、EPUB免费下载
    适读人群:Java开发程序员配备升级版Java开发资源库,在线大咖课+在线答疑,学习1小时,训练10小时,从入门到项目上线,打造全新学习生态。电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍点击原文去下载书籍信息出版社:清华大学出版社出版年:2021-7-1页数:......