Intro to Object Oriented Programming - Crash Course

แชร์
ฝัง
  • เผยแพร่เมื่อ 7 พ.ค. 2024
  • Learn the basics of object-oriented programming all in one video.
    ✏️ Course created by Steven from NullPointer Exception. Check out their channel: / @nullpointerexception
    🎥 Introduction to Programming: • Introduction to Progra...
    ⭐️ Course Contents ⭐️
    ⌨️ (00:00) Introduction
    ⌨️ (07:37) Encapsulation
    ⌨️ (12:45) Abstraction
    ⌨️ (17:49) Inheritance
    ⌨️ (22:47) Polymorphism
    ⭐️ Sources ⭐️
    🔗 docs.oracle.com/javase/tutori...
    🔗 stackify.com/oop-concept-for-...
    🔗 press.rebus.community/program...
    🔗 stackify.com/oop-concept-inhe...
    🔗 docs.oracle.com/javase/tutori...
    --
    Learn to code for free and get a developer job: www.freecodecamp.org
    Read hundreds of articles on programming: freecodecamp.org/news

ความคิดเห็น • 685

  • @oxanasf6369
    @oxanasf6369 3 ปีที่แล้ว +509

    Notes:
    Four OOP principles:
    Encapsulation:
    * Refers to bundling data with methods that can operate on that data within a class.
    * It’s the idea of hiding data within a class, preventing anything outside that class directly interacting with it.
    * Keeps the programmer in control of access to data.
    * Prevents the programmer from ending up in any strange or unwanted states.
    Abstraction:
    * Refers to the idea to only showing essential details and keeping everything else hidden.
    * The classes you create should act like your car. Users of your classes should not worry
    about the inner details of those classes.
    * This is very important when working on your program incrementally.
    Inheritance:
    * Is the principle that allows classes to derive from other classes.
    Polymorphism:
    * Describes methods that are able to take on many forms.
    * Allows methods to take on many different forms.
    * Be sure that you are calling the correct form of the method.
    * There are two types of polymorphism:
    ** Dynamic polymorphism:
    - Occurs during the runtime of the program.
    - Describes when a method signature is in both subclass and a superclass.
    - The methods share the same name but have different implementation.
    - The implementation of the subclass that the object is an instance of
    overrides that of the superclass.
    ** Static polymorphism:
    - Occurs during compile-time rather than during runtime.
    - Refers to when multiply methods with the same name but different arguments
    are defined in the same class.
    - The parameters are different type or taken in different order.
    - This is known as method overloading.

  • @justincordero7797
    @justincordero7797 3 ปีที่แล้ว +166

    This was a great refresher for me. I like that the instructor speaks slowly so I can increase the video speed through sections I'm more familiar with and watch at normal speed when the information is a bit more unclear. Thanks freeCodeCamp!

  • @smiley-wu1kn
    @smiley-wu1kn 3 ปีที่แล้ว +11

    It's my first time actually watching a half an hour tutorial from start to end without closing youtube. Thanks a lot!

  • @nicolahcm
    @nicolahcm 2 ปีที่แล้ว +322

    Resume:
    1) Encapsulation ----> Getters and setters
    2) Abstraction --> We care about Interface. Not the implementation behind the hood.
    3) Inheritance --> Extending classes... Access modifiers: public, private, modifier
    4) Polymorphism --> Interface / Implements in Java ... Same methods' name, but different implementations of methods.

  • @microman502
    @microman502 3 ปีที่แล้ว +8

    The examples used are very straightforward and every concept is explained well. I haven't watched any video on OOP before, but this one will help me a lot to make better code. 10/10 video!

  • @peterhimmelman9241
    @peterhimmelman9241 3 ปีที่แล้ว +18

    Amazing descriptions of the 4 main principles of OOP. Thank you!

  • @mayukakat1524
    @mayukakat1524 2 ปีที่แล้ว +3

    Thank you for sharing this video. I have watched multiple videos on this topic on TH-cam and yours is hands down the best I have seen. I just watched it the third time and and comfortable with all the concepts.

  • @as_below_so_above
    @as_below_so_above 3 ปีที่แล้ว +16

    I really enjoy the use of the chess example. I think the chess example makes it easy to understand the kinds of constraints that are required for each object and method, as well as why those constraints are necessary for the game of chess to work properly. Great video!

  • @j.rayscott4681
    @j.rayscott4681 3 ปีที่แล้ว +61

    This is excellent. My only suggestion would be to continue the chess example on through the whole video. Using the chess game analogy really helped me understand OO.

  • @415423591
    @415423591 3 ปีที่แล้ว +12

    Wow. Thank you for speaking so calmly and clearly! Big plus.

  • @ajibadesamuel4578
    @ajibadesamuel4578 2 ปีที่แล้ว +2

    Just brilliant, you made it really simple. I have tried so hard to understand these concepts and now your explanations gave me a better understanding. Thank you.

  • @ChewingGum113
    @ChewingGum113 3 ปีที่แล้ว +9

    Thank you so much for explaining!! It was very clear for me. I hope there will be a similar introduction for Functional programming, and also the pros and cons between those 2 styles of programming.

  • @omarwaleed2320
    @omarwaleed2320 3 ปีที่แล้ว +8

    Extremely well-explained, I would love to watch more video like this one!

  • @SGTrainingStable
    @SGTrainingStable 3 ปีที่แล้ว +40

    I tried to learn this material from a collect instructor and several textbooks in the past three years, but you explain cover this topic in a very clear, thorough, and concise manner that is easy to understand. I am so grateful to you for this presentation. You should seriously consider writing textbooks-I would be súper interested in reading them!

    • @voltaire5427
      @voltaire5427 2 ปีที่แล้ว

      I'm only about 20% of the way through my first programing course and understood about 90% of the lecture. Very well explained even to a layman.

  • @candleby
    @candleby 3 ปีที่แล้ว +2

    Not being a professional, I always had a vague idea what OOP meant but would have been hard pressed to explain it to anyone. Thanks to your excellent video I finally had the "aha-moment". Thanks very much, Steven!

  • @ayazulhaq4727
    @ayazulhaq4727 3 ปีที่แล้ว +313

    I've been working for 6 years in the market and I can say no one has explained so simply as you did. kudos

    • @valdemarvreeman8231
      @valdemarvreeman8231 3 ปีที่แล้ว +15

      I wonder why you haven't learned OOP in the 6 years you been in the market...

    • @ayazulhaq4727
      @ayazulhaq4727 3 ปีที่แล้ว +59

      @@valdemarvreeman8231 Who said anything about learning? I was talking about the way he explained. There is a difference, isn't it?

    • @sultanakalsekar6800
      @sultanakalsekar6800 3 ปีที่แล้ว +8

      @@ayazulhaq4727 absolutely

    • @kientran4818
      @kientran4818 2 ปีที่แล้ว +21

      @@ayazulhaq4727 apparently he has issues with his reading skill.

    • @maliha.ishtiaq
      @maliha.ishtiaq 2 ปีที่แล้ว

      @@kientran4818 hahahaha. savage reply...

  • @sesu6743
    @sesu6743 7 หลายเดือนก่อน +1

    Wow, just wow. I already have a bit of experience with OOP, this video helps me to refresh my understanding of it in just 30 minutes. This is great, thanks for making this!

  • @alancoates
    @alancoates 2 ปีที่แล้ว +2

    This is an exceptionally clear explanation of OOP. Well done!

  • @SourabhBishnoi100
    @SourabhBishnoi100 ปีที่แล้ว +4

    This is by far best explanation of OOP I have ever heard, Thanks :)

  • @jordycoder
    @jordycoder 3 ปีที่แล้ว +1

    Thank you for sharing your creative way of explaining what OOP is.
    Awesome. helps me to become a better programmer

  • @jameshansen801
    @jameshansen801 2 ปีที่แล้ว +3

    Thank you so much for this course! It's so pleasing to listen to :)

  • @victoriateixeira9943
    @victoriateixeira9943 7 หลายเดือนก่อน +1

    Such a good video!!! Helped me understand concepts that I'd tried to fully understand before, but couldn't! Thanks!

  • @DipaLoka
    @DipaLoka 3 หลายเดือนก่อน

    I've been working for 13 years in the industry and have studied many courses, and this is still probably the best description I have ever heard! Thank you

  • @haamithsulthan5858
    @haamithsulthan5858 3 ปีที่แล้ว

    Loved the content. Subscribed. Hope the channel grows fast.

  • @Serkan0kur
    @Serkan0kur 3 ปีที่แล้ว +2

    Thank you for the informative video. It is a nice summary kept in 30 minutes with meaningful examples.

  • @Aviel777Gergel
    @Aviel777Gergel 2 ปีที่แล้ว +1

    The examples r super clear. Absolutely recommended to watch!

  • @anyaozioma9583
    @anyaozioma9583 2 ปีที่แล้ว +1

    I can say you are one of the best tutor I have met, u take your time to explain, I also watched you tutorial on introduction to programming, it was 🤯. Well done 👍.

  • @JZ1917
    @JZ1917 2 ปีที่แล้ว +1

    This is great content! Clear and great density. Thank you!

  • @TheTrace8
    @TheTrace8 3 ปีที่แล้ว +7

    Wow! This is educational video making at it's finest. Near perfection. I'm sure many viewers have tried to get these concepts clear elsewhere, and will finally achieve clarity here, like I am doing now after code school plus 2 years working in the field.

    • @TheTrace8
      @TheTrace8 3 ปีที่แล้ว +1

      But as a guy who DOES appreciate the layer underneath the abstraction of a car, I'll add humorously: to think a sportscar has twice the fuel efficiency (using half the gas) of whatever a normal car is, is unlikely. Also, wanting to drive it a "double" of miles, instead of just an int... That's gotta be a very, very, very, very well made car. :) But, still, great video.

  • @Vonaan
    @Vonaan 2 ปีที่แล้ว +10

    This is the best explanation I've been able to find. I was creating my own first OOP application and was struggling to see the difference between a class and an object. This explanation via chess makes it so obvious that I wonder why I didn't get it in the first place. It's al about the chess example and the way you explain it. You have great presentation and tutor skills. Now I just need to start my application from scratch again. Please could you also explain the several UML diagrams based on this chess example? That would be a great way to show everyone how you can design your application with OOP in mind before even starting to code. It would have prevented me from making a lot of beginners and obvious mistakes.

  • @perianka
    @perianka 3 ปีที่แล้ว +11

    please do a more advanced one! loved this

  • @sivi1560
    @sivi1560 2 ปีที่แล้ว +1

    Amazing video! Thanks, it really helped me as a total newbie to OOP.

  • @jadamccoy8376
    @jadamccoy8376 3 ปีที่แล้ว +2

    Excellent explanation! Thank you!

  • @dorischoo
    @dorischoo 3 ปีที่แล้ว +1

    This is a complex foundational subject that clearly explaining the principles of how it works. 😎 cool! Thanks

  • @connorferguson2351
    @connorferguson2351 3 ปีที่แล้ว +14

    I’m just starting to learn programming. This is very helpful and the best explanation I’ve seen for a newbie.

    • @splashbruda8211
      @splashbruda8211 2 ปีที่แล้ว

      How's it going so far? I am starting myself, curious how much you advanced in a year.

    • @i_am_dumb1070
      @i_am_dumb1070 ปีที่แล้ว

      @@splashbruda8211 what about you how much have you improved?

    • @shivaayshorts000
      @shivaayshorts000 8 หลายเดือนก่อน

      ​@@splashbruda8211have u been pro now, or still at learning phase?

    • @gdplentie3
      @gdplentie3 2 หลายเดือนก่อน

      ​​@@i_am_dumb1070and how about you?

  • @kairu9413
    @kairu9413 2 ปีที่แล้ว +1

    I like how he use game examples to implement the 4 main principles of oop, it keeps me interested.

  • @Lembdadelta
    @Lembdadelta 5 หลายเดือนก่อน +1

    I thought I would be studying the whole weekend for that Java class in which I'm totally lost... but in 30min at 1.25 speed I've gotten further than in several hours of regular lecture. Thank you for your clear explanation.

  • @fredericktiku2585
    @fredericktiku2585 2 ปีที่แล้ว

    I love Your voice tone and method of teaching,thank you.

  • @KhangNguyen1
    @KhangNguyen1 3 ปีที่แล้ว

    Thank you for making this detailed video.

  • @FlygarN338
    @FlygarN338 2 ปีที่แล้ว

    Best video ive seen in my life. Thanks for saving my future

  • @kingshanaman
    @kingshanaman ปีที่แล้ว +1

    Simple and straight to the point.

  • @bassome3000ify
    @bassome3000ify 3 ปีที่แล้ว +10

    Oh mah gah it was so beautiful 🤤
    Thx fcc 🥺

  • @badhombre4942
    @badhombre4942 3 ปีที่แล้ว +3

    Abstraction means, focusing only on that which is relevant to your application, when modelling your objects/classes.
    For example, the attributes and behaviour you would assign to a Person object would be different for a banking.vs a fitness app.

  • @RugbugRedfern
    @RugbugRedfern 3 ปีที่แล้ว +4

    This is the most useful and informative programming video I've ever watched. Thank you so much!

  • @ThatGuyAlon
    @ThatGuyAlon 2 ปีที่แล้ว

    Thanks for this. I'm taking this class next semester. Wish me luck

  • @dimykogoya2561
    @dimykogoya2561 ปีที่แล้ว

    Thank you for explaining the concept!

  • @cj7528
    @cj7528 3 ปีที่แล้ว

    Really clear explanation. Thankyou!

  • @williamwambua7710
    @williamwambua7710 3 ปีที่แล้ว

    This the best intro everrrrr...thank you lemme sub

  • @syedusamamanzoor1838
    @syedusamamanzoor1838 2 ปีที่แล้ว +3

    I'm a complete beginner to programming and this is so well explained that even a illiterate like me can understand.

  • @user-wc1sm8cj8s
    @user-wc1sm8cj8s 3 ปีที่แล้ว

    Great Video!!! Thanks for this tutorial!

  • @Ihbramm
    @Ihbramm 3 หลายเดือนก่อน

    Good refreshment here! Thank you a lot!

  • @Twysthor
    @Twysthor 3 ปีที่แล้ว +8

    Thank you for this refresher! The line between Encapsulation and Abstraction tends to blur in my mind

    • @AbhiKhatri
      @AbhiKhatri 3 ปีที่แล้ว +11

      Think of encapsulation as grouping together and abstraction as hiding the inner workings. That worked for me.

    • @Twysthor
      @Twysthor 3 ปีที่แล้ว +2

      @@AbhiKhatri short and sweet! Thanks

  • @zechariahhounwanou8462
    @zechariahhounwanou8462 2 ปีที่แล้ว +1

    This was really helpful. It made me understand Encapsulation, Abstraction, Inheritance, and Polymorphism. worth my time

    • @schmetterling4477
      @schmetterling4477 2 ปีที่แล้ว

      Yes, but you still don't know how to use any of that to write better software. Maybe you think you do, but that only makes you more dangerous, not more professional.

  • @melkenhoning158
    @melkenhoning158 3 ปีที่แล้ว +203

    Newbies please listen before you end up like me! If the only language you know is Python, I urge you to learn C#, C++ or Java to actually understand how to implement this practically. Python is a great language but it abstracts a lot of important OOP concepts and it makes it extremely hard for beginners to understand why OOP is important. OOP is all about defining data before functionally, and python is very nebulous about its data.

    • @experiment0003
      @experiment0003 2 ปีที่แล้ว +11

      I agree. Going from Python to C++ and Java wasn't as smooth as I thought. Now, I don't see myself going back to Python (unless, of course, for occasional data science with numpy/pandas).
      Python => print("Hello World!").
      Java ==> package > class > public static void > System out > ("Hello World!")

    • @rubayetalam8759
      @rubayetalam8759 2 ปีที่แล้ว +1

      is it important for data science or machine Learning?

    • @potatoes5829
      @potatoes5829 2 ปีที่แล้ว

      Good thing I started with c++

    • @MarcusHCrawford
      @MarcusHCrawford 6 หลายเดือนก่อน +2

      @@experiment0003
      Java:
      import Java.util.Scanner
      Class HeyThere {
      Public static void main(String[] args){
      Scanner userIn = new.Scanner(System.in);
      String name = userIn.nextLine();
      System.out.println(“Hello “ + name);
      }
      }
      Python:
      name = input(“Enter name:”)
      Print(f”Hey {name})
      And don’t even get me started about how Java is case sensitive, that part drives me nuts.

    • @experiment0003
      @experiment0003 6 หลายเดือนก่อน

      @@MarcusHCrawford I swear 🤣

  • @zensic
    @zensic 2 ปีที่แล้ว

    Thank you! Was a good refresher!

  • @radu9150
    @radu9150 8 หลายเดือนก่อน +1

    Is there a continuation video after this one?
    Great explanation🎉

  • @pawel040408
    @pawel040408 2 ปีที่แล้ว

    Very good overview and intro to the subject.

  • @freedatascientist2786
    @freedatascientist2786 3 ปีที่แล้ว

    Nice content ! Thanks for the inspiration

  • @craigsang4726
    @craigsang4726 3 ปีที่แล้ว

    Thank you so much for sharing 🙌bro

  • @saurabhsharma6929
    @saurabhsharma6929 3 ปีที่แล้ว

    Thanks, great explanation.

  • @wayneinteressierts9973
    @wayneinteressierts9973 ปีที่แล้ว

    Great explanation, thank you!

  • @skn__07
    @skn__07 2 ปีที่แล้ว +8

    Even though I have learned these before, this one is a real gem.

  • @chandra.developer
    @chandra.developer 5 หลายเดือนก่อน

    By far the best video on oops. Exactly what someone needs.

    • @McFlashh
      @McFlashh 5 หลายเดือนก่อน

      Could be better if they implemented the examples in code.

  • @johnsonsubedi1193
    @johnsonsubedi1193 3 ปีที่แล้ว +2

    Great Work to keep up self-learners.
    Thank you 🙇

    • @aammssaamm
      @aammssaamm 3 ปีที่แล้ว

      Actually it has really bad issues self-learners cannot identify.

    • @hexerei02021
      @hexerei02021 3 ปีที่แล้ว +1

      @@aammssaamm Could you share some of those issues pls ?

    • @aammssaamm
      @aammssaamm 3 ปีที่แล้ว

      @@hexerei02021 Already.

  • @ToniLopezMM
    @ToniLopezMM 2 ปีที่แล้ว

    Thanks very much, extraordinary and very clear crash course

  • @omnikam3045
    @omnikam3045 3 ปีที่แล้ว

    Keep making such informative course

  • @upgraduate
    @upgraduate 3 ปีที่แล้ว

    The theoretical explanation was good to understand.

  • @liliaa1749
    @liliaa1749 ปีที่แล้ว

    This was a life save thank youuu!!

  • @mrboyban
    @mrboyban 3 ปีที่แล้ว

    Nice, clear English content, many thanks.

  • @Fire_Rice
    @Fire_Rice 2 ปีที่แล้ว

    this is very helpful. thank you!

  • @aymadummeech
    @aymadummeech ปีที่แล้ว +9

    If I'd describe OOP, it would be convenient interaction/communication.
    Its like two people having a great conversation that would result in a mutual benefit

    • @lepidoptera9337
      @lepidoptera9337 ปีที่แล้ว +4

      Yeah, that is not what is is, but keep smoking. ;-)

    • @TonyTigerTonyTiger
      @TonyTigerTonyTiger ปีที่แล้ว

      @@lepidoptera9337 Oh, so you just trolling all over the place in the comments to this video. What a sad, little person you are.

    • @SweepAndZone
      @SweepAndZone 4 หลายเดือนก่อน

      Lmfaooo ​@@lepidoptera9337

  • @rasu84
    @rasu84 3 ปีที่แล้ว

    Thanks. Very clear and concise.

  • @i_am_dumb1070
    @i_am_dumb1070 11 หลายเดือนก่อน

    It really helped me a lot to understand this OOP topic Thankyou very much fcc.

  • @kvelez
    @kvelez 8 หลายเดือนก่อน

    Great study.

  • @venkatasreeram
    @venkatasreeram 3 ปีที่แล้ว +8

    Waiting for this course.....🔥

  • @andresfeslavazuluaga9611
    @andresfeslavazuluaga9611 3 ปีที่แล้ว

    Thanks for explaining it!!!

  • @mohgawsih6958
    @mohgawsih6958 2 ปีที่แล้ว +1

    thank you . . . much needed material . . . trans-language concepts

  • @bakhtiyor_sulaymonov
    @bakhtiyor_sulaymonov 10 หลายเดือนก่อน

    Thank you. Very well explained

  • @hhbadarin
    @hhbadarin 2 ปีที่แล้ว

    The best of the best, Thank You!

  • @neviswarren
    @neviswarren หลายเดือนก่อน +2

    Excellent thanks.

  • @VideoBunt
    @VideoBunt 3 ปีที่แล้ว +4

    Cool explanation)) but what about aggregateon and composition?

  • @kuldeepgupta7607
    @kuldeepgupta7607 3 ปีที่แล้ว

    Great explaination!

  • @thecaveofthedead
    @thecaveofthedead 2 ปีที่แล้ว +2

    Very useful. Criticism: sometimes you're referring to this object refers to this object and it became completely unclear in which direction interactions were happening.

  • @yashpathak9285
    @yashpathak9285 3 ปีที่แล้ว +1

    That a semester course in 30 minutes. Thank you Freecodecamp!!!

  • @josephinekwakye4495
    @josephinekwakye4495 ปีที่แล้ว

    This is gold...Thank you

  • @samuelescobar6121
    @samuelescobar6121 11 หลายเดือนก่อน

    i liked learning both the intro to programming and this intro to OOP, it was hard for me though :)

  • @nafisnawalnahiyan5032
    @nafisnawalnahiyan5032 2 ปีที่แล้ว

    Thank you for helping me! Forever in debt!

  • @saidneder41
    @saidneder41 3 ปีที่แล้ว

    Beautiful!!!

  • @ashrafbeshtawi3556
    @ashrafbeshtawi3556 2 ปีที่แล้ว +22

    I am having a job interview after 15 min.. good short refresh.. wish me luck
    Update: I got the job ✌😃

    • @anjanaouseph4605
      @anjanaouseph4605 2 ปีที่แล้ว +2

      Hope it went fine!

    • @ashrafbeshtawi3556
      @ashrafbeshtawi3556 2 ปีที่แล้ว +4

      @@anjanaouseph4605 it was great. I will get the final response in 1 week😃

    • @anjanaouseph4605
      @anjanaouseph4605 2 ปีที่แล้ว +1

      @@ashrafbeshtawi3556 All the best!

    • @SahPhoenix
      @SahPhoenix 2 ปีที่แล้ว +1

      Hope it went well!

    • @bruhman4939
      @bruhman4939 2 ปีที่แล้ว +2

      Hope you got a good response!

  • @harsha7010
    @harsha7010 3 ปีที่แล้ว +1

    Thank you ☺️

  • @yopanssudo
    @yopanssudo 3 ปีที่แล้ว

    That was great. Thanks.

  • @jdabbasi990
    @jdabbasi990 2 หลายเดือนก่อน

    Simply Bravo

  • @hasanrants
    @hasanrants 2 หลายเดือนก่อน

    great video! well explained.

  • @petarstoyanov9024
    @petarstoyanov9024 2 ปีที่แล้ว

    Utterly excelent!

  • @Trupen
    @Trupen 2 ปีที่แล้ว +1

    Thank you

  • @megrief
    @megrief ปีที่แล้ว

    It was really clear explanation. Thanks for your work. It would be perfect to make sound also clear, but it's not so necessary ^_^

  • @MjCNirdna
    @MjCNirdna 3 ปีที่แล้ว +342

    My teacher took 2 months to explain all of this OOP main principles.

    • @aammssaamm
      @aammssaamm 3 ปีที่แล้ว +15

      This guy does not understand them either. He gives a wrong example.

    • @abhishekjoshi4091
      @abhishekjoshi4091 3 ปีที่แล้ว +43

      @@aammssaamm stop hating and point out what he taught wrong

    • @aammssaamm
      @aammssaamm 3 ปีที่แล้ว +6

      @@abhishekjoshi4091 You may want to learn some good manners first.

    • @Doschia
      @Doschia 3 ปีที่แล้ว +67

      @@aammssaamm So he has no mannes because he says "stop hating"?
      Interesting.

    • @aammssaamm
      @aammssaamm 3 ปีที่แล้ว +1

      @@Doschia you may want to get the same.

  • @unathinemutanzhela7970
    @unathinemutanzhela7970 3 ปีที่แล้ว +1

    Simple and clean, thank you.

  • @babahaibhokaal5129
    @babahaibhokaal5129 3 ปีที่แล้ว

    Sir please make videos on computers and and its basics operation like conversion of binary and some basics like ram, ROM , etc things ,......please because of exam and because of the lockdown we are not able to attend the computer science lectures please make video sir...... Lots of love sir for helping in this lockdown.........

  • @Juanjo-do4qz
    @Juanjo-do4qz 3 ปีที่แล้ว

    Justo cuando lo necesitaba