Java Full Course | Java Tutorial for Beginners | Java Online Training | Edureka

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
Java is one of the most fundamental programming languages that anybody can learn despite being so simple. It is a Marvel what can be achieved with the use of java? Hi everyone. I welcome you all to this Java full court session by Edureka, but before we begin, let's look at our agenda for today. So we're going to start out by talking about Java, what it is, and why do we need it? Then we're going to discuss a few basic concepts like variables and data types in Java followed by which we are going to talk about operators control statements and methods. We are also going to discuss the meat and potatoes of this session classes objects and object oriented programming Concepts in Java followed by which we are going to talk about exception handling then we're going to discuss Java collection Frameworks and finally close this Action by discussing the Dom parser in Java also do click on the Subscribe button to never miss an update on the hottest Technologies by the Edureka YouTube channel. Okay, before we start off let me introduce myself. I am vinoth and I have been with this industry IT industry specifically into Java development for last 12 years. Alright, so the first topic is about introduction to Java. So what are we going to cover in this particular topic? So it's going to be introduction to Java what Java is all about will have Java installation done as well. So that you guys can use it in future. You guys can try your hands on we'll talk about modifiers and variables in Java. This is pretty much similar to what we have in other programming languages will talk about Java data types as well, which is nothing but data type as we have the it's a storage for different data types, right or the data that is store whatever you want to process. Song is first put into memory and that is what data type is all about. So you have different storage is like for character you have something else and for float you will have something else for long. We will have something else sort of data type conversion in Java. So so you could convert from one data type to other data type in Java. There are implicit conversions done. We're in the programmer need not take care about it. Java programming by itself would take care about converting it which is implicit conversion and there are few conversions, which programmers have to take care about they have to explicitly mention that you have to convert from this data type to this data type. And if you don't do it you would end up in compilation errors or something. We'll talk about operators operators are nothing but the operators that work upon this data type and which is nothing but transformation. So you kind of use this operators to add up for say for example Of two integers you want to add it up. So you would have this operators used. We'll talk about control statements in Java as well control statements. Like you have if else and for loops and stuff like that, so we'll talk about it. So Java is pretty much similar to other programming languages thing is it has some unique features which makes it really important in the current industry the IT industry when it comes to Big Data and stuff like that. So we'll touch base on all this important features of java, which would help you to understand. Why do we really use it? Alright. So the first topic is Introduction. So what is Java so Java as we said the programming language which has object-oriented programming model. So when I say object-oriented programming model everything in Java is taken as an object. So object is nothing but something that has got State and behavior say for example, you have chair, right? Jed has got a particular State and it has got a particular Behavior. If you do something if you move it, it would go this way and that way and stuff like that. So basically any object if we think about in reality realm any object for that matter would have some kind of state and it would have some kind of behavior which incorporates on its own. Right? So basically similar to that Java is programming language, which is based on object oriented programming model. So everything Java could be thought of as an object or you define a class. So say for example you have house right? So house could be thought of as an object or class rather a house has a class and it would have certain attributes right like number of rooms or stuff like that. So that is nothing but the state of the house. So this was actually brought in by Sun Microsystems in 1995, and basically Java is nothing but we have jvm but jvm is nothing but you kind of kind of can say it's a specification right Sun Microsystems has said that this is how it should be so that any company tomorrow I can go and create my own version of java, but it has to be aligned to this particular specification that is given by Sun Microsystems. So Java is nothing but reference implementation of java is provided by Sun Microsystems, but nevertheless as I said give him itself is a specification which anyone can Implement actually but we will talk about Sun Microsystems talk about the reference implementation that is nothing but one created by Sun Microsystems. So everything in Java would have a state and behavior and which would be defined by class. Again, it was started off by a team led by James Gosling and we know it's open source, which doesn't stop anyone from putting in whatever code. I want to still we have lot of versions coming in Java. So it's not that you just have one version created by Sun Microsystems and it's been used across the industry. You have like find some issues or if they want to have some kind of enhancement in the open a particular module the keep doing it. So right now we have like Java is at version 12, which is like we have lot of enhancements coming in. It's a evolving thing it's ever evolving thing. And as I said, this is open source tomorrow. If you become a good programmer in Java, you could go and actually write something for Java and which would be moderated by someone and which would be put as open source. And anyone can use it other thing is Java the very important feature why we use Java or why Java is so widely used is right once and run everywhere. So you write a class or you write program once and you compile it and this particular compiled version of class. Be run anywhere on any machine or you could transport this particular compiled version of java, which is nothing but classify we call it as a class file again, you did not get into what is class file. But just to say that you compile it you get a compiled version of it and this compiled version of class could be transported anywhere in the network or you could put it anywhere and just run it so you could take it on your pen drive as well and go anywhere and plug your pendrive get this class path download this class path or download this class rather and just run it so it right once and run everywhere and the magic part is it could be run on any environment. It could be run on any platform. That's why it's platform independent. So I could write a program today on Windows compile it and tomorrow I can just take it on my pen drive and run it on Linux as well. So you don't have to take care about it. Java by itself has a feature to make it platform independent. So As you could imagine this is one of the reasons why it's been widely used because since we are getting into a phase of distributed computing, we cannot have everything run on same platform. You don't know where your so you as a programmer write something but you don't know where this particular program is going to run. It could be on any platform. So this is why it is more important. So unlike dotnet, right? You need to have Microsoft just to give you this thing comparison with dotnet so for.net you need to have Microsoft stack implemented, but for this you need not could be run everywhere. So Java can be used to create complete applications that may run on a single computer or can be distributed among servers and clients in the network. As I said, this is more about the application of platform-independent programming language. So it could be used on any machine you need not take care about which machine your program is going to run on. All right, so let's talk about Java. Earth so what features do we have in Java? First thing is Java is pretty much simple when it comes to SDK or when it comes to API application interface. It's pretty much simple. It's kept as simple as possible. It's pretty much similar to other programming languages and it's verbose. So anyone can just read through it and understand what it is trying to do so they have kept it to that level so similar to any high-level languages, right the coach should be such that as you read through it. You should understand what it is doing and that's what they have tried to do. Its high-performance. One of the things that I already mentioned about. It's an evolving system. It's not that it's been just done once and been used throughout its evolving system. So as and when this continuous Improvement done, right, so as then when if I as the application programmer if I find something not working as expected I can raise a ticket and they could go through the ticket or there's a Java development. Which has been driven by Oracle. Now, they would look at the priority of this particular stuff. And if there are a lot of tickets been raised by other companies as well. And if something could be done on the aspect on the particular aspect that you raised they would surely Incorporated and notify you in a particular release the enhancement is coming up and stuff like that. So it's a evolving system and you know, the performance is always if there's some drawback or if there's something not working as expected they would surely Rectify it in the future releases. So that way it keep it up to the mark the keep the high-performance thing going it is secured. So Java basically runs in virtual machine sandbox, and no one can get into this particular space. So no one can intrude it. I would say so that keeps it free from virus and stuff like that or untrusted process. And other thing that is important is unlike C. Java doesn't expose pointers so in see There could be malicious user who could get into the memory location through pointers and can manipulate the contents of a particular memory. Right? Whereas in Java. It doesn't expose the pointer. It doesn't give you the pointer to a memory location. So you can't actually go and change the content of a memory location when you are using Java so that keeps it secure. So it's robust. So Java checks the code during compilation time and runtime. So basically what happens is as I said when you compile it you get a class file and whenever you try to run this class file on any of the machines, it will ensure that it's properly done or if there's some issue with the class file. It would say that it's a correctly classify. So basically you have some kind of checks done during the compilation as well compilation is nothing but if you have something tactical error say, for example, if you miss the semicolon at the end of a particular statement or an end of any statement, It would prompt you during the compilation time that this is not what is expected or it would ask you to correct it once you have everything as for the expectation, it would compile it and create a class file and when you put this glass file to any of the machines during the runtime it checks as well. And the other thing is about you don't have to take care about memory allocation and releasing unlike in other programming languages. Java by itself does garbage collection garbage collection is nothing but when a particular memory is not being utilized by your program of goes out of scope it would Java by itself has a thread I don't want to get into threads and stuff like that. But Java would enough the memory contains by itself. You don't have to explicitly write a code to clean it and see you have to write a code to clean. It errors in Java. It's done by itself. So that makes it robust other thing is it's portable as we already spoke. You can write a programming windows. You can run the same program or you can write a program in Windows compile it get a class file or the compiled version of the class and just put it on any platform. It could be Windows. It could be you run it on Unix or Linux or Mac or anywhere so you don't have to take care about it. So Java by itself does it and that's where jvm comes into picture which we'll talk about in the the further slides. So other thing is it's Dynamic which means that it has runtime polymorphism. So all the objects are evaluated during runtime. It's not just that it's done during the compile time. There. Is this something done during the runtime as well. So basically it's called as runtime polymorphism. But just to keep in mind not everything is linked up during the compile time is something done during the runtime as well. So it could be distributed as well. You don't have to have all the code put into one machine and run it from my machine. I could run something written on your machine as well. If into net in the same network or if if they are exposed to a network we could run programs on different machines. So that's what distributed is all about. So you could think of big data. So this is one of the major features why Java is been widely used in big data, right? So big data is nothing but you have chunks of data you have like petabytes of information coming in every minute or every hour or every day, right and you want to process it. So it cannot be done in one machine if you want to run everything on one machine as we had earlier, right? Everything was monolithic everything was done on one machine sort of so that's where you would want to have servers right. Now. The server thing is it's not being used that much since there's a lot of English. Intense stuff like that. So distributed computing is nothing but we have like pure computers or normal computers that we have and programs are actually done on this machines rather than rather than having a high-end machines. So basically this feature is what helps Java to be used in big data. And as I said, it's run on commodity Hardware as against server Hardware which needs a lot of investment for companies. Java is multi threaded so multi-threaded is nothing but so you have multiple cores on your machine, right? You have like four cores and stuff like that. So you could utilize all this for course say for example, you want to do addition of two numbers and multiplication of two numbers right different numbers. So you don't have to run everything on One Core. So this could since you have four processors right for course, you could have addition run on one core and you could have this multiplication going on at the same time at the same instance, right? You could have this multiplication going on as well. You could run them as a thread right? You don't have to have one waiting for other. You don't have to do it in a sequential manner when you're operating on different variables, right? So that's what multi-threaded is all about. As I said you could have this operations carried out on different course in the same instance of time. Object-oriented again as I spoke earlier, everything is performed using objects and Java can be easily extended since it is based on object model. Now, let's talk about which sectors or which industry sectors actually use Java. So you have Android apps. So Android apps Cal could be written on Java. So basically the underneath is Android API, which is similar to jdk so jdk is nothing but Java development kit. It's widely used in financial services industry. If if you would have some idea about it. You could see that mostly all Financial companies use Java. So the Legacy systems that we have in financial companies is mostly developed on Java. So one of the aspects for this is more about it's pretty secure. So that's why it's been written on Java lots of global investment Banks. Like Citigroup Barclays Standard Chartered and other Banks use Java for writing front and back office electronic trading system. So one of the main features why it's been used in financial industry is about security. It provides high level of security as we spoke earlier Java web applications. So basically you have web servers on which your application would be hosted and you could request for a particular JSP or JSP is nothing but a dynamic HTML page right there in the contents could change basically you could request for some particular JSP and you could get it so say for example, you are trying to log on to a particular application you get a login page that is nothing but a JSP. So basically a mini of the web applications is developed on Java as well. One of the main features why web applications are developed because you have a lot of web servers supporting, Java you Have to deploy application on a particular web server and could access it from anywhere across glue. You should be on internet though. Embedded system when it comes to embedded system. It has to be lightweight, right. So Java it I remember Java version 8 had lot of feature making it pretty much light weight when it comes to embedded systems. So basically you have Micro addition j2me. What we are talking here is j2se and the thing that we so there are three flavors of java. So one is j2se, which is nothing but standard edition and which is standard edition, which you have like all the data types and stuff like that all four loops and stuff like that. Right that is about j2se. You have G to EE which is Enterprise Edition, which is nothing but the web application that we spoke about and we have j2me which is micro Edition, which is nothing but for embedded systems as its name suggests, it is micro Edition, which is light in weight. And as we can imagine that in embedded system, it has to be lighter since it is burnt into a chip, right and you cannot have a big application. So that's why we have lightweight when it comes to j2me. So again as I touch base on this it's about web servers and application servers which makes Java compatible for web applications. So we have Apache Tomcat which is pretty much widely used which was a web server earlier. Now, they have Apache Tom e or which is Tom double e which is nothing but application server version of it. So basically when it comes to web servers or application servers, what you do is you as a client could send a request to our web server and web server or the application server would just process this particular request and send the response the way the It's written. So basically it would serve the expected result out. So you have Enterprise applications. Again, this is Java Enterprise Edition, which makes it favorable for web applications. So all these specifications j2me. J2w. J2se, this are nothing but specifications exposed by Java. So if you as a developer wants to do something or if you want to write your own version of it you can do it. So where is Java used again scientific applications? So I as you could imagine in scientific applications, you need to have high level of accuracy and precision rather. They could be mathematical equations and mathematical computations which needs lot of CPU time because it's very CPU intensive right? When you do a very precise calculation with high level of high degree. It needs lot of CPU time, right? So that's where Java is good at. So basically this is about as a spoke about multi-threading utilizing all the course to the fullest suppose. You have four core processor using all these four cores is been done by Java Java has feature or through threads you could actually read through or actually utilize this for course to the fullest Big Data Technologies again, big data is nothing. But as I said, it's distributed you cannot have everything run on one machine, which was the case earlier. You would have one server put up and everything is done on that particular server. Now, it cannot be the case. That's where Big Data comes into picture wherein you have distributed architecture and you have this data being processed across Network rather than just on one machine and mind you as I said, this machines are commodity hardware and not server level Hardware or the Enterprise level Hardware which makes Cheaper Internet of Things So Internet of Things is coming up the booming thing wherein you could connect things together. Say, for example, you have cars, right? So you could connect cars together so you could have sensors in your car which could emit data and you could connect them together. So basically it's all connecting things together or say, for example, let me talk about internet itself. So earlier if you remember computers were not connected it were all pure right. It could just be used for your own purpose. Now internet has started wherein you have all these computers connected and if you are connected to the internet, you could go onto Google and search something or whatever you want to sort of So basically this is what internet of things is all about. So consider this instead of computer. It could be any other objects a car for example, as I said so consider car has sensor and it is emitting this sensor data every minute and we could utilize this sensor data and do something with it or one car can know where the other car is. So that's what internet of thing is about all about connecting things together. Let's start off with the setup setup for Java. So basically you could go to this particular site and just download the SDK based on this jdk, right? So basically based on whatever platform you are at. If you are using Windows, you have to select Windows if you are using something else if you have mac, you can select Mac. So this is pretty much similar to other softwares you get an exe file download it and you just have to run that exe file. So basically I can show you what gets downloaded. So I have downloaded version 12 for Java as you could see here and and since its Windows, it is mentioned as Windows. So this is nothing but an exe file that you get which you could run and you would have Java installed on your machine. So it's pretty simple. It's pretty much similar to other software's you have say for example, or I could just show you the location where it is installed. So if you get into the program files, you can see javabean installed here, right? And it says jdk 12. So once you install Java, once you download this particular stuff jdk and once you install this this executable you should be able to see this Java folder in your program files. So it shows here. It's for you can select whatever you want to see you have as you could see here. This line X there is Windows Mac OS and stuff like that. You have to select the platform you are on and should be good to go. This is done. You could see you get a exe which you have to run. So basically to run Java what you have to do is yeah. So you go to the system you have control panel system you go here and you have to click on Advanced system settings. Basically, what we are trying to do is we are going to set an environment variable right and what we are going to set is this path variable. So you have if you want to put it specific to a particular user you can put it here put it in the upper space or you want it across the system. You could basically put the path variable here in the system variables. So once you install it you have to make sure that you have this particular path being put in your path environment variable. So basically tells the OS that you have executables within this particular directory. So once that is done, once you have this properly setup, let me open a partial. So partial is nothing but it's pretty much simpler to command prompt but it's a Linux flavor of it. So basically you could run Linux commands as well. Okay, so I will I will once this is done. Give me a second. Okay. So with partial you can do LS which would give you a listing unlike in command prompt. You have to give dir. So it's basically good for programming. So once you have this properly set once you have this path properly set if you write Java here, if you write Java on your command prompt, you should be able to see this help coming up here. So if it's not properly set up, you won't see this it would give you unrecognized command. Yeah, open command prompt and type Java. So once the path is properly set you should be able to see this. So let's set up Eclipse as well. So it could be eclipse or IntelliJ whatever you are comfortable with so you could use either of them since IntelliJ has much more features. You could use IntelliJ as well. So you go to Eclipse download and whatever flavor you can take the latest one Whatever flavor you want to install if you if you want a simple one you can do it. If you're trying to do something on web. You can download that one as well. So basically for simple purpose for whatever we are going to do you can have normal ones. So let me quickly open up my so this is nothing but the IDE integrated development environment that I use with just IntelliJ all the IDS are pretty much similar. So IntelliJ similar to Eclipse, so it's coming up. So basically what you do is you have to select a workspace first workspace is nothing but all your program all the class files all the class and everything that you write would be put into this particular Works piece and you can create a new class and start off. So when we get to the hello world program, which is the first program that we are going to talk about it would give you a clear idea on what we are talking about. So let's talk about Java internals how it looks like and all the features that we spoke about. So basically so far what we have covered is more about Java is object oriented program or it uses object-oriented programming. Paradigm which is nothing but everything is thought of as a class with a particular State and behavior right is platform independent. That's why it's been widely used it secured as well. That's why it's been used in banking applications and stuff. It's good for distributed computing since its platform independent. You don't you just have to write it once and you can run it everywhere. So basically this platform independent aspect is what helps it to be widely used in Big Data applications. So let's talk about the internals. So what is jvm jvm is nothing. But again, it's a specification right? You could have your own jvm son by itself gives specification for a jvm. This is what the GBM should be all about so I could create my own jvm. But we usually we use the reference implementation of sun Microsystems Oracle now. Right, so jvm is a virtual machine that runs the bytecode. So basically there has to be some level of compilation done before give him can understand it. So that's where you have Java compiler. And so what this does is nothing but it takes your source code. It takes the class files as or it takes the class that you write as is so Java compiler would consume it and kind of compile it into a DOT class file so dot class file is nothing but compressed version of it and compiled version of it as well. And this dot class file is nothing but it's also known as bytecode and this is what a jvm could understand. So once you have this class file, it could be sent to the jvm and jvm could understand it and run the applications. So what makes Java platform independent is this Java compiler is platform. Pendant you don't have to take care about it. You just have to run the compiler. And whenever you want to run this particular byte code on any of the machines, you just have to have jvm for that particular machine. Right? So basically if you want to have online X, right if you want to run it on Windows, you would have jvm installed on Windows or you would download the jvm for Windows. And if you want to run it on Ubuntu or the Linux or Mac would just have to have the jvm downloaded for that particular platform and it should be able to sense this particular byte code. So basically this is what makes it platform-independent. Right? As I said, once you have this bytecode once you compile it this bytecode could be transported or ported into any of the machines in operating systems and you should be able to run it that is what it is all about. It's right ones and run anywhere. So as I earlier mentioned you could As get this class file into your pen drive and take it anywhere and you could just plug your pen drive and just run through that's how simple it is. So, this is Java runtime environment where in you have set of jvm plus you have libraries libraries, it does nothing but you know, although programs put together all the programs source code for Java put together. So our T dot jar is one of the libraries which would have most of the classes or you have you till classes maybe string class string is a class itself, which is exposed by Java. So this particular jar file or it's a Java archive jar is nothing but Java archive which is set of java classes or the class files rather which would have lot of class files within so in our T dot jar you would have something like string class and stuff like that a lot of other classes, which is been used by the sea. Some are which has been used by Java itself? So basically in JRE this is what you have jvm plus set of libraries plus other additional files. So as spoke jvm is nothing but specific to environment, but all these things like Artie dot jar and stuff like that would be independent GRE does not contain tools and utilities such as compilers or debuggers for developing applets and application. So GRE by itself the runtime environment, so it doesn't have compilers and stuff like that. So jdk is nothing but it specifically for development you could see here. It's JRE plus development tools you have compilers and stuff like that as well. So to run a class file, you just need the JRE but if you are a developer, you would need jdk so what we downloaded earlier if you remember that was jdk right jdk for Windows or jdk for liners. So basically if you see this one could see here as jdk. So essentially you need jdk only if you are a programmer if you just want to run the class file GRE would suffice so why is jdk GRE and jvm as we spoke about you could see jdk is a superset. It has everything right GDK would have your jvm. Plus it would have as we spoke here. It's JRE plus your development tools as well. As you could see here details it has everything here. It would be really confusing right now. If you directly get into what all this is all about, but basically you could imagine jdk is a superset and Jerry is nothing but it's your runtime environment which has jvm and some additional files or RT dot jar as we said which is nothing but set of files set of class files that is exposed by Java which could be used like string for example, right? Let's see how it works. So basically you have your source file. So this is what a developer would typically right would create a DOT Java file. So whatever you write you create a class. You just create a new class and write something to it. What you get is dot Java you get the extension dot Tower. So basically this is your source code, whatever you write you as a developer would write this class. Is would be sent for compilation or whenever you are good enough done with your coding you would compile it. And once the compilation is done once everything looks good enough. Once the compiler doesn't Mark anything and doesn't flag anything rather, which means everything is syntactically, right? You will get Java bytecode. Just nothing but dot class 5. Now. This dot class file could be moved across Network or you could as I said, you could just put it in your pen drive and can take it anywhere and you could run it on any of the environments. You just have to have jvm. So basically you could run this class file, which is compiled on Windows. You could run it on any of the environment any of the platform's. So this is something that we spoke about during runtime. There's a verification as well. So so when classloader would load this particular class file, it would ensure that it is up to the Mark or it's not manipulated sort of so if it all it sees something wrong, then it would flag it off as you know corrupted file or something. So this is nothing but Java class file libraries are T dot jar that we spoke about Java archive. So this is what is happening. When you run a particular class five, right? So you have this class loaded and then you have this compilers just-in-time compiler actually running it for you. So basically the part of jvm so jvm is remember jvm is nothing but it's a platform. It is specific to platform. So basically for Windows you would have a different jvm. And for line X you would have a different jvm. So yeah, you get this class you load this class using class loader and you run through the application or run through the class files. So typically this is how Java operates so just to give a just on this one. So you have a source code you have dot Java file written you compile it you get our class file and you can put this class file anywhere. You can run this class file anywhere on your network or wherever you want to you just have to take this class file and on the machine on which you run. What would happen is you load this class file first using class loader and with jvm jvm would have just-in-time compiler which would run a particular class for you. Right? So what we are trying to do here is you're running the source code that's written on any environment you are running it on any other environment. So basically you could write this on Windows. You could write source code on Windows, but you could run it on say for example line X. So that is what makes it platform independent. So here let's create one class and as we created I will More about it so that you could open up your eclipse and could create something like a new project so it could be a bit different for you the look and feel might not be exactly the same as mine, but you just have to create a new project select Java. So basically I could a project name. So whatever you want to so basic nomenclature is like it has to start with uppercase letter, which is camel casing right? So you should follow camel casing venue. That's one of the best practices it won't flag you as some error or something, but that's a normal industrial practice that whenever you create a Java project. It has to use camel casing created record, Java. So it's creating a project for me. And as you can see here, I have this particular project being created right now. What I do is I create Java class. So basically as we said everything could be seen as a class, right that's what object-oriented is all about. So basically what I would do is I would create a class here. So this is my source folder where enormous Source class would be there. So as you can see here new Java class so say I create calm dot Ed u-- Rica. So this is nothing but your name space or the package, right? So you could give whatever you want to basically this is to avoid collisions, right? If we don't have a name space there would be lot of collisions within the class. So there are a lot of people working on the same project right so I could create a class with name. Class A and the other person might read classy as well. So when this is club together into one particular application there would be Collision So to avoid this basically what you have is you have a namespace. So I would write as calm down dear a card dot Class A. The other person would write something else and that would avoid class name collisions Applause collisions. So this is compounded Eureka is my package or namespace and hello world is my Java class name. So as you could see here, there's a package calm down Ed Eureka, which is again a namespace and there's a class by name hello world that's been created. Right? And if you want to see you could actually go and so you can see a folder structure created here in the source. So this is your Source folder right within your project. There was a source folder where in we created the class. So if you go to the source folder you could see a packet structure or you could see a directory structure being created which starts with calm and within calm you would have at Eureka and here you can see Hello World dot Java. So remember we said that your source code would have all the Java files. So basically this is what I was referring to. This is a method that the default method that's been called. So when you run this particular class file jvm would actually look out for this particular method. So you need to have the same signature as has so you would have a main method wherein your program execution would start, right? So as then when you compile it and run the class file, so basically when you compile it you would get a class file, right and when you run this class file jvm would check out for this main or a method that has the same signature as this one. That's a main method and your program execution would start running from here. So basically it's a entry point for your execution, right? So this would be a simple program wherein we would just print hello world. So basically you have like system system is a class and this is how you print in Java. So I don't want to confuse right away by saying what is system worries out and println, but basically what you have is a system is a class as I said everything Could Be Imagined as a class. So in Java everything is a class. So basically you could just click here and you could see the source code of it, right? This is the source code and this is coming from our T dot jar remember in jvm. We spoke about in GRE. We had our DDOT jar. We had Jerry we had jvm plus plus class files. So all this has been written by Java by the Java community. So basically you can see here. This system itself is a class. So out is instance variable and println is nothing but a method within out so what this statement particular thing is going as nothing but writing it on to your console. So let's print hello world. So basically when you build a project it's compiling it as you could see here. It's saying it's building it. So once it has built it you could see a class file here. Right? So you could see here hello world dot class. This is because we built it when you build it. Your Java file would be compiled by your compiler and it would create a DOT class file. And remember as I said, this class file dot class file could be run on any machine. So this is Windows machine that have written this file Java file and compiled on now. This dot class file could run on Linux or any platform that you want to run it on. So, let me talk about this class. Right? So you have a public key word, which is nothing but access modifier which gives visibility. So basically what we are trying to say here is hello world is publicly could be publicly seen so it could be seen anywhere within the application. So basically for class level you have public which as the name suggests. As the name gives out it could be seen anywhere within your application that the visibility key access modifier. All right, so you have the keyword class here, which is for the class. You need to have it mentioned as class. If you write something else, then it would give you a compilation error. So it has to be exactly the same. All right, that's the syntax of it. Hello is nothing but the name of your class, then you have this public static void main, which is nothing but as I said, this is the entry point for your application or your class file. So when you run this particular class, it would start off from here. You have a static keyword static keyword is nothing but it's at the class level. So basically you need not create instance. We haven't reached that point yet. So basically hello is a class and you could create instance of hello, which is nothing but object right? So when you have a static keyword here You need not create object of hello to run it if it's not static, then you need to have object of hello created. So basically what I'm trying to say is see you have one more method here, which is test. Now this doesn't have a static keyword here. So basically what we can do is we can print So yeah, this is a non-static method right now. We cannot call it directly. If it's a non-static. You need to have a instance of Hello World created. So basically how you create instance is nothing but hello world. That's your hello world object. So when I say instance I'm talking about creating object, right and you could create new hello world. So object of hello world is created using new keyword right? When you do this you would get object of it or now. What I do is so basically what I was trying to say is you cannot call test as is if you do it you would get a compilation error saying that non static method test cannot be referenced from a static context, right? You cannot call it without having your object. So basically I can call it on Hello World object DOT test Now I can call it now. It doesn't give me compilation error. I'll create one more static method which would give you some idea. So I will rename this as non static test and this would be static test. Right and we are printing your static method and here we are printing non static method. So hello world dot nonstatictest. Now, whereas the static test did not be called using object so we could directly call static test. Sorry, I haven't written static here. So this is a static method. Okay, so now you could see here. It compiles fine. Right? So what I was trying to say is when you have a static method you do not have object to call it. Whereas non-static method you need to have object. That's what the static is all about. Then you have void is nothing but the return type it's not returning anything from here. So that's why it's void. You have main method. That's the key word that the entry point for your application. You have this arguments. You can see string array of strings which are arguments provided to a particular program. So you could pass on as many arguments as you want or if your program is say, for example, you want to pass your name as an argument you can do that. So this is arguments then we have main which represents the Above the program which I already mentioned then we have system dot out dot println is nothing but the print statement so as I mentioned system is nothing everything could be thought of as a class system is a class out is instance variable and println is a method within out. So basically you don't have to think much about it just to understand the structure of it just to understand how a particular class is been written. This is what we have. This is how we write a class right again, just to brief on this you have access modifier which denotes the visibility of a particular class. You have the class name you have the main method which is nothing but the entry point for your class you have a static method, which says whether you need an object to call a particular method or could be called directly from a class. You have a return type here. So this is how typically any method would be written and you can write whatever statements you want to within this particular method. This case we have printed out hello world. So basically you could follow this when you do it on Eclipse, so it might be a bit different based on the eclipse version that you would have but it should be pretty much similar. All right, so you create a new Java project. So I showed this already on IntelliJ, which is also widely used IDE. But yeah, you could use Eclipse as well. So basically you could see the project name being written as hello world, right and here it mentions the JRE to be used. So here you can see class class being created and let's see how we can run this. So we compiled it and we saw that dot class file was created. Now we can run this. So as I said main is the entry point so it would start running from here. So your program control would come here. And the first thing that it would see is you have printed hello world, so it should print this one then I would keep it simple. I don't want to let's see what's been printed here, right? So you could see here. Hello world being printed first, right? This is where the program execution started from. So it came to mean so hello world it printed out hello world. Then you give a call to this non static method. So it printed non-static method which is been printed in this particular method and then it gave a call to static method and you could see static method being printed here. So one thing to remember is the program execution starts from Maine and it just you know executes this main method. So whatever content you want to write you would basically write it in the main method so you could see here hello world being printed out. Let's see how easy it is to coat the same in the J shell. So J shell is nothing but shell prompt that was created in Java version 9 since nine you would have gesture. So since I have Java version 12, I should have J shell as well. So yeah, J shell is nothing but a prompt so it's nothing but instead of writing into integrated workspace. You could have J shell and you could pry out something here. It's not something for production use as such it's basically to test something right you as a developer could if you want to see what it does instead of writing everything into the main. So if you write a class you would have to write things into the main and then run it and stuff like that with J. Shell. It's just a kind of interpreter wherein we could write something some command and see what the output is. So basically you could say for example we printed hello world, right so system dot out Dot println. Hello world, right if you remember this is what we typed into our main method plate. So if you want to run this you have to have all this artifacts created as is right to have a class you need to have main method and then build the class and then run it basically initial you could run it just to see what's output. As I said, this is not application as such this is just for the developer to test what the output for a particular command would be and what a modifiers in Java. So one thing that we saw in the program was access modifier. We already saw about actually this one right public and these are public here as well. So these are nothing but modifiers right public as I said this public means the access modifier which shows that hello world could be accessed anywhere throughout your application. So here we can see as a board or the fries changes. Meaning of other phase in some so basically it just trying to say that one of the aspects are one thing that access modifier could be used is to control the visibility of a particular class or a method as well. We have access modifier for your methods as well. So this is just one of the things right we would see other modifiers as well modifies in general has some other things as well. But when it comes to access modifiers it basically controls the visibility of a class visibility of a class or a method or so. Yeah modifiers here as you could see there is access and on access modifiers, let's see access modifiers. So we use public already. So this one is nothing but a access modifier which is public which says that it could be used throughout the application so visible to the world as it says public is nothing but visible to the world. If we talked about in a logical order if we talk about the visibility so default is visible to the package. So default is nothing but within the package it would be visible. So basically you could default is without any keyword without any access multi-faith. That's a default scope So within the package it would be accessible only within the package. So you have like calm down Eureka. That's your package. Right? So this hello world would be accessible if it has a default scope. It would be accessible only within calm down Ed Eureka. If you try to access it from some other package you would get an error. So that's the default visibility:visible to the package private is nothing but it is visible to the class. It is only visible to the class. So this is the lowest visibility only visible to the class. If you try to access it from outside class even within the same package you would get an error because You won't be able to access it is accessible only within the class public is accessible to the world. It could be accessed from anywhere within your application or anywhere within your wherever your class file. So basically if you if you have a jar file, but what I'm trying to say is public is accessible anywhere right protected is again visible to the package and all the sub classes. So we will talk about sub classes. So subclasses is nothing but in C we have inheritance, right say for example integer integer is a class as I said in object-oriented Paradigm or in Java everything could be visualized as a class. So integer itself is a class, right? So there's a number there is a super class which is number which has all the common state and behavior that a particular number would have right so number is a super class and you have subclasses like Teacher float would be a subclass of number long would be a subclass of number. Basically. This is inheritance, right you are inheriting integer float long double and everything from number class. So number is a super class and all this integer float and everything is a subclass of number. So when it comes to protect it, it says that it is visible to the package and of the sub classes, so just to keep in mind as of now, you can think of access modifier as visibility of a particular component or could be visibility of a class or visibility of a method or instance variable as well. This is what drives the encapsulation factor of object-oriented Paradigm. So basically we control the access or all this components or we control the access of class variables methods and everything which makes it encapsulated cannot be breached. Sort of as you could see this is like I could make this one as default as well. All right, so this is default scope. It would still run because it's within the class. Right now suppose I make this one as private, right? Just to show you what this encapsulation is all about or what this access modifier is all about suppose. I make this one private right still this one runs because it within the class you are trying to access it within the class now. I create a new class say for example, we say axis modified test. So I create a main class here again main method. Now suppose if I try to run this, right? So basically I create the same stuff here. See I create a hello world object. Okay. Now this one is private right now. If I try to access it from here, what I was trying to say is if I SEC as you could see here it says that nonstatictest has a private axis to hello world. So you cannot use it from outside. That's what I was trying to say. So basically since it has got a private scope you cannot access it from other class. And if I remove this private now with gives it default scope and as we said default is nothing but it has got access within package you could see this error going off here now it is accessible, right? So that's what is it is all about when you have a private scope. It's within a class. There is default is within a package public is accessible anywhere and protected is visible to the package and just the subclasses. So let's talk about non access modifiers. This is not controlling the axis of class method or variable when it static you did not create object of a class. So basically for static test you could see that we didn't create object of a class. We didn't call static test on a particular object of class. It could be called directly. That's what static is all about the static modifier for calling methods and variables without an object to which it belongs as we saw we didn't create object of our fellow world we directly cause the static method final is nothing but you can't change it final as the name suggests. You can't change it once it is created. So finalizing the implementations of classes methods and so this is nothing but instance variable which we would be talking about the slides to come just to tell you this is an instance variable which we have assigned the value 10 now suppose within this particular method I try to change the value to 11. You would get an error saying that cannot assign a value to final variable. So final is like its final can't change it once you have created it. You can't change it. But if I remove this final you could see this error would go off. You don't see this error anymore. Whereas by putting final you would see this error. So that's what final is all about. So basically this is good enough for constants, right? So if you have constants within your class you would make it final so that no one can change it abstract is nothing but you could mention it as abstract when it doesn't have implementation of all the methods. So what I am trying to say is abstract modifier is again a non access modifier and what it tries to say is say, for example, you have a shape class cheap class is abstract class because shape doesn't say you want to calculate area of shapes. So basically shape class by itself wouldn't know what the area of the ship would be. Is a class where in the generic class it doesn't know what the implementation of area would be 4 Square. It would be Side Square for rectangle its length into breadth or Circle. It's pie R square. So basically shaped by itself wouldn't know what it's area would be but now shape is a super class and say you have subclasses of it like Square you would have Circle and so on. So now basically you want to ensure that when you create a subclass of the shape class you want to ensure that that particular class implements the area that's when you create it as abstract. So the shape method would have of the shape class would have area method as abstract which would be implemented by the subclasses which has to be ensured its kind of ensuring or if the subclasses don't actually implement it you would get a error. So basically Circle would have its own implementation of areas in pie R square square. Would have its own implementation saying Side Square. So basically what I'm trying to say is area is abstract method for shape class. And when you have abstract method the class itself is abstract. So you have like shape calm down Eddie record dot shape. I'm creating a class now. I'm creating a abstract method So when you say abstract, you don't have to provide implementation. It's just a chain break this thing you don't have implementation of it. You just have the signature of it. So basically as I said, when you have an abstract method the class itself should be abstract. So we'll have to make this abstract as well. So you created a shape class which would have a area and which would give you this thing. So basically we want to have subclass and want to show how the sub classes are created at this point. But basically this is what abstract is all about. You don't have the implementation of it, but you are ensuring that subclass is implemented. So here you can see Just a signature. You don't have implementation unlike this implementation is nothing but if you write something within this braces, this is an implementation for this particular method, whereas in shape class. You just provided the method signature, but we don't have limitation of it. So that's what abstract is all about synchronized and volatile is much about using threads synchronized is we are saying that only one thread could get a control at one point. So as we said threads are nothing but parallel execution you could have thread say for example, you could have read one calling a method. So we have as non static method test right say this is a method. So what we are trying to say here is if it's synchronized we can make this a synchronized private synchronized. So this is what id is all about. So when you have this integrated development environment, you don't have to type everything when you type S why you could see synchronized coming up here. Put selected. So when you put a synchronized here, what we are trying to say is only one thread could access it at a given point only one thread at one point. So if multiple threads are trying to access it one thread has to wait for it. So only one thread would get entry to this and the other thread should wait for it. So that's what synchronized is all about and volatile. It's basically for memory visibility or what we are trying to say is so basically every processor has got its own cache. So what we are trying to say is when you use a volatile access specifier don't store it in Cash Store it directly into the main memory so that all the threats would get the most recent value being assigned to a variable also volatile is not needed when you have using synchronized as such so it's mutually exclusive. So let's talk about variable. So variables are nothing but it's a holder, right? Holds value and variables are nothing but it's reference to that particular meal or it's a dress or something that is pointing to a memory location a memory location where the squirrel use are being stored and you could access it using this particular variable name or you could access the memory location where the value is stored using a variable name what I'm trying to say here is so this is a variable and you could access so this 10 is stored somewhere in the memory and you could access this part of memory location where this 10 is stored using this variable or you can manipulate it as well can change the vat. So basically there are three types of variables in Java this local instance class or static local is nothing but local to your method whenever you have a method or you kind of create a variable within a method that is nothing but local scope which is like it has the axis its visibility only within that. Particular method once control goes out of this method you can no longer access is particular variable that is local. So if I Define something here say, for example, I Define something here. So this is a local variable since its defined within a method. So once the control you would have this only within this particular method, once the control goes out of this method. This is no longer accessible. Basically, this is where garbage collection for Java is useful. Once you control goes out of this particular method garbage collector would kick in and were dean of this variable or clean of this particular memory location or would make it available for use. So that's the local scope. The next one is instance instance is nothing but something that is defined at the instance level. So this is instance variable. So since it's at the class level, right this is you could see it at the mid-level. This is at the class level. This is nothing but an instance variable now there is static variable as well. So this is how you define a static variable. So instance variable is nothing but it's per instance so you could go and change this instance variable to something else suppose. I assign a value for T here now. I could have one more object created suppose I call this object one and I have Hello World object. So I create one more object here. So what we are trying to do is we are trying to change the instance variable through objects. So basically this is what it is when you have an instance variable normal instance variable, which is non static you could access it through objects, right? So throughout object one you assign for object one you assign instance variable value to 44 object to rinse you change the instance variable value to 50. I won't say Changed it. But you assigned it. This is how you deal with instance variable. It's at the instance level. It's at the object level. Whereas for static. It's at the class level. It's one per class. It's not one per instance. It's one per class. So basically what you can do is you could do something of this sort where in its at the class level. It's not at the object level. You are assigning value hundred to a static variable. So as you could see here, it's not a particular instance that you're operating on its the class directly just to give you a just we have local variable which is within a particular method and scope remains within a method. Once the program control moves out of this particular method Java would or jvm would come in and kick in garbage collector to clean this off Sony accessible within this menu you have instance variable, which is at the class level, but it's non-static and which means that it has copy. Per object when you have multiple objects, you could change the values the way you want per object static is nothing but 1 per class and as you could see here, we change the value of the static variable 202 class. So that's about variables. We have an instance. So instance variables are declared in a class when the space is allocated. I will just read through this one. So when a space is allocated for an object in the Heap slot for each instance variable is values created. We had a your instance variable and whenever you create but basically an instance of a class is created in a part of a memory, which is called Heap. So whenever hello world object is created a slot for this instance variable would be treated as well instance variables are created when an object is created with the use of keyword new and destroyed when the object is destroyed. So unlike local variables, which is within the method scope. Variable is within the class scope. So basically whenever you create an instance of a particular class, your memory would be allocated for that particular instance variable. And whenever it's done whenever it's destroyed by the garbage collector, it would go off access modifiers can be given two instance variables. You could have like private public protected default all the access modifiers. We assign to students variable. So basically you could have it as private private is just within this class. You cannot access it outside this class you could have public as well, which is like would be accessed anywhere within this application you could have protected which is like within the package or the subclass and you can have the default one which is nothing but package axis, which would be accessible just within this package that is calm dotted Eureka. So instance variable have default values for numbers the default value zero for Boolean it is false for all. Big references it is null so values can be assigned during the Declaration or within the Constructor you could assign values directly while declaring it something like this instead of 0 is the default one for integer as they have mentioned. But yeah, you could assign if you put it as 10 here it would be taken as a default value zero zero Constructor is nothing but a method which constricts an object of a class values can be assigned during the Declaration or within the Constructor instance variables can be accessed directly by calling the variable name inside the class. However, with static methods when instance variables are given access ability. They should be using fully qualified name. So what we are trying to say here is this is a static method from which we are trying to access instance variable in this particular static method you need to have object reference. This is Object that we created so object reference dot instance variable you need to have as we have mentioned here. So here as we can see object reference to a variable name. You need to have fully qualified name. When you try to access it within the static method. You need to have fully qualified name. Whereas here within a method which is non static. This is non-static here. I can access instance variable without object reference. So here as we can see it could be accessed without but if I do it here it would throw me an error. It's not accessible here at all. Non-static Fields instance variable cannot be referenced from static context instance variables are not accessible directly here. It has to have fully qualified this thing, which is object reference dot instance variable. Whereas when it's called within non static method you could use the direct so static as we spoke about it's one per class, so it's declared. Using static keyword. So static variables are stored in static memory. It is rare to use static variables other than declared final and used as either public or private constants as we said, it's mostly used for constants and static variables are created when program starts and destroyed when the program stops. So one thing to remember is it's one per class. It's not one per object instance is one per object. We have a copy of that particular instance variable one per object case of instance, whereas case of static it is one per class. So the scope remains are the life cycle remains right when the class is loaded in the program is stopped in the class is unloaded static variables are declared public since they must be available for users of the class. It's not mandatory though, but usually if it's a constant it is declared as public static variables can be accessed by A calling with the class name. So we saw here last name dot static variable. So how do we decide what amount of memory is to be allocated? So these are the data types that we have. So each variable in Java has a specific type which determines the size of memory the range of values that can be stored and the set of operations that can be applied to the variable data types can be categorized into two major types primitive and non primitive. So basically primitive is not object primitive is supported by language itself, which is kind of it has got 8 primitive or its pre defined by the language and named as keywords and it has 8 primitive data types that is byte short integer. Then you have long float double character and Boolean. This is pretty much similar to other programming languages that you have by it consumes one one bite. These are 8 primitive data type set of predefined non-primitive. It's nothing but string string is object itself. So that's something that is non pyramid or if we Define your own class C student for that matter here, right? We have defined student class that's non primitive. So this student class has non primitive you have strings for storing string, which is again kind of non primitive. We have arrays or basically it's all as reference variables since referencing a particular memory location through variable name. This is where we have table showing white consumes one bite and it's range is from - 128127 short is like two bites and you could imagine that it would be from - 32768232767. So it's pretty much similar to other programming languages that you have like in C as well we have similar to this thing. One thing is characteristics to bite in C takes one bite. I believe though. It doesn't use all the two bites every time it. On encoding type. So Boolean is one which is true of all since it has to store 1 or 0. So it's pretty much similar. So just to talk on the bytes required by test 1 byte short is 2 bytes integer is 4 bytes long is 8 bytes float is nothing but it has decimal values stored signed decimal values. So it again concerns for bites double is sign again float values or sign decimal values which consumes 8 bytes character is 2 bytes and bullion is one bit. So basically so decide whether to use float or double depends on the nature of the application. So if you want to have more Precision or if you want to have more range you could go with double so non primitive or reference data type is a variable that holds a particular object or holds bit that represents a way to access an object the pointer to a memory location baisakhi. So as we spoke Java doesn't expose the pointer directly. It doesn't give you directly pointed to the memory location, but it gives you the reference variable. So you cannot manipulate memory location directly. You cannot add some values to the memory location through pointers or something but through reference variable you can access it and assign someone so yeah, it does not hold the object itself, but it holds a reference address to the object reference type does not have size or bit range. So here we can see string Str is equal to Ed Eureka. So the one shown in red is actually the memory we're dead Eureka is stored. You have a reference and Str is the reference to it. So here we can see variables and data types. So we have a main method again and we have bite. We declare a bite here by D is equal to 10 short s is equal to 20, so, I think it's pretty straightforward. You kind of have this data types created you just have to assign values to it. These are all Primitives as you could see till here. It's primitive so you could see that values are being assigned and it's been printed out here. So I think it's pretty straightforward. You can assign a value to a variable n just print. So again, we use system dot out dot println for printing it you could try it out on your own. You could try it out this data type program. You could just assign something and just try to print it out. We are talking about data type conversions. So we have implicit and explicit conversion in some case programmers don't have to actually write explicit conversions from one data type to other but in many cases programmers need so the arrow in the diagram shows the possible implicit type casting that a permissible bit primitive data types. It's just with primitive data types right as the diagrams. Those int can be converted implicitly to Long float double since int X likes less space. It could be applied to any of the numbers for vice versa. They have to be converted explicitly. Whereas if you want to convert long to integer, you have to mention it explicitly. So basically we are talking about when you're trying to store integer into long integer takes less space and long takes more space. So it should can be easily accommodated since long takes more space. If it is more than the range of the integer. It wouldn't know how to assign it to an integer. So that's why it has to be explicitly convert implicit conversions. We can on the J shell you could type this. So here what we are trying is we have a character C is equal to a and you could see see is assigned a now integer K is equal to C. Which could be done you could assign character to an integer. So basically it's a ASCII code for it. So 97 is the ASCII code for see which would be assigned to K. So now when you assign see to float, which works as well, so you get ninety seven point zero you could assign character to long as well, which is in bytes integer, you could assign double as well, which is 8 bytes float and you could see but it cannot be done the other way around as we spoke. So you cannot have integer or you cannot have double assigned to character. So it would give you incompatible our possible lossy conversion from double to character. It has to be explicitly done. If you want to do that need of type conversions. So here we have integer a full 200 initiated a variable with type Teacher then you have a string B, which is assigned value. Hello. So basically here you can see string being used which is a reference variable and you have string s is equal to a plus b as equal to a plus b then it adds up like hundred plus since hello is a string it would concatenated so you could see hundred and hello being concatenated and you could see hundred. Hello the data type of both the variables are different but to perform any operation we need both the variables to be of same type here integer value is converted into string and gets concatenated with other string. So basically had we been an integer you would have got edition of it say for example integer B is equal to 200 and if you hundred plus 200 you would get 300 but since it's a string in this case hundred is converted into string and it is concatenated. Hello explicit type conversions. We saw the previous case where an double was being assigned to character which prompted us with lossy conversion. So this is similar to that. So basically here what we are trying to do is we are trying to assign double to integer. So you have double D is equal to 45 B, which is 45 right again double is 8 bytes decimal signed decimal number so you assign 45 to it. And now we are trying to assign this double value to integer. So it's possible lossy conversion, but you have a provision to type Custer. So basically what we're trying to do here is you're trying to assign again double to integer which is possible if you type casted so when I say typecasting it's nothing but opening parenthesis, then the destination data type then your data. To a table. So basically to the right side you could see that through explicit type casting we can assign double to integer. So costing may lose information. For example, floating Point values are truncated when they are cast two integers example the value of D. That is 45.5 when converted to integer gives 45 so we could see here the bottom like the double we assigned the value of 45.5 to double but when we convert it into integer, we got 45.5 Force truncated since double since integer since the destination data type that's integer dozens to decimal values. Now, this is like type conversion methods which is there any wrapper classes? What we are trying to do here is we are trying to convert 23, which is string into integer. So you have a string. As is equal to 23 you assign the value 23 so mind you this is this is string right now. We have integer dot parse int and we pass the string which would be converted into integer. So this integer class that you see here right here is nothing but butter wrapper class you have string into an integer, which is nothing but integer dot value of string which converts it into digital data type itself. So the you could see the destination is is integer. Now integer to string you have integer. We have a tostring method which with converts integer into string. So basically you have integer I which is been assigned 23. Now you have integer dot tostring I which would convert this integer into string. We have one more method which is string dot value of which would also convert. Integer into string. Let's talk about operators operators are nothing but it operate on this data types. So you have unary which is kind of pretty much similar to what you have C C++ you have post fix and you have prefix post fixes. I plus plus or expression plus plus and the operator is after the variable which means that it would be assigned value and then it would be added prefix is before the operator which would be added first and then assign or the operation would be done first and then assign that's prefix arithmetic is pretty much similar like multiplicative you have like multiplication division and mod you have additive which is plus and minus you have shifting operation, which is bits shifting to the left and bit shifting to the right you have relational operators less than greater than less than equal to greater than equal to. Instance of Quality quality of two data types or two variables which check whether they are equal and not equal. We have a bitwise and bitwise xor bit wise inclusive or which is happening at the bit level. We have logical and logical or so. Basically, this is for conditions, right? If you want to have like two conditions, like if int I is greater than 0 and int J is greater than zero sort of you add or you have logical anding between two conditions logical conditions or illogical or pretty much similar to other programming languages. Like it's or between two conditions. We say that either this or that we have a ternary operator, which says that if the condition matches we would have a condition followed by a question mark followed by colon, and we would have some value Followed by colon followed by some other value. So what we are trying to say here is if the condition is true assign value 1 if the condition is false then assign value to so instead of having it written in if else you try to put it within turn your printer. So basically this is when you have simple assignment operator, if you have a logic if you have some particular logic been written it would be a better practice to have if else so that it's readable right because ternary operator it would be very difficult to actually through we have assignment operator which is equal to which is plus equal to is nothing but adds the value on the right hand side to the left hand side and assigns it to the left hand side table - equal to does the same thing. It kind of subtracts value to the the left hand side from the value to the right hand side and assigns it to the left hand side. So I believe this is pretty much similar to other programming. Languages there's nothing different in this we might have used it somewhere or the else should be pretty much simpler for you guys. So let's see unary operator example when X is equal to 10, so you could see X been assigned value 10, you have X plus plus as we said it assigns first and then increments it so you could see value 10 here again. So now if you after this if you print the value of x, you should see the incremented value. That's 11. So that's post-increment. So, let's see pre-decrement. So you have a been assigned the value of 10. All right. Now, you do - - A which is pre-decrement you would see the value 9 directly. And now if you print the value of a it would be nine again. So basically this is like decrement and then assign this is like a sign and then operate this is like operate and then assign Let's see the negation operation like a has a value of true now, we negate it and assign it to the variable D and you could see that it's changed to false. Now. Let's see the arithmetic operator. You have B which has value of 20. We have D which has value of 30. So when you add it gives you value of 50 when you multiply it gives you the value of 613 220 which is 600 when you divide it 30 by 20 you get value 1 and when you have mod, which is like remainder, which gives you value 30 by 20, which is equal to 10 shift operators are so it shifts to the left so shift left shift, right? So basically you have integer value of 20 and if you convert this into binary if you convert the 22 binary which comes out five digits, right? So when you convert this binary and when you shift, To the left you would get the value of 80. So you have value 20, which is nothing but if you convert this 20 into binary, which would give you one zero one zero zero right. Now, what we're doing here is kind of Shifting it to the left by 2. This is what you do and this is what it shows up as value of DT. So this is nothing but 64 plus 16. So that's what this left shift does. Basically it shifting to the left by 2. Again, you could have shifting to the right by 2 by 3, which would give the value of to just shifting to the right by 3 would be something like this. Right? So you're basically it shifts it and you could see that. Yeah, basically it would end up to 2. So now we have like relational operators, which is pretty much simple like a less than b. It gives false a greater than b equals equals P. Since you have a is equal to B. In this case. We have a equal to B. That's why we have a less than b as false and a greater than b as false. But whereas a equal to equal to B is equal to 2, we have arithmetic operators pretty much similar. Basically you have ad you have multiplication you have division you have mod. So here we have a is equal to 20. So what we are trying to do is assignment so a is equal to 20 now B is equal to 40 a plus equal to B, which is nothing but as I said, your left hand side would be added up to the right hand side and would be assigned to the left hand side, which is nothing but 20 plus 40 would be assigned to a so when you print a it would print 60 ternary operator, which is nothing but if a is less than b here we can see that if a is less than b then the value of Should be assigned to tr or the value 200 in this case. The value 200 is been assigned is greater than b logical operators is nothing but anding and o-ring of conditions. Yeah, here we are saying that a is less than B and D is less than b then return false and it's like kind of ending logical conditions. Now, let's talk about the control statement in Java. Now again, this one is pretty much similar to other programming languages nothing different nothing different in Java. So you have control statements you have I treat if statements you have jump statements. So one is selection or decision making statements, which is like if else if else ladder you have if if this particular condition satisfies do some things do some execute group of statements and if it doesn't then execute other group of statements that is about if else Which is nothing but based on the value of a variable like you to execute different step of statements like say for example, you have you write a switch on Integer value integer variable X. Now when X is 1 you do something or if x is 0 you do something or you can have a default statement as well when X is either 0 or 1 do something else that supports which I tradition is you repeat the same set of statements again, and again till the condition till a particular condition is met that's a titration. So you have four Loops, which is like after every iteration the value of variable or the iterating variables would be changed and would be checked against a condition and if it meets it would come out or if it made it would execute it again, and if it doesn't mean then it would come out. So yeah, this is pretty much similar to other. Other programming languages. So for for INT I is equal to Z 0 is less than 10. I plus plus and you write something within it. So this Loop would go on for 10 times from 029. It would break it would come out when eyes greater than 9 which is 10 when it goes to 10. It would come out while is again pretty much similar to that. You have do while construct which is guaranteed to be executed once because the condition is checked after the execution is done once so basically no matter what the condition is. It has to be executed once for sure. That's when if that's the behavior you want to put into your program you would use to Y is equal to once for sure jump statements you have like break which come out of for Loop Komodo for Loop or any attractive statements you have continued which would again continue and return is again coming out. Of a method or are mostly from the methods you written something so the control leaves the method now just to give you what if Wells is if if the condition is true, then then execute the conditional code. If the condition is false come out of the execution or come out of the conditional code. Skip the conditional code. That's what if else is so here you have int I is equal to 10 and int b equal to 20 if I is less than b so it's pretty much similar to the ternary operator that we had so you could see here TR is equal to a plus b so basically the value if a is less than b which is in this case a is equal to 10 and B is equal to 20 in that case. You would have PR as 30 since it is true. So basically it checks the condition and if the condition is true it executes the code with now let's talk about If else if it if else construct is nothing but you have a is a set of statements to be executed when the condition is in satisfy succeed. So in this case if a is less than b TR is equal to a plus b else TR is equal to B minus a so in this case it was less than a is less than b so you got the value of 30 whereas if a is greater than b we have again changed it. So if a is greater than b then TR is equal to a plus b else TR is equal to B minus a so in this case a is less than b so which means CR should be B minus a which goes into the else condition statement and here you have 20 be as 20 and a as 10 which is 20 minus 10. So you should have PR as 10. So here it's pretty much same. It does the same thing nested if-else now, we are talking about the switch statement. So you have switch expression and you would have case written against it whatever case you want to execute. So basically you would have for Value 1. So yeah, what we are trying to say here is we have a switch expression and we have a value for Value 1 as its value then execute this piece of code and then break out and if it has value to then execute this piece of code and then break it doesn't match with value 1 and value to then executes the default cases. So one thing to note here is it's mutually exclusive only one of it would be executed out of the cases. Make sure you break out of all the the conditions so to the right hand side you could see integer CH has a value of 40 now. We have a switch for 40 now. Is when the value of CH is 20 it would print case 20 executor when its value is 30 then we would have case 30 executed when its value is 40 then we would have case 40 executed and then break out and if it's neither 20 30 or 40 we would have a default case is executed with says that 20 30 40 not executed. So in this case since it has a value of 40 you would see that case 40 executed as output I'd frisson is nothing but it is basically I treating code if a condition is met the the code would be executed until the condition is true. The code would be executed and once once it is false, it would come out of the loop. So basically it's a looping statement. So after every Loop the condition would be checked and if the condition is true it would loop again. And if not, then it would come out. There are three types of for Loop in Java simple for Loop similar. See like for INT I is equal to 0 I is less than 10. I plus plus would be a simple for Loop for each or an enhanced for Loop and labeled for Loop for each is basically I treating on array list suppose you have some collection or suppose you have a re right? You don't have to manipulate the indexes since the typical scenario with arraylist is I treating through all the elements within the list. So we have an enhanced for Loop wherein we don't have to actually deal with indexes. Java has come up with a enhanced for Loop where and what each iteration it would assign the value of each element within the array to a variable which could be used within the loop. So we don't have to deal with indexes like we don't have to Loop through till the sizes met in the loop through in the size of an array is Matt, basically it Done by Java itself. We have an example which would clarify it. So simple for Loop is as I mentioned you have for INT I is equal to 10 is greater than 1 I minus minus so it would print from 10 to 2. That's a simple for Loop. Now. What's the Syntax for it is for then open up round brackets. Then you have initialization. Then you have a condition and you have increment or decrement whatever you want to do or you could even add up like I plus equal to 2 even that is good enough. It's like for each even number not even I would say it's like incrementing by 2. Now. This is what I was talking about. So this is for each Loop or enhanced for loop. We're in a typical scenario with array. You kind of eye to it through each element within the array and then do something within the loop, right? So this is what Java has made it easier for us. So basically you don't have to deal with indexes here if we wouldn't have had for each Loop. What you would do is you would tell the size of the array is Matthew would I trade through and read from each indexes right? But in this case as you could see there's an array and for each Loop the value within the array would be assigned to this variable and you could use this variable within makes it pretty much simpler for us. And as I said, this is typical thing that we do with arrays now labeled for loop it's not recommended to use this often but still we have this construct here. So basically it's like go to we can have a label of each for Loop. It is useful we have nested for Loop so that we can break or continue a specific for Loop normally break and continue keywords continues the innermost Loop innermost for the loop only to give Behind why I mentioned that this should be used often is because it becomes very difficult to debug right? If you dry run it if you use this labels, it becomes very difficult to actually understand what's happening within so so we should avoid it and all this could be done by writing a proper construct. Sorry using simple for loop as well. So we should avoid it somehow so basically as per my experience is not a good practice to use them. So type of while loop we have SIMPLE while loop we have do-while Loop. All right. So simple wire Loop is first the condition is checked if it meets then the looping statements are executed whereas do-while Loop is kind of the statement is executed once for sure and then the condition is checked if it is met then it is looped again. If not, then comes out. So this is a simple while loop so you have conditioned as you could see here while a is greater than 1 you print the value of a and you increase decremented Within Here it's a do while loop so no matter what you would have this to printer and it would be incremented. So it's 2 to 9. So no matter what some value would be printed for sure when you use do I now we have jump statements, which is breaking slyke coming out of a loop. So as we mentioned it's the innermost Loop that it comes out of so that's what Brave does if a particular thing is met or you could write a condition for a particular Loop to be broken rather than continuing it. So basically you could have like this would be more or less like you could have infinite Loop say for example running through and if a particular condition is met you could break out of it a typical scenario where it would be used. So here you could see that you have a loop from 10, which I traits from where I is equal to 10 and where I is greater than V i- - which we are decrementing each Loop. Whereas you're saying that if I is equal to equal to 7 we should break out. So here you can see though eyes greater than 5 you can see the loop has broken out after 8:00 since the value has reached seven. It's not printing the other indexes because it broke out of the loop. So basically this is like if a particular condition is met and you don't want the loop to go ahead you can break out of the loop continue is similar when you write continue, it goes to start of the loop again, it starts the loop again and it skips the messages or it skips the code that you have after continue. So in this case you could see that we have I equal to in case when I is equal to equal to 5 We are continuing the loop which means the print statement for I when I is equal to Phi wouldn't get executed since you're continuing it. So basically as you could see the News being printed here. You can see the 01234 and there's no 5 here then we have 6789. So basically what we are saying here is when I is equal to 5 don't execute the statement within the loop. Just continue. Just keep it. Okay. So what a methods in Java So method is if you would have written function or if you would have used any programming languages if you want to perform some operation if you want to do something or if you want to do something on some particular data, you would write a method. So basically in Java methods are defines the behavior of a class. So remember I told you a class is all about State and behavior. So methods are nothing but it defines the behavior of a class. So what are methods or method has a group of statements? Of course, as I said, since it defines the behavior of a class you need to have some operations done, right? So you define the operations through group of statements. It is much more used to have reusability of a block of code that minimize redundancy. So imagine if you didn't have methods then you have written the same piece of code again and again, Say for example, you have a method which adds to number right? And if we write the piece of code to add two numbers directly into the main method if you want to write it again, or if you want to again add two numbers, you will have to write the same piece of code again in the main method. Whereas if you have a method what you would do is you would refactor and take this add method or functionality which adds two numbers into a method and this method could be invoked from anywhere within the application which is nothing but re usability right rather than writing the same piece of code. Now, what you are doing is you are defining this add method into some other method which could be called anywhere within the code. So that's about redundancy that minimizes redundancy and increases the reusability of a code a class can have multiple methods as you could imagine. You could have multiple behaviors introduced into a class which means that you would potentially have multiple methods within a class. A method returns a null or a value using the written statement. So basically the intent of the method is to perform some operation, right? So what method would take is it would take parameters and do some operations on these parameters and it may or may not return something back to the calling program. So if you don't want written anything you have to return null or if you want to return some value you could have say for example, you want to return string you would return a string of a method you could have void as well, which means that the method is not returning anything back to the calling program. It is doing something within itself and just the control would be back to the calling program, but it won't return anything out of the method that's about method. So let's talk about so what the syntax of method So the first one that you see so this is a method which is public int at Eureka integer a GB and it is just concatenating the two strings or two numbers that we have sent a cross. So basically let's an itemized it so what is public so public is nothing but again access modifier so public means this particular method could be accessed from anywhere within the application. So that's what public means similarly you could have private. You could have default scope or you could have protected scope. So public is accessible anywhere within the program private is within the class default is within the package and the protected is within the subclass and the package. Okay. What is this int it is nothing but the return type so this particular method is going to take two. Arguments and do something and written integer, right name of the method is you can see ID Rekha. That's the name of the method. Okay. So what do you see within the parentheses after the method name is nothing but the arguments that this method takes so what this particular method is doing is it is taking two arguments which it is acting upon right? So it takes integer a and integer B, that's the parameter list. So whenever you want to invoke this particular method you have to pass arguments in this order. Now, what do you see within this curly braces is nothing but the behavior or this is how you introduce a behavior to the class or this is how you add functionality to a method. So what you are doing here is kind of adding these two numbers. So what is the written statement? What does it do? So written statement is nothing but you do something you take the arguments whenever controlled comes into a particular method. It does something and you return it back to the calling program. So the written statement is a control flow statement that terminates the execution of method and written control to its caller. So when return type of any method is void, then the method does not return anything if it is void, you won't return anything out. But if it is written in string or something you would return string or null if you land not to return anything, it could be null as well. So here we can see a method by the name work which is returning void. So you can see that it is not taking any arguments as such or parameters, but it is just printing out saying that I do recall welcomes you in the second case you can see it is written integer. So it's taking int A and B. Okay, and then it is printing out and it's returning integer as well. So let's write a program sample program to add two numbers and we would be writing all this logic within a method. So let's start off by defining a class. All right. So we define a class say calm dot edu, Rica Dot and a typical name for all arithmetic operation glass with all arithmetic operation would be calculator, right? So I would write it as calculator. For example. Alright, so here you can see the naming convention again. There's a package which is calm down at Eureka and you have a class has calculator and it follows camel casing so it starts with upper case followed by lower case. So you can see the class is being created here. Okay. Now what we are trying to do is you are going to have a method which takes to number. Okay. So say I Define let's keep it public. All right. So this is access modifier. We want to keep it public. So you want to access this particular method from anywhere within the application. So I'm keeping this public. So typically addition would return results, right? You would add two numbers and return results of two numbers. So that's your written type which is integer. So you could either write the return type as primitive or you could write it as a wrapper class. So basically wrapper class is nothing but integer has its own everything in Java could has to be realized in terms of classes. So integer has its own class int is a primitive data type and integer that you see here. Is a class corresponding int so let's put the return type as integer and add is a method name. Okay. Now this takes two arguments integer arguments, which is arg1 and let's put the second one as arg2. All right, so we start and ended by curly brace. Okay. Now we have to write logic within here. So what you see here, it's throwing an error saying that you are not returning integer out. There is a missing written statement because in the signature this is known as method signature this particular thing that we have defined here is Method signature. So in the method signature you have mentioned that this particular add method is intended to return integer out of the body, but still you haven't written integer. So basically to get rid of this I could put written null which means it's doing nothing now you can see that Got rid of the error. So let's do one thing just to make it more verbose. I will write integer result is equal to ARG 1 plus ARG 2. So this is a method body that you are defining here. So you are adding a behavior, right? You're giving Behavior to the calculator class. So by defining add method this certain behavior that you are introducing now, you could have a multiplier method as well which would take two numbers and would multiply it which is again giving some sort of behavior to calculator. So that's the reason we say that methods add Behavior to the plus. Okay. So here it is taken two arguments arg1 arg2 adding it and we will return the result from here. All right. So this is a method that you have defined. But so far we are not invoking this method right? We are not calling this method you want to call and check whether it's running as expected. So that's where we would have main method right? When you type mean it should give you suggestions saying that are you trying to write main method? So if once you click on it it would this is done by IDE by the IntelliJ similarly in Eclipse. You would get an option, you know, it would give you suggestions saying that we want to introduce main method. All right, so we have a main method here. So again, it's public static void Main and it's taking arguments here. All right. So remember I said static and non-static Method you can see here add is non static method when it's a non static method you have to create instance of this class to invoke it. So basically first thing that I do is I create instance of Later, so how do you create instance of calculator? It's with new keyword. All right, you create new and it would create an instance of calculator. Now I give a call to add method and suppose I want to add like 10 and 30. Okay. So these are the arguments and it has to be in order in this case since both are integer. It doesn't matter but had it been some other data type. You have to ensure that say for example, I write string here what this would return is typically a result right addition of two numbers. Now, let's print it out system dot out dot println. This is for printing result of addition is flits print out the result that we get here. All right, and let's end it by semicolon. So basically you have a package defined here within the package you have calculator and actually it's my bad. I should have defined it right here. So it gives my it gives the right package name here. So earlier I had defined calculator with income dot Ed u-- Rica again. I defined a package computed Eureka which is not required. So yeah, you can see here packages calm down said Eureka which is nothing but the namespace we have public class calculator. So public is nothing but the access specifier for this class plus is the keyword used for defining class and calculator is the name of your class. Also one thing to note is the name of the Java file should be same as the name of the class. So that is something that IDE or IntelliJ would do it for you. You just have to create class and it would create class. So basically if you go to the source folder you would have something like calculator dot Java right? Then you have public method which is again, here's the method that we have defined public is the access modifier for this method integer is the return type add is the name of the method. It's taken two arguments arg1 arg2 within the body you are adding two numbers and you are returning result which is integer which aligns to the signature that you have put here. All right in the main method just to check whether this add method is functioning properly. What you do is you create the instance of calculator. You add two numbers you pass two numbers to it then and 30 and we are going to print the results and see if it returns as expected. So here basically it should print the result as 40 since adding 10 and 30. So remember while it builds it it would compile into a class file. Okay, the dot Java file would be compiled if it's properly written if it's in tactically, correct, it would read dot class file. All right, let's wait for it to run. Okay, so it's prompting me errors that we have an other methods. So let me do one thing. Let me delete other classes that we defined yesterday. So I get go to the source folder Comdata. Directa. I So I am just deleting this classes that we defend yesterday. So that we don't spend time in actually correcting it, right? So put it into a backup folder. All right, so Okay, so we have only this calculator class now I run this. So yeah, you can see here. It has been tested result of addition is 40. So basically what it has done is adding these two numbers 10 and 30. All right, so that's what we have here. So we are adding two numbers. So let's talk about the sequence of how all this is being carried out by Java right when you run a particular program how things work out when you run a class. The first thing that's been called is the main method. Okay jvm is nothing but Java virtual machine which runs the program for you which is part of JRE Java runtime environment. When you run a particular class, it would search for a main method and if it doesn't have a main method then it would give you an error saying that a class can't be run. So it's pretty much similar to executable file, right? So if you're trying to run a class it has to have a main method or you won't be able to run the class directly. So that's where the execution starts from. That's the entry point for your program. Okay. So once it encounters Main and everything is good your jvm would start executing the statement. That are there within your main method. Okay. So in the edition case that we saw within the main method we invoked we created the instance of calculator and we invoked add method right? So when we ran that particular class you could see that the addition was done. So basically what's happening behind the scenes is, you know jvm would execute the sequence of statements that you have with a name. So again coming back to the example add example So within the main you invoke the add method right when you invoke add method the control would go to the add numbers method and it would again execute whatever functionality you have put within that particular method this case it was addition of two numbers. So it would execute once the execution is done. It would return whatever is been written out. So in this case, I was was addition of two numbers, so it would return addition of two numbers back to the calling. Program so you're calling method was the main method wherein you called this add numbers from? Okay, so it would come back to the main method and that's how it prints it out. So following the invocation of add numbers you could see that we have printed out the visual that comes out of this add numbers and that's how it gets printed onto your console so that the sequence of execution that happens behind the scenes. Now what are the ways in which you could call a method? There's call-by-value call by value is nothing but instead of passing the memory location, it passes the value of a particular variable. Okay. So this is similar to call-by-value and call-by-name reference that we have in see okay, instead of passing the memory reference or instead of passing the reference. It's just a value that's been passed. So if you change something within the method or if we change the value that's been passed within the method only the local copy would change whereas the main copy would remain as is but basically call by value is just passing the value but not the actual reference. All right, so to understand call-by-value you could so this would give you some idea. So say for example, I have integer ARG 1 which is equal to 10 integer ARG 2 which is equal to 30. Okay. Now I pass ARG 1 comma arg2. So what's happening here is it's passed by value. So suppose you change. What I'm trying to say is here if you change arg1 to something else 300. Okay. So what we are trying to do here is we are trying to pass this to arguments arg1 arg2 to add method and within the add method we are changing this arg1 200. Basically we would check whether this hundred is been reflected in arg1 here. Okay. Arg1 here would change 200 as well. Let's see what happens here. Okay, so I print it. Okay before passing it by value. So I print arg1 here. Okay, and after I give a call I would again printed printing arg1 after busting it a value to a method add Method All right, so let's run this so basically since its passed by value arg1 would remain as 10. Okay, so that's what pass by value is all over. So here you can see arg1 before passing was 10 and arg1 after passing was again 10. Alright, so the change that you made here doesn't reflect here. So that's pass by value. All right. So this one more concept of method overloading with in Java. You could have same methods with different number of parameters same method when I say same method it has The same method name which would take variable number of parameters. Okay, the overloading happens at the compile time itself. So during compile-time jvm understands to which method you are actually giving a call based on the actual parameters you pass on so just to give you a fair idea about this I Define one more method. C ad which takes say integer arg1, let's keep this adders. So I defend three parameters here. So instead of two I Define three parameters here. This is nothing but method overloading. All right. So here I Define ARG 1 plus ARG 2 plus arg3. All right, so we sum it up here and we return it back to the calling program. So one thing to note here is it's not giving you compile time error, right? So you can see that it has accepted this add method as well. So you can see here. The signature is pretty much same only thing is we have one more extra parameter, which is a RG3. So it is treating this true methods as a different method. That's what method overloading is all about suppose I Define one more ARG pee I say 40. Alright, so we have three parameters here. I am giving a call to add arg1 arg2. If I put arg1 arg2 the first add method would be called if I have one more ARG 3 now the second add parameter or the second add method would be called. So let's define result from new add method, right? So here we say. Okay. So as I said, we have overloaded the add method overloading is nothing but same method name but different arguments or different number of arguments or it could be different types as well. You could have only two arguments but one is integer and one is something else if for example string that also works so basically different data types A number of arguments but different data types or different number of arguments. Alright, so here we are adding three numbers and let's run this. So it's going to add 10 30 and 40, which is nothing but a tea. So this is done at the compile time. As I said this linking is done by GBM at the compile time. So here you can see results from new add methods 80 during runtime. You can see that it invoked this particular method and not this one. Alright now, let's start off with arrays, right? What is the concept of arrays? So again, this is similar to other programming languages arrays are nothing but grouping data or grouping values of same data-type. Okay. So arrays are used to solve the problem of storing multiple elements of the same data type. Okay, an array is group of like typed variables that are referred to by a common name. So you define a name for the array and in the future you can use this name to access it. Okay specific element in an array is accessed by its index as you could imagine since we are grouping you would have multiple elements, right you could add something to it or you could delete something or you could add it to the end insert it in the between of the array or just so something or just search by index rate you would give some specific index and get element from that particular index. So we would be looking at the Which would give you a clear idea about this but basically array is nothing but group of or its multiple elements of the same data type array type is fixed and cannot be changed. So in Java when you define an array you either give the number of elements that you can store in the array, which is nothing but the array size or you have to give the values that a particular array would contain right when you define it. Okay, but all in all you have to make sure that when you define an array you give the size as well which cannot be changed the feature the size of the array has to be mentioned during the Declaration itself. So here's an example of array this array has around for which has four subjects with stores marks of four subjects for a student. Okay? Here you could see indexes in the white box, which says 0123 it's always in sequence. It starts with 0 and it ends with n minus 1. So basically this array is of size for which starts from index ranges from 0 to 3. All right the value that is stored is nothing but the that's a marks in a particular subject which is like 87 60 70 and 80. That's the value that when stored into this array. Okay, we can access any of this indexes suppose you want to access at index 1 you could do it. Do you need to define a front you need to Define on the size of the array of front? This is how it's been done. Okay. So this is how you declare array. So we saw how we usually declare an integer and stuff like that in Java. But here we are declaring an array. All right. So this is an integer array and you can see square brackets here. Alright, this tells jvm that we are trying to Define array of type integer. Alright. So again, we use the same keyword which is nothing but Nu new keyword is used to create a particular array. All right, and here we are defining an array of size five. So this is one way of declaring an array. The other one would be who initializer itself when you declare it you give what are the values that particular array is holding up the first case you're not giving the values you are just defining an array which Those some some amount of memory right jvm would reserve some amount of memory or in this case. It's four bytes right array. So for integer, it takes four bytes. So it would Reserve 20 bytes for array of size five. All right. So in the second case as I said, it's directly initializing the array it's putting these values directly into the memory location still it would be consuming 20 bytes, but the second variant would have values directly initialized. So when you declare an array of size 5 the range of indexes would be from 0 to 4. If you try to access index 5 you would get this exception exception is nothing but a anomalies situation right which or something which is not expected as occurred in your program and Java expresses such event by throwing out an exception. You can't access index fi. So different ways of declaring an array. We saw that it's with new keyword. All right, so you have new int 10 which would declare array of size 10 again. You could either have the square bracket at the end of the variable or you could have it in between the type and the variable name. So behind the scenes it everything is the same. It doesn't do anything different for both but these are different ways in which erase could be declared. All right, the third one is similar to the last one where in we have BR initializing it directly. Alright, we are putting this value 12345 into this array. This one is again same you are so within the square brackets, you can see that you are not defining the size of the array, but you have an initializer at the end by which you express that you want to put in 1 2 3 4 5 into this array. So basically one and two That you see here does the same thing it declares the array of size. The first case is 10 the second case is five though, but behind the scenes it's doing the same thing. It's nothing different when it comes to actual preserving memory and stuff like that. It's doing the same stuff and three and four does the same stuff only thing is syntactically it's varying but what I'm trying to say is GBM doesn't do anything different to actually executed. So the length of the array is set when it is declared and when an array is declared array index gets initialized. All right, so if you define an array and if you try to print the length of it you could see that it prints out in this case. We have declared an array of size 20 and when you do x dot length, when you print it out you could see that it prints 20. All right. So what are different types of arrays that we have again similar to what we have in Programming languages, we have single dimensional array and multi-dimensional array single dimensional array is what we saw earlier like you define array of integer of size 5 that is a single dimensional array. So in this case, you could see a array been initialized with value 2 4 6 8 and 10 that's a single dimensional array since we have just one dimension one row right? Say for example, you want to store marks scored by a student or marks towed by a particular student just one student. That would be a single dimensional array. All right. So say for example, the first one is the marks code in math. The second one is the sign and so on and so forth. All right, so that single dimensional array. So now what's multi-dimensional array so taking the same example of storing marks code by a student. So by a particular student it would be a single dimensional array, but suppose you want to show your marks code by all the students in all the subjects. If you want to store it, it would be multi-dimensional array. So one particular row that you see here would be a mosque secured by a student by just one student in all the subjects. The first row would be by student won. The second row would be by student to the third row would be by student 3 and so on right? So that's where you have this application of multi-dimensional array. So how you access it is nothing but you want to access the first element the first index it would be a of 0 0 and this would be of 0 1 and so on so as I said if the First Column is for math if it's a marks secured in math this entire The First Column that you see would be marks secured by all the students in math. That would be the First Column whereas the first row is the Mach secured by student a in all the subjects. So basically This Could Be Imagined as a table in a database, right you have a table where in you have rows and columns so columns are nothing but you have Fields within a table and the rows that you have our different entries that you have within a table. So This Could Be Imagined in the same way. So you could see how the index is you could see how the indexes are aligned so X increases when you go down and Y increases as you go to the right the memory allocation of array, so for single dimensional array of type integer, 1 integer value takes four bytes, right? So now when you declare an array of size 5, you would have 20 bytes Reserve. That's how memories been allocated right if you have a character array of size 5, it would be ten bites since each character takes two bites in Java. So you would have 10 bytes reserved up front. All right, so that's about memory location a location in single dimensional array and when it goes to multi-dimensional array this case you have like five elements, right you have array of 55, which means that you have 25 elements stored within the array right 25 integer element stored within the array and each integer value takes four bytes for storage. So it would be a hundred bytes. All right, so if you have array of if you define a multi-dimensional array of 5 into 5, you would have basically a hundred bytes allocated for it. Let's write some programs and understand more about how this arrays operate. So we have an array of five elements. All right, as you could see here 2 4 6 8 and 10 write a program to access element at a specific index. Okay, so you have an array of five elements 2 4 6 8 and 10 and we want to access it. We want to access particular element. All right, so let's write so I create a class. All right, I Define this as our a demo, so I don't give a package name here because I am defining a class within a package so you could see here the package came directly because I right clicked here right and then created a new class. So yeah, you get this particular class here. I Define a main method as a type main it would give me a suggestion. So this is the entry point again for this particular class and suppose I Define the jar. Ray and suppose I Define 2 4 6 8 and 10, right so you could see here. We have an array defined of size five. Okay, and you have initialized it as well. So what I was trying to say is you need to have length of the array given up front right? If you don't do that, it would show you an error so you can do something like array of integers is equal to Nu so you could see here array initializer expected. All right. So either you will have to initialize it or give some value to it. So if you put here 10 you could see that it compiled right? So either you will have to mention some indexes here or the length size of the array or the ways to initialize this okay. Now you could see the compilation error as gone. So what I'm trying to say is it jvm has to know about the size of the array of And if it doesn't know then it would flag you with an error. All right, so we have defined this array of let me keep it as is okay. So now we have defined an array of size here five and we have initialized values as well. Now, let's try to print out values, right? So just to keep it simple suppose. It ranges the index would range from 0 to 5, in this case. So this value to is stored at index 0 value for is stored at index 1 value 6 is stored at index 2 value 8 is stored at index 3 and then is to that index for all right. So let's try to print 0 by the way. I want to copy it. Yeah, so I'm just sprinting 0 1 and 4 and let's see what it gives up. Right so it should print 2 4 and 10, right? So you could see here to 4 and 10. Now. The other thing that I wanted to show is if you try to access so let me show you what happens there. All right, so if you try to access at index 5 which doesn't exist at all. No, it should give you a exception So in Java exceptions could be nothing but God and you could do something with it. So here you could see that it gives it gave you array index out of bounds exception since five doesn't exist at all. The index five doesn't exist at all for this array. Okay. Now let's define multi-dimensional a write code to find the length of rho 0 right. So let's define a multi-dimensional array. Alright, so we have a multi-dimensional array here. So how you define multi-dimensional array is something like 1 2 3 4 Alright, so this is a multi-dimensional array that you have. Okay, so we have defined a multi-dimensional array the size of this array would be 2 by 2. Right 2 by 2 is the size of this array since you have two elements here or let me put it to remove the confusion. Let me put it this way. So right now we have like 2 by 3, right so you have like two columns and 3 rows. All right. So now let's print actually it has to be 3 by 2 rather. Okay. Now, let's print the size of this array 0 right. So how we do it is again println now you have multi-dimensional array and you have 0 so 0 to 1 refers to this 0 1 and 2, okay. Dot length, so as you could see here that individual row that you have within multi-dimensional array itself is an array is a single dimensional array. So multi-dimensional array is nothing but it's a array of single dimensional array. Okay. So let me print here size of first array. I miss Plus. So as you could see here, there was an exception and since there was an exception you won't have this particular statement executed since there was exception here. So basically to execute this particular statement, you should handle this particular exception, but we are not talking about handing the exception yet. So I'll have to comment this to pass through. So now you could see that it has printed out to which is your size of first array. So this is a program that we actually did right now create an array having many characters write a program to copy elements from created array to another array and also write a program to delete an element from an array. Okay, so I will just talk about this right here. So we have an array here of characters, right? So basically when you want to delete something from my array, what you will have to do is you will have to shift the indexes, right? You can't delete something directly from an array. So what you will have to do is if you want to remove something then you will have to shift the indexes what happens is suppose you have an array of five integers and suppose you are deleting the second element right. Now. What you would do is you would shift if you are deleting the second element within the array you would shift all the elements that follows the second element to the left, right? So the third element would become the second element. What would become third and the fifth one would become the fourth. So basically you shift it. That's how you delete something from an array. All right. So other thing is about copying elements from the array, we have a utility class which is nothing but system system is a class itself. So as you could have seen that when I'm printing out something I do system dot out dot println, right? So this system it's a utility class in Java where an IT exposes lot of functions within a lot of methods utility methods. So one of them being our a copy, so here you have to give source and the starting index and the destination and what we are trying to do here is copy 5, so this is how we copy from one array into another starting from index 0. So this is copying and the other one that you see here is about delete. So as I said deleting is nothing but we have A logic written here to shift the indexes to the left. So here we are trying to delete one at index 3 and we are just shifting elements after this index 3 to the left. That's how we delete something from an array. Now. Let's see what our strings so string is nothing. But again the data type with in Java. So why do we have strings at? All? Right. We have array of characters then why do we have string at all? So here's an example where in you have lot of loads of data? So you could imagine a role of a data analyst who has to analyze through lot of data coming in right? So nowadays, it's like petabytes of information being processed throughout a day, right which would be very difficult to handle if you had to deal with character array. So that's where that's where Java has come up with strings, which is nothing but a group of characters, but you don't have to deal with it Java by Itself has a class which would take care of this strings and since strings are widely used within a program you could imagine that name or anything that any identify that we have is mostly we have to store it as the string. So one of the data types that widely used within industry or which is widely used in programming is string, right. So Java has some kind of string management as well to make sure that programs run or make effective use of strings. Okay. So here what's been mentioned is James is a data analyst and he's finding is really difficult to actually deal with character array to store patients names every time so that's where we have string. So string a solving the problem of actually dealing with character array. So Java is actually having character array is touring characters or the characters in the string in a form of character array, but It doesn't expose it to the outside world. You can just use this class to deal with it, but you don't have to deal with character arrays. So Java string is nothing but sequence of characters, they are objects of type string class. Once the string object is created. It cannot be changed. This is the immutability functionality of java. We're in once you write to it. You can change the value. So this is specifically important when it comes to multi-threading when you have multiple threads accessing a particular string or same string. So that's when immutability helps us to make sure that you know, multi-threading is it's thread-safe we call it as thread safe because multiple threads can access the same string just because it is immutable. All right. So what are different ways in which you declare a string? So you have string Str is equal to new string which we are not initializing the value of the string here which could Any value and you have string str1 is equal to Ed Eureka wherein you are initializing the value of the string right away. The other one is the character array similar to the integer array that we discussed. We have character array as well. So immutability of the string. So why do we have immutability one is for security. So string stores lot of useful information, like even the credentials and stuff like that, which shouldn't be accessed by external users. So this immutability factor of string helps us to keep it secure so that no one else can see it synchronization. So this is what I spoke about when you have multiple threads accessing the same string, you don't have to synchronize it Java by itself through its immutability feature would ensure that multiple threads can access the same string without hampering it or it would run as it's expected. Shing so caching is nothing but you have a string pool. So basically if you have two strings with the same value, it won't store it. It won't store redundant copy of it. There would be just one copy in the string pool and both this references would be pointing to that value. If you happen to change one of these references it would point or it would create a new value in the swimming pool and point the other reference to it sort of so basically what we do is why caching is required is as you could imagine in application, as I said string is widely used data type and you could have multiple references pointing to the same value of a string. So we don't want to have duplicate values stored. That's where this caching comes into picture to utilize memory efficiently. So what is shrinking pool as I said string pool is all the constants that you define within the string within the application would be stored in the string pull string tool used in Java is a spool of string stored in Java Heap memory. So we have heat memory. We're in the objects are created and that's where string pool resides as well. String pool is Possible only because strings are immutable. You can't change once it is defined. You can change it. If you change it, then you can change that particular memory location. It creates one more entry in your string pool and the reference would point to the new entry. So the actual memory location is not getting changed. That's what immutability is all about string pool helps in Saving lot of space for Java runtime. We are breaking on the redundancy Factor here. So if you have multiple strings or if you have multiple strings holding up the same value, it won't create. People copies of it there would be just one value in the string pool, which would be accessed by all the references. So basically string pool as we discussed is or resides in Heap memory. So string is not a primitive data type unlike character character CH AR is a primitive data type string is not a primitive data type is the wrapper class to array of characters and this is specifically done so that Java has a mechanism to manage strings. Well, which is widely used it arrived within any application or any programming language for that matter. Della strings are stored in string to love Heap area which we already discussed so we can see a string pool. So we have stack memory and Heap memory. So when you have a local variable when you define something locally, the reference is created in the stack. All right, and it points to the actual object is created in the Heap, but the reference is created in the stand so you could see as pointing to hello in string pool. Okay, so s is nothing but a reference reference to this ring. Okay, so here we can see that we are concatenating. Right? So this would give you fair amount of idea. What immutability is all about, right? So here we have string S1 is equal to happy. All right, and what we are printing out the original string that is happy, right? So you could see here S one is a reference that's been created in the stack. You have a string pool within your HEAP memory which would store all the strings all the constants or literals that you have defined here. So you could see happy been stored in the string pool and S1 pointing to it. Now you are trying to concatenate S1 with learning, right? So it's happy learning. So you could see that the memory location that s one is pointing to is not changed right still pointing to happy. But this one more constant that's been created in the string pool that second category. The nation of happy and learning so you could see happy learning also created but what's important to note here is s 1 is still pointing to happy. It's not pointing to happy learning. All right, so if you want S1 to actually point to happy learning this is how you do so you have S 1 which has the value happy. All right. So you do S1 dot concat learning and you assign it to S 1. All right. So you are assigning to the same reference as S1 and you are printing out s 1 in this case, what would happen is unlike the previous example that we saw there in S1 is still pointing to happy you would see that as one is pointing to happy learning. So here you could see that this one is pointing to happy learning. So basically you move the reference from happy to have Peter. All right. So, let's see what our strings how do we operate on strings? Right? So let me create a new class here. Just ring demo. I create a main main method again. All right. Now what we do is string s is equal to and Eureka. All right. So let's first print the length of the string. All right. So this is how this utility class or this is how this wrapper class helps us. So it has all these utility methods right you just have to do else dot length. It would give you length of the string so had we not had strings and if you want to deal with the character arrays, you would have to print the size of the array here. Alright, so when we run it, it should print it it is the size of the string at Eureka. Let's have substring. So it's a beginning index. So suppose we give to so it would give you substring from index 2. So basically we are getting substring. We are getting part of the string substring is nothing but part of a string right from from a particular index. So since we have given to hear it starts from index to so you have 0 he's at 0 and x 0 D is at index 1 and U is at index 2 so it starts from you till the end of the string you have compared to you. Could Define two strings and you could actually compare them and see the value so basically So you could have one more string defined here something of this sort. Alright, so here we compare it. So we are doing s 1 dot compared to To him, it's true. So we are comparing S1 with S2. So it compares the given string with current string. So here you can see it as shown minus 1 right since B is one ahead of a so if you have same string it would show you zero. So if it's exactly the same it would give you zero. You have he's empty suppose. You don't have anything within your spring. You could check it whether it's empty. He's empty returns a Boolean variable which means if it's true it is empty and if it is false, it has some value then we have to lower case we have to upper case in this case suppose you want to have could be scenario in which you want to change or you want to change the casing. So I'll just take one of that I make it to uppercase. Okay, so s 1 is nothing but we have Ed Eureka stored within and we are so when I run this you should have said Eureka printed in uppercase. So here we have written camel casing and let's see the output. So here you can see the string was converted or translated into upper case. So similarly you could do lowercase which would print string in lowercase. Now we have value of is nothing but the value of a string value of some of the data type so you could pass integer and you could do value of and it would give you a convert integer into string, right so value of is a method within string which takes different data type and converts it into a string. So just to give you an example you could have like teacher I is equal to a hundred String dot value of and you give I it converting this I into string. So it would print the same value hundred but it's converting it into spring you could replace something within the string. If you want to replace particular character within the string which could be done with replace method. So replace method takes two parameters replaces a method within string which takes two parameters. First one is the character that you want to change and the second one is the new character that you want to change replace to. Okay so here to show S1 dot replace I could replace e Within a be alright, so we are making it lowercase and as you can see here, it's printed in uppercase E was changed to lowercase e so that's about replace. We have contains which again gives you Boolean type result, which says whether a particular value of particular character is present in a string. All right. So in this case we check whether we have a stew with a TLD. Oh and you replace t with L, which becomes hello, and now we are checking with the replaced string contains D, which it doesn't contain it, right so it would give you false. So that's about contains equals is basically checks for the equality of string. It takes one argument and it Compares it against the string object against which you invoke the equals against. All right, so to give you an example, so you have S 1 which is at Eureka Eureka now to print it. So here we do S1 Dot. printing equality of string So since it's the same it would give you true if had it been different it would give you false. So you can see here. It's printing both the strings are the same you have different methods, like compare ignore case where in this case we compared with case, right? If you would have had Eureka in lowercase, right? If it would have start with lowercase e you wouldn't have got 0 here. All right, whereas this one more method which is s 1 dot compared to ignore case when it doesn't consider the case, right? So even if there is a case change if this how one in uppercase and one in lowercase still it would match all still it would give the value as 0 which means both the strings are the same we could get some character out from a string. Okay. There is a method character at there's ends with which again returns a Boolean value saying that That a string ends with a particular character. Alright, so here what we are doing is we are checking whether the string P which holds the value happy learning is ending with you, which doesn't right. That's the reason it gave you false. Had it been G here it would have given it true. Now that's about strings. Now. Let's talk about different variant of strings. And why do we need it? So there are like three variants of string one is the string class itself. The other one is stringbuffer and you have a string Builder. So we'll talk about why do we need this variance at the first place? So string buffer is nothing but good for multi-threading when you have multiple threads. Usually it's good to have string buffer because all the reads and writes that you do on the string. It is synchronized. So when I say synchronized there's only one thread that could access a particular method within a class at any given point so you can't have multiple threads going in and changing the value or doing something. So basically if you have a string within your application, which is been accessed by multiple threads it's better to go with stream buffer or if there is lot of not accessed as such access. One factor, but of course if there are a lot of modifications done and stuff like that like with stream before you could append a pain to a particular string which cannot be done in string right in stream buffer. You could actually do lot of things it cannot be done and string and just to make it thread safe. They have made all the methods that modify the string contents as synchronized so that only one thread can access it at any given point. So see you can see insert here right in string. You don't have all these methods you don't have methods to manipulate the strings in string, right? Whereas in stringbuffer you have methods to manipulate the strings. So when I say strings those are literal strings, right not the string class. All right. So here we have string buffer and we are trying to append something to the string buffer. So we define a class we Define stringbuffer. So you could have like S1 dot append and when you see a pendant you could see that it appends any data type. This is the important factor in stringbuffer you have lot of utility methods within or you have lot of methods to manipulate the string which you don't have within string class. All right. So this is mutable, right you are changing the values suppose. I append three exclamation marks do it, right. So what we are doing here is we are just printing out the new string. All right. So basically you could you should see at Eureka and the three exclamation marks. As you could see here it got upended. So basically it's a mutable string change the value with them insert is nothing but inserts a new character at the given position. So here we are saying that inside w at position zero. You could replace it replace particular or replace substring with a new string. So here what we are saying is replace index starting from 0 till to with this new character sequence. You could delete something from it delete sequence of it. So here we are saying from index 0 delete one character. So if you have two then it would delete two characters. So basically when you say two characters even this e would have been gone. Okay, in this case, we are just deleting one character. So basically this delete method takes the starting index and the number of characters following the starting index. Zebras you have like you could reverse the entire string. Okay, so just to show you again new string dot if I reverse it. So basically this is a kind of utility methods which we often use right so you can see it's been reversed here. All right, you can see the capacity of the string capacity of the string buffer is nothing but I think it reserves 16 characters initially when you declare it and it keeps on incrementing it so it has a growth factor defined within which you did not take care of at this point, which you did not think about it at this point because those are internals to Java but initially when you declare a string string buffer storage space for 16 characters, which is 32 bytes. If you have stringbuffer by do we have string Builder, right? So string buffer as I said has some drawbacks. What are the drawbacks is more about string buffer is synchronized when I say synchronized which means that only one thread can enter it only one thread can process it. So basically if you have a multi-threaded application, you should go with synchronization because synchronization has some overhead, right? It has its own trade offs. So when you when you synchronized what happens is when you move out of the synchronized methods DVM internally has to do some operations which takes some time. So basically it's good to avoid synchronization and which would make the application much more faster and that's where stringbuilder comes into picture if it's a single-threaded application wherein you know that you don't have multiple threads which are going to access a particular string in that case. You should go with string Builder as against ring. First because stringbuffer would give you a slightly lower in performance compared to stringbuilder. Most of the things that string buffer does is done by stringbuilder as well. As far as the functionality is concerned but it's not thread safe stringbuilder is faster, but it's not thread safe which means that you cannot have multiple threats accessing it. All right, so to keep it simple, if you have multiple threads accessing or string buffer, then you should go with stringbuffer. But if you have a single-threaded application, you should go with string Builder which would make the application much more faster than stringbuffer again with stringbuilder. The default capacity is 60 when you initialize it stores as you could see it allocated 16 space for 16 characters initially. So as far as the demo is concerned, it's pretty much similar to stringbuffer. As far as the outcome is concerned. It's pretty much similar to stream buffer is no difference as such but as far as the performance is concerned stringbuilder is faster than string buffer because it's not synchronized. Okay, so you define a string Builder with happy and you append learning to it? Okay, and if you try to print s B1 which is appended with learning you will see happy learning would see it been upended. Okay similar to stringbuffer when you delete character from index position zero and one character from that position you would see that the H which is the first character has been deleted out so you could see that at index 1 you could insert welcome. You can see the entire string that is welcome being inserted between okay, then you have reverse Could reverse the entire string pretty much similar to string buffer. So again, this one is very similar. You have you are appending you're deleting then you are inserting here you have reversing here. This is pretty much similar to what we did for stringbuffer as far as the syntax and semantics is concerned and the outcome is the same as well. Just a performance change in terms of speed right? So, when do you stringbuffer and stringbuilder as I said if you have multiple threads you should go with string buffer to make it thread safe, but it would be slower as compared to stringbuilder. Okay stringbuilder is specifically good enough and you have single-threaded application and it would be faster since it's not synchronized. So to make it thread-safe you have synchronization which adds over it to the performance which takes tool on the performance. That's why stringbuffer is slower why to use object-oriented Concepts? So let's talk about classes and objects. So classes are nothing but it has got a street and behavior right as you could see you have a class and you have different objects, right? There's a phone which is a class and which has got different types of phones right rotary phone. Then you have a touch-tone phone and you have a cellular phone this are objects basically, right? So you define phone which is pretty much Jen Rick and which has got State and behavior class is something that is generate that has got State and behavior but objects is something that is an instance of a class which would have specific State and behavior. So phone by itself phone is a Class by itself. Which may or may not have specific behavior, but you could see that the specific phones will have its own behavior to could Define its own behavior. So all these three things that you see here three types of phones and nothing but objects objects of one class state is something that is defined by instance variables, right? It's a class level variable right at the class level you define something that gives State and behavior is nothing but something that is defined by methods like calculator was a class where in we had add method and add method basically gave some Behavior to the calculator class, right? So what are attributes so you have a class and you have attributes attributes and nothing but a property of object and in Java, this is defined by your instance variables basically class will have properties which is nothing but the state which would be defined by instance variables and you could imagine every instance will have its own set of properties. It won't be the same right in terms of the phone that we saw earlier. There were three different types of phones you could imagine that it would have different properties right? It's not the same. So what are the naming conventions in generally used at the industry level for Java. So this is not something that is actually taken care by compiler. So even if you follow this naming conventions still the compiler would pass through but these are best practices or this is good to have thing in the industry conventions is more about to keep On the same page and make it easier for other developers to understand more right or keep things simpler. So that's why we have conventions. If you wouldn't have conventions then people would prefer to write in their own way which would make us difficult to understand. Alright. So for class name it start with uppercase as we saw in all the examples you would see that I have always used started with the uppercase or it's rather camel casing. So in this case you could see stringbuffer demo, right? So it starts with upper case you have B, which is again upper case you have B, which is again uppercase. This is nothing but camel casing it starts with upper case. Basically it follows camel casing interface name is again similar to class. It starts with upper case you have method name which would be lower case always which should start with lower case, but you could have it follows camel casing but it has to start with lowercase. So maybe it's a predefined method with in Java. Right? So you could see main starting with lowercase or I created a dry Tad is again put C uppercase. If you would have say for example at numbers you would have something of this sort adverse. If you want to append numbers to it, it should start with uppercase. So basically it's camel casing but starting with lower case where as class name. It's a camel casing which starts with upper case variable name is again camel casing we should start with lowercase and constant is always like it has to be everything in uppercase. So basically if I Define a constant final string, I would write something like this. okay, so and if you want to add more words to it, it should be like this underscore So it should be separated out band score. All right. So these are the conventions that followed in Industry by Java community. So mostly even if you go to the source code if you want to see something dig into the source code of java you would see same naming convention being followed types of variables. We spoke about the types of variables again to brief you through we have local variables local variables are nothing but the variables that are defined in a method. So if you define something within a method that's local variable so ARG 100 or suppose I Define and T local where is equal to a hundred. So this is a local variable right? If you remember this is within the scope of a method once the control goes out of a method your variable is no longer accessible and also it gives space for the jvm for garbage collector to kick in and clean up this particular memory space. Variables are nothing but it's defined at the instance level so here for that matter. This constant is also instance variable. All right, so I can Define integer variable starts with lower case and it follows camel casing. So this integer is nothing but an instance variable. It's at the class level right when your class is loaded when you refer to this particular class, you will have your instance variable initialized by Java. So instance variables are declared in a class, but outside a method Constructor or any block. Okay class variables are nothing but static variables and it is one copy per class. So as against instance variable, which is one per object, whereas static variable or class level variable are it's just one per class. So if you define static, this is just one per class and this could be accessed directly using calculator calculator dot constant example, you would be able to access it but for instance variable, you need to have an object created. This is non-static basically non static instance variable. So one of the reasons why you need to access instance variable is because different instances might have different values for a particular instance variable, right? I could Define calculator one right? Let me put it as calculator and we have like normal calculator. You could have one more class which is like scientific calculator. It's one more object. Now a normal calculator can have its instance value as 10 and scientific calculator can have its instance value as a hundred you have different values, but whereas in static since it's one per class, it's not at the object level. So you have mod is equal to new demo, which is an instance of a class demo. And you print message right d dot print message and it should print this message. So basically there's a class demo which has got a method print message and we are trying to invoke that message from the main method. Okay, let's talk about the constrictor constrictor is nothing but when you invoke new keyword new calculator, there is a Constructor implicit Constructor for each class, which is without any parameters. So we'll talk about that. But when you do new calculator, basically there's a method which could be used by the programmers to initialize variables if they want to initialize something. So for each instance, if you want the same value for instance variable, you could initialize it with in Constructor. So basically Constructors are for initialization or if you want to do some kind of pre-processing break on invocation if you want to initialize something or do some kind of pre-processing that could be done through Constructor Constructor is used in creation of an object. It is a block of the code used to initialize an object. So when I say initialize an object, it's nothing but initialize some property or variable within your class Constructor must have the same name as the class. It is in and it does not have any return type. So unlike method, which has got a return type Constructor won't have a return type at all because what we are trying to do through Constructor is just to initialize objects within but you can't return something out of it. So basically you Constructor is a special method which you don't have control over you are not doing anything within it you're not trying to actually return something out of it, right? You don't have control over its invocation. It's done by jvm itself jvm calls this special method when you invoke knew or when you create an instance of it by using this new keyword Constructors are of two types default Constructor and parameterised Constructor. So when I say default Constructor and parameterised Constructor, this is nothing but so I am defining a Constructor now calculator as I said, it has to have the same name as the class. Okay. So this is a Constructor. And as I said, this could be used for initialization of variables. Say I initialize this 200. So for all the objects you would see this being initialized to 200. That's the initialization. Okay, so I have created two instance of it to instance of calculator class that is normal calculator and scientific calculator. Let me do normal calculator dot instance variable. Okay. So here we are printing the value of the instance variable. Let me copy the same thing again, but in this case. the second case I would be As you could see here. We have a Constructor. I defined a Constructor here Constructor for a class which is initializing the instance variable to Value 200. So as in when you call this new calculator a new instance of calculator would be created. The first thing that would be called. Is this Constructor and which would initialize it. So basically what we are trying to do here is we are right after the construction of this particular object. We are going to print the values of instance variable to see if it assigned 202 it. So here you can see the value 200 being printed out. So basically if I wouldn't have Constructor then the value wouldn't have been 200. So let me comment out this one. This is how we comment in Java. By the way. This is a block comment which starts with Slash and asterisk and which ends with asterisk and smash. So I commented out that one I comment out the Constructor and you would see the value being initialized to 0 so you could see value been initialized to 0. All right, so that's what Constructor is all about. Now. This is a default Constructor. You could have parameterised Constructor, which is like integer you provide some value right and you assign this value to variable. So instead of hard-coding this value of 200 for the instance variable you could pass on some value during the construction of the object. So basically what we are doing here is I pass 30 here and bypass 40 here. Alright, so I am passing 30 and I'm passing 42 the Constructor. And as you could see here, we are initializing the instance variable to that value. So basically for normal calculator, it should be 30 and for scientific. It should be 40. Yeah, as you could see here you have 30 and 40 min printed out and this is the parameterised Constructor. That's what this default and parameterised Constructor and that's what it is all about. So default Constructor is you don't even have to specify any Constructor. So I commented this calculator constructed still implicitly. There is the Constructor put in by jvm, which is the default Constructor. So it's not mandatory to have Constructor each time unless you want to initialize something. So what's the difference between Constructor and Method constructive must not have a return type? Whereas method may or may not have a return type here you could see that unlike the methods add integer, which return something. This doesn't say anything. This doesn't return anything because we are not doing anything within it. You're just initializing it initializing some instance variables right Constructor name must be same as the class so that This is a contract this has to be followed Constructor has to have same name as the class, since you are not invoking the Constructor by yourself. It's done by the jvm. You don't have control over invocation of Constructor and you have to follow the naming pattern that Java recommends to or Java forces us to you have to make sure that instructor is given the same name as the class name. Whereas method can have any name as we saw the add method you're free to use whatever method name that you want to Constructor is used to initialize the state of an object. We saw the instance variable being initialized within the Constructor method is basically it gives some Behavior to a class right we saw add method which is giving some Behavior to the calculator method, which is nothing but adding up two numbers. Similarly. You could have multiplied you could have divided and stuff like that which adds more Behavior to it Constructor is invoked. Implicitly so you don't have control over invocation of Constructor, which is done by Java itself. When you try to instantiate a class or when you use the new keyword, it's implicitly invoked by Java by jvm. Whereas method you have to invoke it manually. So basically when you do this Constructor is called by itself. Whereas when you want to call add numbers, you have to invoke it explicitly. How does Constructor work the moment object of a class is created The Constructor of the class is called which initializes the class attributes, right? So we saw about this. So when you use the new keyword jvm by itself would give a call to the Constructor which could be used for initializing initializing instance variables within your class. So type of Constructors this default Constructor and this parametrize Constructor, which we already spoke about the Constructor, which is created by the compiler without any parameters is the default Constructor and the Constructor with specific number of parameters is called parameterized Constructor. So here we spoke about this already. So we have integer value, right? This is a parameterised Constructor, since you are passing parameters to the Constructor, whereas if you don't Define anything Java by itself, so in this case you could see that we didn't have a Constructor for this class straight. I read them all we don't have Constructor for this class. So Java by itself puts her default Constructor for array demo, which is known as default Constructor. So it's not mandatory that you need to have Constructor every time since Java takes care of it. That's the differentiation between default Constructor and parametrization. We use parameterised Constructor for passing values to the Constructor and initializing something based on the value that's been passed out past in brother. So the default Constructor is used to provide the default values to the object like 0 null depending on the type right when I didn't have any Constructor at all for a moment. I am going to comment this. So this is a line comment when you put two slashes. It's a line comment. Okay, it's commenting just this particular line This is a block comment and this line comment block comment is slash asterisk and ends with asterisk. / whereas line comment is two slashes forward slashes. Okay. So basically a comment or disc instructors as well. Alright now we have this calculator class now lets me. Let me print the value of the instance variable. value of instance variable initialized by default Constructor. All right, so we don't have a Constructor at all. So that's what I am trying to say here. I commented out this Constructors, right? So we don't have a Constructor at all. And when you create a new calculator jvm by itself would have a default Constructor which is used by jvm to initialize variables within so you would see this instance variable has zero value as 0 because that's what the default Constructor does. It assigns some value to it has like specific values for integer it 0 if it's a class it would be null so you could see the value being printed as 0 if it's a class it would assign value null. So in this case you have string right and you could see 0 null depending on the type of instance variable that we are dealing. We saw how we pass parameters and initialized it. Constructor overloading is just like method overloading without written type Constructor overloading in Java is a method of having more than one Constructor with different parameter lists. Like we defined add we had to add methods and now I have renamed this to add numbers, but basically this was add method right so you could have multiple methods with the same name but different parameter lists, which is known as overloading similarly for Constructor. You could have the same Paradigm. So basically what we are trying to do here is we have a Constructor with 1 parameter that sing teacher I'll Define one more Constructor here with two parameters. So we Define one more parameter here and I say for example, I put something like this. So we are adding up these two parameters and putting it into instance variable. Okay, this is Constructor overloading. So here you have single parameter been passed here. You have multiple parameters being passed So based on whatever you pass here suppose I say 10 and 20. Or say I say? So on construction you should C-130 as the value of the instance variable. Okay, as you could see here, you have the instance variable initialized to 130, which is nothing but edition of hundred and ten and twenty and you could have something like this just hundred and ten, which is also K because you have a single distinct defined as well Constructor taking a single value as well. And in this case, it would be just a hundred and so Constructors are nothing but methods which helps in construction of object. All right, so you get a hundred and ten here? So Constructor overloading is in Java is a technique of having more than one Constructor with different parameter lists. So we had a demo about it as I showed there were multiple Constructors one with one parameter and the other one with integer parameters and during runtime based on whatever you pass a particular instructor would be called in this case. You could see that in the first case which is shop s 1 you could see the first Constructor been called which has two integers as being passed. Whereas when you create object S 2 which has two integer parameters and one string you could see that second Constructor is being called. What's Constructor chaining so Constructor chaining is the process of calling one Constructor from another Constructor with respect to the current object? The real purpose of Constructor chaining is to pass parameters to a bunch of different Constructor, but the initialization should be done at a single place Constructor chaining can be done in two ways within the same class from the base class and Constructor chaining occurs through inheritance. So basically for Constructor chaining, there are two key words that we have. So one is this this itself is a keyword in Java this pH is this is a keyword and the super keyword. Let's see how we how we do it for this particular Constructor. I have this Constructor which has this value, right? So instead of doing this directly, what I could do is so here. I was initializing this value directly to the instance variable. What I could do through Constructor chaining as I could do this and I could pass the value comma zero. So basically you're chaining here, right? You could see that what I am trying to do here is I am trying to invoke this Constructor from this Constructor. That's what the chain is all about. So when you say this it tries to find Constructor within your class which takes two parameters to integer parameters and this is the one it finds out, right? It has two parameters. And basically what we are doing is we are keeping the second parameter is 0 which means it would initialize the instance variable to whatever value you have here, right? This is what Constructor chaining is all about. It's more about calling Constructor of the same class within the Structure of the same class. So basically from this Constructor you are giving a call to this Constructor that is constructive change. Super should be the first it gives a call to the super Constructor. So you have a subclass and superclass, right? What do you do here is you give a call to superclass? For Constructor chaining. I think they should be good enough where and you use this keyword to call Constructors within the same class. You basically chain them together, right? We have demonstration on Constructor chaining here. When you create student you could see there's a Constructor without any parameter and we could see this Meghan been called. So basically what we are trying to do here is the default name would be Meghan, right? So and again we have one more Constructor, which is overloaded Constructor, which takes name and in that case it would give a call with the specified name and Mark as 70. So basically 70 is a default marks that we are signing and you can is the default name here. If you don't provide name, it would be Meghan. All right. So this is what Constructor chaining is all about. Static keyword static keyword again, we have spoken about in couple of instances, but I'll just walk you through this slide again. The static keyword is used for memory management static is non access modifier used in Java accessible applicable for blocks methods class variables static keyword is used to refer the common properties of an object. So as we spoke it's at the class level, it's not at the object level. We have it common across all the objects right when the static keyword is used to declare any parameter. Then memory is allocated only once for that parameter. So in this example, we could see that since it is one per class. So you would have this constant example Define just once right it would be allocated. Just once whereas the non-static ones like this in. This variable you would have memory allocated for each and every instance. So basically for this instance, you would have memory allocated for this instance variable for again this normal calculator that we had earlier you would again have a memory allocated for instance variable. All right, so it's one per object whereas the static ones are one per class. So yeah memory is allocated only once for that parameter. All right. So here we can see that this we have a static string company which has some company named put in there and we are just displaying it right we can see that we are displaying ID salary and Company and you could see that for both the instances for even and E2 you have two employees here with ID 25 and salary 25,000 and we have employee to with salary 30. Sorry with ID 30 and salary 3000 right? So we are defining two instances of employees and you can see here. We are not passing the company name as a parameter to the Constructor right still when you display it look at the output at the right side. You can see that it has displayed twenty five twenty five thousand and SRT Traders the company name came by itself because it's one per class. So what we are assuming is this class is basically designed just for one company, right that is SRT creators. So all the instances of the class are all the employees that you create here. All the instances of employees that you create here will have the same company name that is defined here since it is one per class. Whereas their ID and salary would be variable which would differ as per the value that you passed to the Constructor. here we can see that company is a static variable little allocates memory only once So here it could be seen that you as I mentioned earlier you have reference variables being created out in the stack. And in the Heap memory, you could see values being stored. So ID is tri-five salaries 25,000 for E2 ID is 30 and salaries 3000 and you can see the static variable. So basically static variable is stored in a different space which is permanent generation memory. That's where the static variables are stored. So method could have static as well. When a method is static you did not create instance of a method to call that method instance of a class to call that method pretty much similar to static variables, right? So basically I can have one more static method here. So say for example I have private static all right, so So what I was trying to say here is you could have calculator. . And you could directly call the display method. So you do not have instance of a class created its at the class level. This is at the class level rather write one per class. Let's talk about this keyword that this keyword is used as a reference variables to the current object. So basically what what it is trying to say here is so if I want to print something here, let me print the instance variable, right? So within the add method what I am trying to do is I am printing the value of instance variable Within add numbers, right? So I'm trying to print the value of the instance variable within add numbers which would be basically this is where we are calling at numbers. So basically it should be a hundred and ten, right? When we have such scenarios where and we refer to an instance variable within a method we could see here printing the value of instance variable within add numbers gives you a hundred and ten right the implicitly what happens is it puts this dot here this dot instance variable. All right. So what we are trying to say is the instance on which the add numbers was called on the same instance, whatever the value of instance variable is just print that thing out. So this is implicitly put in here you need not use this keyword. This keyword is usually used when you have something like this right when you have instance variable suppose. You have something of this sort. Right? One of your parameters is same as as the instance variable, right? So you want to differentiate which is the instance variable and which is this variable right? So that's when you use this When you say this dot instance variable, this is referring to this instance variable and this instance variable to the right hand side is referring to this one. Alright, so that's when you have to explicitly put this or in other cases. It's done by the jvm itself. You did not take care of it. All right, so So, this can be passed as an argument in the Constructor call. This can be used to invoke current class method. This can be passed as an argument the method call and this can be used to invoke current class Constructor. This could be past basically if there is one more. so say for example, you have something of this sort which is pretty big though, but Admitted taking calculator as its parameter. Okay, so I'm just trying to demo you could actually take calculator as an argument for any of the methods within. All right. So you have ADD method which takes calculator as its parameter. Alright, so here say for example within this method don't think about the logic it's not logical though. I'm just trying to show you it could be done. Right? So I have ad and I put this within your method you could have you could pass as an argument you could pass this as an argument. So basically you are invoking this one. So now if I print it you can see in add numbers you have this method being called. So yeah here you can see printing out the add method taking calculator has its parameter. So basically it's calling this on by passing this. So here we spoke about the Constructor earlier. We saw how this could be used in The Constructor and one of the use cases as I said here you could see that similar to the example that I spoke regarding the instance variable. You could see the parameter the name of the parameter is rule number which is same as the name of the instance variable. This one is pretty much similar to that. You could see that the name of the parameter that is passed to the Constructor is same as the instance variable name the rule number two. The left hand side is nothing but instance variable within the class info whereas to the right hand side. It's a rule number that is passed as an as an argument to the Constructor similarly for the name you have this dot name, which is referring to the name the instance variable in the class info and to the right hand side. It's a parameter that's passed to the Constructor. That's a typical use of this. So we are creating a message here and you can see that we are giving a call within the Constructor. This is within the Constructor actually, so we saw this in the previous example. Basically, this is what it does write this value of 0 that is what this is doing within the Constructor you have this and you are giving a call. So in this case this Annie would give a call to message string n and would print it out. So how does it work the main function is executed. So again, this is a sequence in which the things execute behind the scenes. The main function is executed first, when an object of the class is created a default Constructor is called okay, in this case, the one without parameter is called right then you have this dot any which is nothing but you're giving a call to the Constructor within the same class, but with the parameter any so the jvm would check whether you have a Constructor with parameters as string, so it finds it and it would give a call to that Constructor, which is nothing but the Constructor that you see here in a Blue Block right, then it would similar to any method after the method invocation is done. It comes back to the calling method, right? So after this and is called it comes back here then it prints. Welcome to edu Rica. And once this is done, it would go back to the main method in general. What happens is whenever a method is invoked the local variables and everything is pushed onto the stack similar to C. Write in C. Also you have a calling stack. So your local variables go into the stack. The calling method is invoked after the method is being invoked and is completely done. It would come back to the stack and start off from where it had left earlier. So typically how the subroutines and everything work in programming language. That's how it's done in Java as well. So that's why we have calling stack. So that's the sequence of execution that happens. So let's start off with object-oriented programming Concepts. This is pretty much generic. This is not something that is just for Java. So this is object oriented programming concept, which usually all the object-oriented programming languages use it or adhere to it. So we have Which we'll be covering up in the topics to come polymorphism, which is we have like static polymorphism and we have Dynamic polymorphism cover it up in details. The coming slides will talk about what is abstraction and also how Java has encapsulation or how Java is aligned words the encapsulation feature of object-oriented programming. So let's start off with inheritance just to give you an analogy you could think of inheritance anything that is derived have some super class or you have something from which other subclasses are derived when you have some feature of your parents. We say that you inherited right because you have got it from your parent. So you have a parent so this could be an illogical to something of that sort. Maybe you are looks is inherited from your parents sort of that is exactly what inheritance is all about. You have a parent class and you could have subclasses out of it and this subclass is would inherit. Features or inherited State or the behavior? I would say of your parent class. So to give you an example as you could think of vehicle right vehicle is generic thing which could be a super class so vehicle could be thought of as a superclass. Now, there are subclasses to Vehicles you have bike which is a type of vehicle you have car which is a type of vehicle you have buses, which is again a variant of vehicle and truck of course is again a vehicle. So basically this defines easier relationship by if you read it out you could Clearly say that bike is a vehicle car is a vehicle but it's a vehicle and similarly truck is vehicle. So basically this is something like it defines. He's a relationship. So let's see about how actually this classes or the sub classes inherit from the parent classes just to read out inheritance is a powerful feature object-oriented programming through which one object acquires some or all properties. Behavior of parent object. So as I said, it's an easy relationship. So he's a relationship is represented in Java through inheritance. It could also be seen as a parent child relationship. So subclasses are actually child of parent classes in the previous case you have by which is a subclass of superclass vehicle. So vehicle is a superclass and henceforth we would be talking in this terms of we would be using this terminology is so just wanted to be sure you get it so vehicle is nothing but a superclass and by could be henceforth referred as subclass child classes would be referred as subclass. So you have method overriding what do you achieve by inheritance is more about method overriding to achieve runtime polymorphism. And the second thing is code reuse ability as I mentioned the subclass would inherit properties and behavior from your superclass. Your parent class so there could be some method defined in your super class which need not be redefined in your subclass. It inherits by itself. That is the property of inheritance. If it has got a common Behavior like say you have two kinds of calculator different types of calculated the example that we spoke about yesterday. There could be a parent class calculator, which is adding numbers as is you provide two numbers. It adds up and it gives you maybe this add Behavior could be added into the calculator Claus now Suppose there is a subclass of calculator where in you have this scientific calculator or something which is modifying this behavior of our which is using the same behavior of add right basically a normal calculator or a scientific calculator will have the same add Behavior adding up two numbers. Whatever you send it as a parameter, it would add it up and give you the result. So basically you would Define this ad in the calculator in the scientific calculator. That would be the subclass of your calculator you need Redefine this add method. It would inherit from the calculator method. So that reduces would redundancy or it helps you in code reuse ability. You need not redefine the add method we have lot of slides to come about method overriding and Method overloading so I won't talk it right away. This is inheritance. You have a manager class and you have like employee which is extending manager. So what we are trying to show here is e dot salary as you could see here. There's a salary property in a manager and this employed to is extending manager and we could see here that employee to in Harrods salary property though. It doesn't have a salary property. We are able to access the salary property from employee to let me give you an example. You just have to click on create new project and give some project name. I'll give a dude a car modules 3 so it opens up a new window you could go to the source folder and you could right click on it and Create a new class. So basically I'll do one thing. I'll create an employee class. I'll follow the same example that's been mentioned here. I create calm down at Eureka dot manager class. So calm down Eureka is nothing but the package name and manager is your class name. So now I Define a property here say salary in that case, right suppose. I say maybe I will put it as wrong salary. So I Define a property within your manager, which is salary. Now I Define one more class. So you could either Define it with in the same file or you could create a new class for Simplicity. I create a new class. It will create employee. So it created an employee class within calm down Eureka package. Now, let's do main which is your entry point for the program. Now as you could see I haven't defined salary within employ. The first thing that I'll have to do is we are talking about inheritance. So employ extends. This is a keyword used for inheritance. So employ extends manager. So now you could see there is a property which is salary which is defined in the manager and this employee which is the subclass of manager and let's see if salary is accessible to employ. This is a place of manager. So I Define employ EMP is equal to Nu employ. This is how we create instance of the class using new now. Let's see if just for Simplicity. I will give this e MP dot salary you could see that right just to be sure I print out so as we can see here salary though. It's not defined in employ. It has been inherited from rather from your manager. We can have one more instance created which is like manager is equal to new manager. This is instance of manager class. Now, I do manager dot salary is equal to salary of manager. Is it just printing it out? So what we have done here is again, I repeat the same thing. So we have a manager within manager. We have defined a field salary and we have employee which is extending manager and the employee class. We don't have the field or we don't have the property salary defined here, but we could see here in this example wherein we created the instance of employ and we are accessing salary property from here though. It's not defined specifically in employee. It's been inherited from the parent class that's manager and manager of course has salary field which is been access of here and we could assign some value to it. I run the program it should compile and create a class file out of it and it runs the class file using jvm. So yeah, as you could see here, it's printing out values for salary of employee and manager as well. So that's about inheritance it see inheriting the property salary from parent loss. Now, what are different types of inheritance that we have this Bill inheritance wherein you have a parent class and you define a subclass out of it so similar to what we spoke. We had a manager class and we had employee class which was inheriting manager. That's about single inheritance. You can have hierarchical inheritance wherein you could have multiple classes inheriting from a same class. So you could have a and be inheriting from a single class. You could have multi-level inheritance wherein you have one class inheriting from another and again, you could have subclass of the subclass parent class you inherited or you subclass it or extended whatever you say so there is one level. So you have a child class. Now, you could have one more sub class of this child class. That's what multi-level inheritance is all about. So as we go through the example, it should give you a clear idea about what I'm talking about so single inheritance, so we have vehicle and we have bike which is extending vehicle. So this Similar to what we defined here. So what we did here is single inheritance. You had a manager and you subclass debt and this is just single inheritance one level. So what is hierarchical inheritance? So you have a vehicle and you have two subclasses created out of vehicle. So there are two child's of a parent class. So this could be pretty much similar to a parent having two kids right there could be two cats and they inherit some property from your parent. So it's pretty much similar to that. So you have a vehicle class which is the super class and you have subclasses to it. So, let's see how this works. So I create a vehicle class which is the super class. I have a vehicle class and civically class has a property which says integer say number of Wheels. This could be one of the property of a vehicle class. You have say for example, you have the mileage. So these are common properties that you have in vehicle. Say you have Motion just to add a behavior to this particular class. I Define method move and I just print this thing out here. I defend two properties here for vehicle class, which is number of wheels and the mileage and add a behavior to the class by introducing method which is move which is nothing but I'm just printing it out. So ideally you would have some functionality written within or you would have lines of code written within just because we are talking about inheritance just to show the properties and behavior is been inherited by the subclass for Simplicity sake we don't have any logic written within move. It's just printing it out saying that just to indicate that you know, there's a move method within the vehicle class is being called. We're just printing it out there but in reality as I said there would be actual logic written with them. So now I Define car class and I defined by class. So now I say that car is extending which is nothing but sub class of vehicle. So remember we said easy relationship. Chip car is a vehicle. So what we are saying is subclassing or we are inheriting properties of vehicle into car suppose. I change the property of any you method within or say I can have its own moment when car cross. So basically we are overriding it. What we are trying to do is we are trying to whatever method you had within your car class or the vehicle class. You are overriding it for the car class. You are trying to change something similarly in your by class. You could overwrite the move. So first thing that we'll have to do is bike should extent your vehicle. So bike is a vehicle we are extending it now. We are again overriding this move method to say move in by class. So now basically we can have seven more just for simplicity's sake we have just a class wherein you would write the main method. So this is generally Practice were in such classes are called as client classes where in you have a main method and you do something with it? I just call it as automobile management class. So you have a main method so suppose you want to change the number of wheels for a car. So what you would do is car car is equal to Nu or it won't be carved would be like suppose I put Mercedes is equal to new car by create Mercedes. I create BMW is equal to new car. So now what we do is I want to overwrite the property that is number of wheels for Mercedes to for similarly. I could have a bike class say r 1 is equal to Mu by something of this sort you could have Ducati is equal to Nu by so this is just to give you an idea of how we have classes and objects right now. You could imagine what objects is all about. So Mercedes is object of car BMW is object of car. Arvin is object of bike and Ducati is again an object of by so now I could overwrite the properties here say number of vehicles as to so yeah, this is what it is all about. This should give you some idea about how we use Java you have a class you have subclasses, then you kind of create objects and you could override the properties with them and you could change when I say override is nothing but you could modify the values within your subclasses and similarly, you could change the behavior vehicle by itself would have some Behavior defined but Mercedes and BMW, which is a car would have its own kind of behavior, which is not inherited from parent you're overriding it when you say this this could be an illogical to something like kid kid doesn't have the same features as a parent. It is something like it's been overridden right? It's peculiar to that particular kid, and that's what this is. About so you could override it. Now. Let me print move or let me call the move method on BMW so you could see a move method and when I run it it should show move method in car class since it's a movement that called on car BMW is instance of car. So this should give you some idea about how are we inheriting properties and behavior from parent class. So here we can see that move in car class. So again, you could Define your own method within your subclass, which is not something that is inherited from your parent class. So BMW by itself or car by itself could have something like sector board which is not in vehicle. Maybe this is specific to car. So this is what we spoke about is hierarchical inheritance. Now, let's talk about multi-level inheritance. So basically it's nothing but say you have a super class category. So let me use the same example. You have a vehicle class you Have a car which is extending vehicle. Now I Define one more class, which is nothing but superclass Supercar which is extending car. Basically, I can put this turbo in Supercar rather that would make more sense. This is like kind of multi-level. So I am putting this turbo here in supercars. You have a vehicle class you have a car which is surplus of vehicle. You have a Supercar which is a subclass of car. So all the properties that you have in vehicle class could be accessed in car as well as Supercar. That's what we want to see here. So you could have something like say change Wheels which is void which is not returning anything here. I just want to show you that we can still access number of Wheels here though. It's not defined in car or Supercar but in vehicle class you could actually it is still visible here and you can modify it. That's the beauty of it again. Brief, you have a vehicle class you have a car class, which is extending vehicle class. You have a Supercar class, which is extending car class. So basically there is a multi-level of inheritance and all the properties and behavior that you have in vehicle class would be visible to car class as well as Supercar cross and Supercar class can access properties and behavior that is there specific to car class. What I'm trying to say is if you define a new method here, so I just mention here Behavior specific to class to car. So there's some behavior that is specific to car that we have defined within the car class. Now Supercar class can access this one as well. So you could see here you could access Behavior specific to car as well. If you look it as a tree. This is a leaf node. This is super car class can access everything from vehicle and car class. Whereas. Our class can access everything from vehicle class, but it's not the other way around car cannot access something that is specific to Supercar. There's a turbo method that we have put in into the Supercar class. Now. If you try to access Turbo from here, you won't be able to access it. All right, so it's not the other way round. So you cannot access something that is specific to your subclass in your super class. Whereas you can access anything that is there in your superclass into your subclass. So it's a one directional flow from superclass to subclass. Now, let's talk about has a relationship has a relationship is nothing but you have properties within your class, which is has a relationship. All right. So say for example employee, right? We defined the employee class and employee would have an ID specific to employ and it can have salary and stuff like that which is has a relationship which is nothing but employ as ID sort of right so a department in a class Let's talk about this example a department in a college has several professors without existence of departments. There is good chance for the professor's to exist hence professors and Department are loosely associated. And this loose Association is known as aggregation. So one can exist without other which is loose Association and such thing is nothing but aggregation. So here you could see employ here. You could see name name class itself, which has got first and last name. So basically you have a name class which has got property as first and last and which is nothing but the first name and the last name of any entity. It's not associated with anything right now. It's a different entity name is a different entity which would have first and last name now this employee info class, which has got ID and which has got name so you can see name hear this name property is nothing but The instance of name class that is there the left hand side. So this is has a relationship. This says that employee info has name. So basically this is what it is when you talk about has a relationship its containment. Basically you have class as a property in a class. So in this case name is a property within your employee info and similarly this name could be used somewhere else as well. It's not that it has to be used just in employee info. That's a kind of Detachment they have right. It's not tightly coupled. It's Loosely coupled or decoupled. So basically you have name which is altogether a different entity defined as a class which would have first and the last name and you would have an employee in for which is containing name which has name. So this is has a relationship and also to give you idea about has a relationship. It's not just it has to be object. Right so vehicle has number of Wheels vehicle has Uh, this could be thought of as a relationship. So let's talk about polymorphism. Now when one task is performed by different ways, then it is called as polymorphism Polly is multiple of ism is forms. Basically, that's the meaning behind it. So multiple forms. That's what polymorphism means and when one task is performed by different ways, then it's called as polymorphism this person which is the super class. You have a subclass student is again person millionaire is a person these are super classes. So you have a person class you have super class student and millionaire you have a behavior, which is nothing but P Bill and which would be specific to both of them. So as we move on you would get much more idea about the different kinds, but basically you have multiple forms. That's what polymorphism is all about. So, what is Method overloading so we spoke about this yesterday if you remember we spoke about Constructor overloading we're in you Had multiple Constructors Define one was integer integer, and the other one was like it was taking three parameters integer integer n 3 integers, right? So basically this is what method overloading is all about to have the same name of a method but you have different number of parameters passed to the method or you have different type of parameters passed to the object to the method and based on that. It would understand which is a method that needs to be called. So suppose you have ad with two integer parameters Define and you have ADD with three integer parameters defined now when you invoke add method on a particular instance of calculator and you pass two parameters to it, it would appropriately call add method with two parameters and if you pass three parameters to it, it would call one with three parameters or it would resolve it during the runtime which one to be called rather. It's not overloading doesn't happen during runtime. It's done during the linking of the resolving operation. Ben's during the compile time itself. That's why it's static polymorphism method overloading is nothing but static polymorphism. So return type is not taken into consideration when it comes to Method overloading. It's just the parameters that a particular method takes. So Alex wants to write a code which can be used to find out the area of triangle as well as of circle. So generic code which would have area of triangle and circle so such are the instances wherein you could use method overloading. So what's the thought behind is I want to find area of both the shapes here area is the common method. It's there for both the shapes. It's therefore rectangle. It would be there for square. It would be there for Circle and so on and so forth. So basically you would have a shift method which would have area which is a common method. So instead of writing two methods of different names. I will write area as the method name for both shape. And a path different arguments according to the respective shape. So instead of defining multiple area methods you would have just a general area method defined in your shape class and your subclasses would overloaded as per the type of shape. So here we can see that this area class there's area method which is taking integer since it's a triangle its base and height. So it's taking base and height as parameter. So Java doesn't understand base and height. This is user defined by the way. It understand. There are two integer parameters passed through the area Whenever there are two integer parameters passed to area method. This one would be called. The other one is again, we have one more method which is area which is by the same name and which is taking just one integer parameter, which is radius. So this is supposedly for circle Pi R square. So during runtime when you call it, so I'm not repeating this exercise again, because we did the same. Yesterday if you remember we kind of had multiple add methods in the calculator and we saw that it was getting resolved to the proper one based on the number of actual parameters that you pass. So I will just read through the slides to make you give more explanation on this but it's pretty straightforward. So here you have area method which is ticking for six which is nothing but it would get resolved during compile-time this particular area method invocation would get resolved to this one since it is taking two integer parameters. Second one is taking just one integer parameter, which is 5 so it understands that it has to call this area method the second area method that's been defined in method demo and it would call it accordingly. So here you could see that when you run this particular program you could see that the first one resolved it to Triangle and it said that the area of triangle is nothing but 4 into 6 into point five, which is nothing but 12 the second one goes 2 pie R square. And it gives answer as seventy eight point five. So you could see there are two different invocations done based on the number of actual parameters. Now, let's talk about type of parameter the method overloading can happen on type of parameter as well. So you could have multiple methods with the same name taking same number of arguments but different data types one could be taking integer as a parameter. The other one could be taken string as a parameter and during runtime ordering compile time itself. It would resolve that, you know, this one should be resolved to this invocation and the other one should be resolved to the other one. So basically it tries to resolve based on the parameter based on the data type of the parameter that you pass. So here's the example wherein you have two different methods. I will take this one. Say for example, I Define public integer. So it's a dummy value to be printed one of the best practices when you write Java code is to express it, right. So you can have a big variable name you shouldn't be restricting on variable name which makes it difficult for other programmers to understand. So it's good to have big variable name versus small one, which is not that expressive. So here I said dummies string value to be printed. I'm printing integer value is nothing but dumb integer value and here I am printing so we have two methods with the same name but it's taking different data types as argument and we are just printing it out. So I Define a main method here and I Define manager. So we have instance of manager senior manager grade 2 dot display I pass integer to it. I pass hundred to it and I pass so I have to Method invocations here. One is first one. We are passing hundred the second one. We are passing a string to it and it gets resolved. You could see that the first one would go to this display method which says printing integer value the next one would go to this. Display method which print string value so you could see here. Right? So first one is printing integer value. The second one is printing string van. So based on the type of the parameter that you pass through are passed to the method particular method would be called This is static polymorphism. Now what's runtime polymorphism. So since it is resolved during the compile time, it is static polymorphism. There are few things that gets resolved during the runtime or the compiler cannot judge it up front what the instance would be and that's when it does it during the runtime and that is nothing but dynamic polymorphism or method overriding so method overriding is mostly used in an easy relationship. So in one of the methods or we saw in vehicle and car example, we have a move method here and here we overrode it. You can see override annotation here for the move because you're overriding it overriding the behavior of vehicle in car class. So that's where it says that this Easy relationship method overriding must be used in case of inheritance that is easy relationship method must have the same name as in the parent class. We saw in the move in the example move. We have the same name as in this super class. So huichol has a method move and car has a method move as well method must have the same parameters as in the parent class as against method overloading which has different parameters method overriding you have to be sure that it takes the same parameter if I change this to integer if I add an integer parameter to it, so it's not taking it as overriding you could see it. It's not been taken as overriding because you have integer parameter to it. So basically it has to have same number of or it has to have the same signature as your parent class. So that's about method overriding. Let's have a demo on this so which we already saw but I will again A trait on that so basically this example you could see there's a man class which has got a pay method which is adding Behavior to the man method and you could see it's a dummy printer and you have a millionaire is a man and you could see it overrides the pay behavior and you run this program. One thing to note here is you can assign me linear to man. You can assign unlike all the examples that we saw we are creating instances of the same class or assigning the instance of a class to the same class. But in this case you could see the instance of millionaire is being assigned to reference of man. This is something that happens only in Easy relationship or inheritance. So what I am trying to say here is a go-to automobile management I have car I have a new car which is Mercedes I could assign this Mercedes to vehicle since Mercedes is a vertical it should be a sign you should be able to assign it. This is something that you need to keep in mind your subclass object could be assigned to superclass. So here we have Mercedes being assigned to vehicle. But one thing to note here again is the tricky part is vehicle itself has its own move method, which Moving vehicle class and Mercedes which is car itself has its move method with this move in car class. So the tricky part here is when you would do something like vehicle dot move just give a thought about it which one should be called. So you have two variants of move method here. You have one in car and one in vehicle. So the one in vehicle is printing out moving vehicle class and one in car is the overridden version of vehicle with says move in car class. Now, what we are doing here is we are creating an instance of a car class and we are assigning that instance to vehicle and we are calling the move method. So just give a thought whether the move method on the vehicle class would be called or a move method on the car class would be called. So this is where method overriding comes into picture so method overriding is nothing but it's a runtime polymorphism which is done at the runtime. So during the runtime jvm would see that Mercedes is nothing but the instance of car though, it's assigned to vehicle which is super class still an instance of class. So during compile-time jvm wouldn't have a friend knowledge that which move are you calling? Is it on vehicle class or is it on something else or some sub class of vehicle? So it doesn't decided during the compile time it delays it or there's a lazy binding that happens delays it till the time you run it. So when you run it, it understands that this vehicle is actually pointing to car. That's Mercedes. So when you run this you could see that I will comment out this piece of code. So this is how we comment out that's a block comment. So when I move this you could see that move glass on car has been called and not vehicle that is what is if you get this concept, you're pretty good in terms of object oriented. By the way. This is an important Concept in object-oriented Paradigm. So you could see here move in car classes. Called similarly vehicle could have I call it as vehicle one, right? I Define one more vehicle here, which is like new vehicle and I invoke the method on vehicle to so the second variant would call the move method in your vehicle class. The first one calls on the curved glass the second one calls on the baker was since its object of vehicle itself. So basically you have to see on the right side, which is the object that's been assigned since its object of vehicle. It's vehicle. But since this one is object of car, that's the reason you have car class being called. So we had some discussion on this keyword yesterday. So super keyword is similar to that super keyword is just that it is called on superclass. This is called on the same class super is called on the immediate subclass immediate parent class you could have multi levels, right? But this one is calling the immediate parent used to refer immediate parent. Us instance variable used to invoke parent class method and there's one more Super keyword one more form in which you could use is to have class Constructor. So basically whenever you create a class whenever you call a class whenever you call Constructor of a class by default jvm by itself would give a call to the superclass Constructor, which we would be looking at the further slides. So here we have vehicle leaven, which is a super class which defines string Wheels vehicle moves because of wheels so that the string that the property of a vehicle you have a truck which extends vehicle and then within truck you have your overriding the wheels property saying that truck has four wheels. This is kind of your overriding the property. It's not called overriding though when it comes to properties. But basically you have changing the values within your truck class print wheel is nothing but a method that's defined in. Truck which would bring the number of wheels in your truck class and it has got super dot Wheels which would print the number of wheels in your or print the value of the Veals not number of Wheels value of the wheels property within your vehicle class. So we will look at this one. So we have a vehicle class and we have string Wheels which is a property within a vehicle class which has some value put in right? We have a truck class again, which has got wheels and it is overriding the value. It is just changing the value as truck has four wheels with interrupt class you have print will method which is printing the wheel or the value that this particular Wheels property holds it would print it first one would be the value that this particular truck class would hold and the other one that you see here the second print statement, which is doing super dot Wheels is actually printing the value of wheels in vehicle class. So, let me show you a quick demo on this thing. So we Have a vehicle class which were in we are defining the default number of Wheels as for say for example, and now we have a bike class, which is overriding vehicle class. And what we are going to do here is we are going to change the value of number of Wheels. I have a method to print number of fields, which would give suppose I change your number of Wheels to say to so here we print number of Wheels first and I would have one more print statement which would be printing super DOT number of Wheels within a by class. We have a print number of bills method first. We are changing the number of Wheels to 2 and then we are printing the number of wheels for bike and number of wheels on the superclass. All right, and by default we have set the number of wheels in the vehicle class to before so we have a bike class now I remove this to so now I print the number of Wheels. So I create the instance of bike and I invoke print number of Wheels. Now you could see that first it would print to and on super dot. Basically. This is what it's going to call so first it will print to so basically here we need to have one more teacher number of fields when it comes to instance variables. It's not overridden as such so I have like number of Wheels defined here again and here I change number of Wheels to to so let me run it again. So when it comes to instance variable when you define one more field here of the same name, it's not overriding it. It's rather creating a new instance variable. So now you could see that when you print number of Wheels it's printing out to which is nothing but the value here value of this instance variable. Whereas when you do super DOT number of Wheels, you have a default value of 4 here which is been printed out. So on super it gives a call to superclass. So here you are creating. It's at the Constructor level. And we can see that so it's more about as I mentioned within your Constructor. The first thing that is called when you create an instance is a super Constructor is called first and then your sub class Constructor or I mean to say is when you create instance of car. So your first thing that would be called is the Constructor of vehicle and it would do all the initialization that's required in vehicle. And then it would call the cars Constructor. So what I mean to say is for example, I create a Constructor here and I print saying that we are within Constructor of fecal of superclass vehicle. Now we have this car class and say we have Constructor for car class as well. Remember we said that there's a default Constructor implicit Constructor that's already been put by GBM itself. You don't have to take care about it. So I don't do anything here. So basically you need not create you do. Right Constructor jvm by default right Constructor, unless you want to write something or you want to initialize something. That's when you would write explicitly you would write Constructor. But in this case since we are not initializing anything as such I won't put a Constructor car. What I'm trying to say is we are creating an instance of car here. And let's see when we create the instance of car. There is a super Constructor that's been called. That's what I wanted to show. So that's why we created a Constructor here for vehicle. This is not a method. This is constructed by the way, since it has got the same name as your class and it doesn't have any written value. So so I have printed it out saying that we are in the Constructor when we call this now when we create the instance of car you could see that this Constructor of superclass that's vehicle that's been called. So this is done implicitly by compiler. You don't have to care about it. So here you could see whenever you create the instance of car you would see that we are in construction. Of superclass vehicle and the second print statement that you see is directly for the vehicle sensation. So even for car you could see so this will get rid of confusion. So there's only one instance of car being created and we can see that it is calling vehicle Constructor and it's implicitly put we don't have to explicitly put it jvm by itself operates that way and how it calls is nothing but by Super Final keyword we again touch based on this one earlier in the session. Number one final keyword is non access modifier applicable only to variable method or a class when it's applied to a variable. We say that the variable content cannot be changed usually use final when you want to define a constant within your application. So that's final a method could be defined as final you define a method as final when you say that your subclass cannot overwrite it that's when you define it as final you define a class. As final when you say that there cannot be any subclass of that class. So you cannot subclass it like if you try to extend on a final class you would get an error compile time error saying that you cannot extend it. So just to show you maybe if I make this as final your car would show an error saying that you cannot inherit from final class. That's Comdata recorded pickle. So that's about final class. And if you make this method final you would again get an error in the class saying that you cannot overwrite this the car class you are trying to override the move method since its final it showing you an error saying that move cannot overwrite move in calm dot Ed u-- recorded vehicle overridden method is final. Let's remove this finer and you should see the error is gone. And also if you want to see at the instance level if you define this as for number of Wheels as for now within this vehicle, if you're trying to modify this number of Units to to it would throw you an error saying that cannot assign a value to final variable. All right, so that's what it does it. It's not access modifier, but it regulates it in a way that you can't change the value in case of variables you can change the value in terms of class. You can't subclass it or you cannot create a child class of a final class and in terms of methods, if you have final method you cannot override that particular method in your subclass. So final modifier can be applied to class method instance variable class variables local variable and Method parameters. So final variable is used to create constant variables when it comes to variable as I said, usually you use final variable when you want to have constants, right and it would be final static. By the way. If you have a constant usually final and static static final final methods is used to prevent method overriding in terms. Method the demo that I showed you previously we saw that we cannot override it in terms of class. When you have a final class, you won't be able to create subclass of it which we saw. All right, it gives you an error some examples of final clause in string class. So system class in Java dot Lang dot package is final as well string class that we have been using string class that's been exposed by or Java itself has or Java by itself defines it that class is final as well. If you try to extend string class, it would show you an error it would give you an error. So system is kind of putting a contract or Java by itself is putting a contract or is saying that cannot extend the string class. You cannot extend Its Behavior. You can't change anything any of the behavior within your string class by yo, that's why they have marked it as final if a method is declared as final then it cannot be overridden in your child class. If a Variable is declared as final then you cannot change the value of that particular class or cannot change the reference of that particular class when it comes to objects. So we will see that later a Constructor cannot be declared as final. So that's the rule you cannot declare the constructors final and blank final variable should be initialized in Constructor. So maybe in this case if you wouldn't have any value here, you declared this as final if you don't have any value here. It has to be assigned an Constructor right now. It's giving an error saying that it's not initialized if you mark it as for it should be gone. So it's mandatory that if you put instance variable as Final in class, it's mandatory that you assign some value in the Constructor. If you don't then compiler would throw an error so here you can't override it. So basically you have a final method void run and you have a sub class of vehicle and you're trying to override Run method, it shows you an error. So this is what we saw in case of was Final and when we try to override it in car we got an error and it's all compiled sign if you declare any class as final you cannot overwrite that class which we saw it gives you a compile-time error. So when it declared a vehicle as final and when you try to extend when you try to create car class, which extends vehicle class it gave you an error because vehicle class was fake lettuce final again. This is a compile time. Now what's Dynamic binding which is also known as runtime polymorphism is nothing but during runtime it decides which instance of which instance of a method should be called or which method should be called. So this is in case of again inheritance and when you override the method in your subclass, so we saw this earlier again to just to show you we had this move method here and in I have this move method and in automobile management, we did this thing we have a Mercedes that is assigned to vehicle class class reference rather vehicle class reference of reference named by vehicle 1 and in the second thing we have vehicle itself. So first one is pointing to an object of car, which is Mercedes and the second one is referring to the object of vehicle itself. So this is what dynamic polymorphism is all about. The first one gives a call to the move method in car the second one second one gives a call to the move method in vehicle. So yeah, you could see here. So move in car class and then it calls a moving vehicle class and it happens at run time. That's why it's runtime polymorphism. So abstraction is a mechanism of hiding the implementation details from the user and only providing the functionality of a user. So basically you could have abstraction. We're in on the first day. We spoke about the shape class and the circle class and Wrangle and square and stuff like that. Right? So basically shape is a class which is abstract class, which doesn't know all the functionality up front door. It doesn't have all the behavior of front. It doesn't know what would be the behavior of a circle class or it doesn't know. What is the behavior of a square class when I see Behavior. It's nothing but calculation of area calculation of area is nothing but it adds Behavior to the class and calculation of area in your Square class would be different calculation of area in your circle class would be different. So shape by itself doesn't know what the implementation of area method I would say. So that is what is attraction. There are two ways in which you could provide abstraction in Java one is by abstraction class, which is not hundred percent abstract, which could have like abstract methods like area in this case is about Track but there could be some methods which is same throughout or common throughout all the subclasses of shape say for example printing area. You just have to have a print statement which is printing area for a particular shape from the implementation per se it's same throughout all the classes area method would be something that is abstract. Whereas display area could be something that is not an abstract method. So in such cases wherein you have blend of abstract as well as non abstract methods, that's where you use abstract class. So it's not hundred percent abstract. Whereas in interface it has to be interface is something which says that it has to be a hundred percent abstract. So interface is altogether a new construct that we have in Java when it comes to abstract class abstract is just a modified to a class. So you write class and you just prepend it by abstract which makes that class and abstract class. Whereas interface is something that is a new construct that we are going to see in the coming. Slides upset class and Abstract methods so abstract method is as I said area would be abstract method in this case wherein you don't have a concrete implementation of area in your shape class. That's the scenario in such cases wherein you don't have a complete concrete implementation of a particular method you would declare it as abstract method and if you have an abstract method, if you have at least one abstract method in your class, you have to declare that class as abstract class or else compiler would throw an error. So whenever you have a abstract class, it means that there is at least one method within that particular class which is declared as abstract. So when you suppress this abstract class so shape for that matter when you subclass shape shape has got a area method which is abstract. Now when you subclass it when you create Circle, which is nothing but class Circle which extends shape now you are creating surplus of it. That case you have to ensure that you implement area. If you don't Implement area, it is still kept as abstract and you will have to make circle class as abstract as well. If you don't give the actual implementation. So an abstract method is a method that is declared without implementation any class that contains one or more abstract methods must be declared with abstract keyword and abstract class is a class that is declared with abstract keyword and abstract class may or may not have all abstract methods. So as I said, it's a mixture of abstract and on abstract methods and abstract class is mostly used for inheritance. So let me take the same example of shape and shapes. So we Define a shape which would have abstract area. This is what I was saying. So when you have at least one abstract method the compiler will throw an error. So in this case it is saying that you have abstract method but your class is not abstract. So we have to make this one as abstract. And as I said abstract class is nothing but a modifier you just have a modifier that you need to prepare into the class. This is abstract method and you say you have a method which is public void. It's not returning anything. We are just displaying area now rather than defining it here. Maybe I will put something like So we have a shift method and now I declare Circle method now, this circle method is extending shape now. It's throwing an error and it says you have to implement the abstract methods shape as got abstract method if you don't implement it as I mentioned earlier, if you don't implement it if you choose not to implement the area method then you will have to make this abstract. If you make this abstract error would go off. But in this case since we know the concrete implementation of area for Circle will have to implement it when I say we will have to implement it we say area and we override it. So for Simplicity reason, I'll just put some value here for now since we are talking about abstraction. I'll just keep it simple. So basically what we are trying to do here is we have implemented area which would be nothing but your Pi R square actually, so here we have a shape class and we are overriding the idea method here. And this is how you abstract it. When you run it, so basically you could have something like suppose I create a shape utility class. So this is pretty much like overriding methods. So you could have a shape class shape circle is equal to New Circle and you could call Circle dot area. So basically what you would get is nothing but a float value, which is your area area of let me put it this way area of circle when I want to print it. What I would do is circle dot display area and I print area of circle what we have seen here is there was abstract method area which was implemented in your subclass that Circle and when I give a call to it and here you could see that again similar to vehicles that we spoke about instance of circle is being assigned to shape and when you give a call to it you could see that method on circle is being called and not on shape because shape by itself doesn't have any implementation of area. So one thing to note here is when you have Class. So here you could see this value being printed operate abstract class would have one or more abstract methods for sure. And when you subclass it, you have to ensure that you give implementation of your abstract methods. If you choose not to implemented, then you will have to make the subclass as abstract as well. So execution of abstract method. This is very much similar to normal exhibition that we have. So the main method you have instance of mobile class created this case then there's a default Constructor of mobile class gets created gets executed. So pretty much similar to normal execution when you create an instance of Nokia, which is subclass of mobile. As I said the first statement that you have the Constructor of subclass is nothing but super or it calls the super Constructor. So here we can see that the default Constructor for super is being called when you try to instantiate Nokia as we are running run method, but in Mobile class run is an abstract method so run method from Nokia class gets executed similar to the example that we saw so shape area class area method on Circle got executed and not on shape. What is the encapsulation that encap solution is the methodology of binding code and data together into a single unit. So basically everything it's a encapsulation. It's put as one so you could imagine class being put as one right classes called this for that matter. You see everything been encapsulated as one right you group these together you group this integer and long which is a property of vehicle and it has got some Behavior as through this move. It's all encapsulated as one or it's all put together as one entity that is nothing but encapsulation. So basically you could imagine a capsule right which has got multiple ingredients which has multiple made sense or chemical components which are put together into one capsule and you have you think capsule has one mixing but it's basically combination of chemical components Within Thing is for encapsulation. There is access modifier comes into picture you have this access modifiers or private and you have public you have protected you have default this access modifiers restrict or it restricts the visibility of regular component of a class say method or variable or anything. So that's encapsulation feature of object-oriented programming. You can't see everything. It's not that everything is open for everyone. So you can have restriction you have different levels of restriction when it comes to visibility of this components that is a part of encapsulation as well. So to achieve encapsulation in Java declare the variables as private usually the best practices not to expose everything because once you expose something as public or once you expose it for the application to access you have to ensure that you maintain it right because anyone can access it. So your class is becoming much more fragile a I won't talk about this topics right now because fragile D is something that is related to code quality or coupling we say so I don't want to touch on that. But basically the best practice is to have less visibility restrict visibility or different visibility as much as possible. Try to make it as much less as possible make it private. Basically if you could make all the variables as private it would be good thing. So basically all non private or public variables are liability for application. So it increases the maintenance of the application and it's easy to break that way if you make some changes to a class it becomes very difficult the future to maintain it. So usually the general practice is to keep the methods variables as private not methods variables as private and we have Getters and Setters method which exposes which are public methods or mutator methods which would expose this variable to the outside world through public. So usually we don't have Setter methods. We restrict Setter methods again. Usually you have a private since variable and you have a getter method which is a public method which is nothing but Returns the value of the instance variable to the outside world. So data hiding the user will have no idea about the inner implementation of the class. What are the advantages of data hiding user need not know the core implementation of the class. It increases flexibility. We can make variables and methods read only and right only as per the requirement. So imagine if you didn't have all this access modifiers, there's only one that is public which is exposed to everyone so it would create a Havoc. So this is basically based on your requirements. You could have different patterns of this access modifiers used within the application. It makes testing easy. So basically Hotpoint is reuse ability easy to reuse and easy to change with the new requirement. So with reusability, even the maintainability of the particular application is improved when you have this encapsulation and easy to reuse in the sense if imagine The way around where in you have only private methods so a class could access only the instance variables within a class nothing from outside world. It cannot be accessed from outside as well. Imagine such a scenario right in that case. You would have a lot of code redundancy right everywhere. You would write the same code. It might be the same thing. We have already implemented in some other class, but you will have to re-implement it since it's not accessible outside the class. So that's how encapsulation increases the reusability of who and it makes testing easier. Of course. So here you could see that employ one. So this is the encapsulation mutator method that I was talking about. So basically you have employee one which has got string name, which is private you could see here. It's defined as private when I say private this name property would be used only within this class. If you try to access it from outside class you would get an error but there might be scenarios in which you want to Says this name from outside class you want to understand what its value is in that case. You would have something like this right? You would have getter method get name, which is nothing but it's written type is string which is the data type for name and it's returning the name. Now one thing to observe here is this is public. This one was Private name was private but get name is public which means it could be accessed from outside as well. Similarly. You could have Setters which is not a good practice. By the way, you shouldn't have Setter methods. So again Setter is something like you pass the value that you want to set this particular name variable. So basically you are saying that whatever you send through this method is going to set to the name variable. So we are referred to this particular example in Maine. So you create an instance of employee one who have edad set name you're sitting at well X and when you access it you do e dot get name. So basically what we are trying to say here is a demo end caps is a Glass it's not the same class. So you have employee one and you have demo end caps as a different class though. It's a different class till you are able to access your name employee name from this class. This is again, a private instance variable you are able to do this just because you have this Getters and Setters, let understand interfaces interfaces are nothing but could imagine interface as a blueprint or it is something that it's a specification rather, right and interface could be thought of as a specification. This is how it should be. So basically it could be a company manufacturing bottles or remote rate. It would say that this is how it should be basically there should be so-and-so buttons. There should be this button should be here. This button should be there and something of that sort. So basically through interphase what we do is we specify the contract we say that this is how it should be now. For example, you could have specification mentioned in a piece of paper. This is how Remote should be and there could be different vendors for this remote who would be actual manufacturing remote and which would be aligned to this particular remote specifications. Then you could check that. Okay, so and so specifications are met which means that this this particular thing could be used as a remote. So basically these are nothing but the specifications for the system so through interphase you say that this is how it should be and you would have different vendors or you would have different implementations that align to the specifications and if they match up to the specification, it means that it's a correct one. So hence an interface contains all the specifications and can be used for creating a new remote. So all you see here, there's a joystick this AC remote this TV remote and everything. It has got different things but there's something in common and that's what you specify through interface and interface contains variables and methods but the methods declared inside interface or by default abstract methods. As we saw in the earlier slide interface is hundred percent abstract. So all the methods that you have within interface is abstract and interface is used to achieve abstraction. It is used to achieve loose coupling when I say loose coupling. It's like you are not binding everything into a class. Basically you say that fits a remote. It has to have this features, right? So basically your kind of decoupling it or you can see that all the implementations of remote will have so-and-so specifications, which is been introduced by interface also in Java, you cannot have multiple inheritance. You cannot have a class which extends multiple classes cannot have car which extends vehicle and which extends the for example locomotive locomotive is one of the classes if for example, so, you cannot have a class which extends to classes that is multiple inheritance. Do you could have levels and you could have hierarchical inheritance, but you cannot have multiple inheritance. But through interfaces you can have multiple inheritance you could parlament multiple interfaces, but not multiple classes again, since this is inheritance interface is hundred percent abstract class. And basically you create sub classes from or you implement an interface is nothing but it follows he's a relationship. So what's the difference between interface and a class and interface can never be instantiated just to give you an example, I'll show you what interface is. So instead of this class. I will make this interface. So this is how we Define an interface we Define interface, but as I said, the interface is hundred percent abstract. Everything has to be attract. You cannot have methods something of this sort. You cannot have a concrete implementation of method though. You could have a default method which we would be looking at in the in the slides to come but at this point, let's imagine that you have a ship class and whatever methods you have you declared within your ship class has to be Track a by default. It is abstract. You did not even mention it by default jvm puts it has abstract. Even if you mention it abstract, it's not a problem. It is abstract. So now when I unlike extends that we do on glass or for the face you implement it so you implement shape class. So you'll have to make it public by default the access modifier for a method the face is public. So here you can see that we have implemented it we could see that it has a hundred percent abstract. So with this you could see most of this differences being listed here and interface should contain abstract methods, which we saw class can contain only concrete methods. We are talking about normal class here not the abstract class. The members of the interface are always public which we again saw when I didn't implement this one as public Circle it gave me an error. So by default it is public the members of the class can be private public or protected and interface can I have a Constructor since we are not creating instance. The first point you can see that interface is cannot be instantiated since we cannot instantiate interface. There's no need of Constructor a class can have constructed to initialize the variables which we met yesterday implements keyword is used for inheritance and whereas in terms of class, we have extends which we saw now right for interfaces you we changed it to implements rather than exchange after extends keyword. Any number of interfaces can be given this is multiple inheritance that we spoke about whereas after extends you can have only one and only one class. You cannot have multiple classes cannot contain instance Fields. The only field that can appear in our interface must be declared both static and final can contain instance Fields. So only the constants would be declared when your interfaces whereas with in class. You can have all levels of all the instance variables. Classes have implementation whereas this is between class and abstract class. So classes have implementation abstract classes have no implementations or they can have implementation as well. So it's a mixture of abstract methods and non abstract methods as we saw. So abstract class is not hundred percent abstract right unlike interfaces. You could have concrete implementation as well concrete classes are instantiated to create object abstract classes cannot be instantiated similar to interfaces abstract classes cannot be instantiated a concrete class can be final and abstract class can never be final as it has no defined functions for abstract class to be a complete. It has to be extended. That's what the focus is abstract class and interface is an abstract class can be extended with class using keyword extends and whereas interface can be implemented to a class using implements which we saw. Abstract class can extend only one class at a time and interface can extend number of interfaces at a time. So yeah, this is one thing we're in your interface can extend other interfaces, right and you could have multiple interfaces extended abstract class can have private default protected and public members and interface members are default or by default public in abstract class keyword abstract is mandatory to declare a method as an abstract method which we saw okay in interphase. It's not mandatory because by jvm by default put set abstract classes are to achieve zero to hundred percent of abstraction, which means that you could have some concrete implementation as well. Whereas interfaces or hundred percent abstract. You cannot have anything you cannot have any implementation within but you could have a default methods abstract class can have abstract and on abstract methods again here abstract class can have Constructors. Interface cannot have Constructors which we saw earlier abstract class can have abstract and non abstract methods since it's not a hundred percent abstract. Whereas interface can have only abstract methods by the way from java it as I said, there's a default method being introduced which is nothing but you could have a concrete implementation written within interface class interface relationship you have class which extends other class you have class which implements interface you have interface which can extend other interface if there's an interface already defined and you want to inherit some methods or you want to inherit the methods that you have within the other interface would do it using extends a class extends another class while implements an interface and interface extends another interface class cannot extend multiple classes, but can Implement multiple interfaces. So here you could see that this one class. Which is extending the class on the top and this one at the right side. It's time to extend it. If you try to extend multiple classes, it would give you a compile-time error. It won't allow you to inherit from multiple classes. Whereas in this case, you could see it's implementing multiple interfaces on the top. You could see one interface been implemented by this class and there's one more interface to the right which is being implemented by this class class cannot extend multiple classes, but it could Implement multiple interfaces which gives an opening for multiple inheritance when any interface gets compiled compiler automatically adds access modifiers to the members. So this is done by default its internal Edition. So here you could see interface demo which has got one variable that is int count is equal to 10 and it has got a method which is output now when this demo dot Java, which is an interface, which gets compiled you See that by default. It has put it as public static final so count 10 would be given access modifier public static final so four variables jvm by itself puts public static final and four methods it would put it as public abstract. So that is the reason when we had the area method when we try to override it it gave an error saying that it has to be public. So John went to a bank he wants to credit some money to his account. So let's see this one. So basically here you could see to implementation of it you have money interface and you have operation as its method. So now you could see two implementations of it one is debit and the other one is credited with in debit. We are just saying that we are writing a dummy statement. They're saying that we are debating money from this account whereas credit is nothing. But again, we are printing saying that we are crediting money to this account. So now when you create instance of money or you create in It's off credit and assign it to money and money dot operation. You would have operation method on credit being called in this example. We can see that there's a shape interface which has abstract area and there's a circle which returns this value right and say I declare one more class which is square which implements shape and its again three main error saying that you will have to declare it. You will have to implement the method so I will read this and say I written some dummy value like hundred you have a square and said Circle say circle area. We are just hard coding it right now. We don't have to implement it. So it gives you two hundred. It's returning 200 as float. And this one is returning hundred. So what we can do here is we have this shape utility. So here we have this thing called on Circle. So I will just print it out here saying And now I have one more say for example, I create one more shape which is square nothing but Nu Square now what we are doing is we are going to print out where dot area so instead of assigning to a variable you could do it this way as well area of a square. What we did is we have interface shape and we have a area method which is abstract. We have two concrete implementations of it Circle and square and we are instantiated circle and square here and we are calling area method on it. By the way, you could see here that this is dynamic polymorphism Circle and square is been assigned to the shape reference. It's not directly to the circle. You would see hundred and two hundred mean printer know so Circle was 200 and square was hundred and you could see two hundred and hundred so it's basically Dynamic polymorphisms followed in interface as well. You could extend an interface with another interface. So suppose you have one more Switch is for now just too. So I create an interface test interface which has like test method. So you have a test interface which has void test and you could have shape which is extending test interface. Now your circle and your Square would give an error because there is one more method that you need to implement. If you don't implement it you will have to either make this abstract. If you make it abstract, it should go off but in this case suppose we want to implement it then you will have to ensure that you implement test method as well once implemented the error should be gone similarly in square. You will have to find it. So that's what is extending one interface with another right? So basically here you could see there's walkable. There's a runnable and when you do it when you implement runnable, you will have to ensure that you implement Walk and Run both the methods. It's a class extending one class and implementing more than one interface. There's two interfaces Walk and Run so you could see animal which implements walk and So then it will have to implement both the methods Walk and Run whereas there's a human glass which extends animal. So this is basically there's a class which is implementing multiple interfaces and which has to ensure that it implements both the methods. So in this case walk and run it has to ensure that it implements Walk and Run and this one class which is extending from this particular class and you could see here that you could assign human which is extending which is a subclass of animal we could see that human could be assigned to walk and run as well since it is implemented from there. So you could have H 1 dot walk and H 2 dot run sort of you have given a call to this methods. So basically this is again if you understand the idea of runtime polymorphism or dynamic polymorphism, which is nothing but assigning the instance of subclass to superclass you should get idea of me. All this thing we are pretty much talking the same thing all this is talking about Dynamic polymorphism. If you get that thing, right you have good enough. So we are talking about default method right since Java it you could have default implementation within your interface. You could say that you cannot have a concrete method but you could have if you put a concrete methods something like this, it would give you an error. Okay, it gives you an error saying that it's not allowed but you could have it as default. Once you define is default. It's good enough. So all this methods are all these classes circle square and all these classes would get would inherit this they can't override it. They can't do anything with it, but they would inherit this we can give a call though, but he can't override it. So basically I'll just show it here. So basically you have default method which is say say and which is printing out. Hello. Welcome to edu Rekha, right and you can see here. Flash interface demo, which is implementing welcome and you could see here. Hello bean concrete implementation of L, which is nothing but it's printing out the message that is passed to the hello method so though default class interface demo doesn't declare say method it inherits from welcome. When you do out dot say you could see the default method being invoked here. We could see that you know, hello welcome to edu Drake has been printed out which is nothing but the output of default method so basically default methods are not but method which cannot be overridden but is available for all the classes that implements a particular interface or implements that interface so rules for using private methods in interfaces following all the rules for using private methods in interfaces private interface method cannot be abstract private method can be used only inside interface private static method can be called from other static. Non-static interface methods private non static methods cannot be called from private static methods. This might look confusing at this point, but you could think that first of all private interface method cannot be abstract because we want it to be implemented in some other implementation, right? We cannot keep it private since interface by itself doesn't have the implementation of it. You want to implement that method in some other class. So it cannot be private private method can be used only inside interface. So if we Define a private method within an interface, it can be used only within the interface. So basically you could have a default method which is private, right? So basically default method itself cannot be private but within default method, so what I am trying to say is so here you could have private void which is doing nothing but here your default method would call this private method. So private method can only be used within the interface and it's usually used 24 get private static method can be called from other static. This is pretty much similar to other classes normal classes private non static methods cannot be called from private static methods. This is a common rule that we have private non static methods cannot be called from private static method. So if you have a static method within the static method, you cannot call a non static method. Remember we mentioned it earlier unless we create the instance of it. We can't call it. But in this case you cannot call it at all. So it's not on a class you're invoking it basically within an interface. So private methods is specifically you could call Private methods from within your default method in interface and since private methods are not accessible from outside. That's the only reason you could have private method near interface static methods in an interface. So you could have something like this where in you have interface one and you have a static method display? You remember static methods are more of a class level method, right? You need not have to create instance of a class to invoke a static method if an interface has a static method you could call it directly by interface dot the name of the interface does the name of the method so we can have a static method like static. So this method could be called so you could have something like this method and you could call it directly using the interface name. So we have this so now within shape utility you could wreck akahl, like as you could see here, you could call the static method directly by the name of the interface. You cannot have normal methods within it unless it's a default one interface features four different jdk version. So interface has evolved throughout the versions of JD case. So just to brief on that. We have jdk 121 .7 having normal interfaces with constant static variables as we said the variables that you would have in a The freezer typically constants which is public static final and with abstract methods, of course in Java 8 it evolved and we have a default method as I said, there would be one default method which would be inherited by all the interfaces extending that interface and you have static methods as well, which was not there earlier in Java 9 and later versions. So in Industry right now, it's mostly Java 8 that's been used across very few have gone to Java 9 all the big data Frameworks and everything we have is supporting Java it at this point. So with the latest version that's Java 9 and above we have static constant static variables abstract methods default method static methods and they have come up with this two methods which are nothing but private methods and private static method, which was not there earlier. Now you could have this things as well. It makes very little sense to have all this scope variables, but maybe they might Have or something as a part of evolution, but at this point, I believe since this private methods cannot be called from outside it just that you have control over the default method. So basically maybe if you have a big logic to be written within your default method just to modularize it just to break it into multiple methods not to have one monolith big function or big method you could have this private methods. That's what I can think. What is the package we have been using package since day one. So package is nothing but it's a namespace it's for avoiding Collision. So basically I could write a name class with name shape and maybe someone else within my team would write the same thing. Right? So basically at the end when we archive it together like we have a jar file, which is Java archive when we archive this files together there is going to be named Collision, right? You wouldn't know which shape class. Are you referring to? So basically namespace is nothing but it adds. Stewart and it avoids Collision classes in the same package can access each other's members. So basically you can have within a package. So we'll talk about the import statements that will give you a clearer understanding of what we are talking about. But basically within a package as you could see here, we have not done anything to refer any of these classes. So it's within a package we have calmed said Eureka and we have all these classes within this package so you could see that employ or maybe manager which is a different class in the same package. We are accessing it directly. We are not doing anything different for it. But when you want to access it from a different package you have to do something else which is nothing but importing the package the normal living convention is usually domain name here. You could see we wenshan calm down at Eureka. So it's usually something of that sort dorji dot example dot hyphenated name. It has to be lower case usually written in lower case companies use their reversed. Net domain name to begin their package names. So basically if you have my package or example.com, you would have it in reverse order. This is typically a one of the best practices of practices that's been followed across industry to define the package but it doesn't have any constraints from the Java side as such you could do anything. So for example, if I make it uppercase, so basically it's saying that it's not showing error because of its in uppercase, but basically you don't have a directory starting with uppercase Aspire Java or from the Java side. You don't have any constraints. For example, I could do something like So basically it does convert it into lower case, even if you give uppercase. I don't know whether this is a feature in IntelliJ IDE, or it is of course it has to do something with the ID because Heidi is converting it into lower case as far as the Java naming convention is concerned. This is what we do but it doesn't have constraint Java predefined packages. So Java itself has many packages. So you could imagine the entire language been written in Java source code. So basically all this you would find in the source code when we refer to the string when we refer to string string is a class which resides in Java dot Lang. There is Java dot language is nothing but Java dot language. So string is something that resides in Java dot Lang object is a class which is a super class for all the classes. So, you know, what super classes are after we went through the inheritance thing. So you have super class and you have subclasses. So the superclass All the classes no matter what class you use with in Java. All the classes are inherited from a class called object. There is a class object in Java from which all the classes have inherited from our all the class inherit from this particular class thread is used for multi-threading. Java dot length of thread is used for multi-threading multi-threading is nothing but 2 lightweight processes in order to leverage the potential of your processors. So if you have multi-core, then you could have multiple operations happening at the same instance of time. That's what thread is all for you make it faster you have exception class you have system class Java dot language system. This package is used to achieve the language functionality such as conversion of data from string to fundamental data display the output on the console and many more the package is quoted by default. So you don't have to specifically explicitly import. This particular package is by default voted into your application Java dot util. This is like utility classes you have Elections and stuff like that into your Java dot util this package is used for developing quality or reliable applications in Java or J2 ee this package contains various classes and interfaces which improves the performance of j2me application. So basically these are utility classes. It does something in terms of performance or does some conversions or something of that sort. Java dot IO is a package which contains something like file input stream file output stream and stuff like that, which is basically for interacting with your files with your I/O. So basically if you want to load something into your memory, if you want to read something from your file or write something go file in your local directory, you would use something like Java dot IO package if you want to do some kind of socket networking or some kind of network programming you would use java.net which has something like socket datagrampacket datagram socket Etc. We have applet tablet is nothing but application that gets loaded into your browser. It's not you. So as of now earlier it is to be used but now there are a lot of other technologies that have come up but this is something like an applet is a Java program which runs in the context of w WR world wide web for browser. You have Java dot e WT which is like event-driven like you could have UI applications. If you click on your checkbox or button there would be even triggered and you would have an event handler handling it if you click on a mouse or something you would have a even triggered. So basically all these classes are grouped into this package, which is Java dot AWD so you could see the Java dot w dot even which has like Mouse listener. This is specific to event without this classes. It is impossible to handle events generated by G UI components. So as far as the front end is concerned as far as all this a WTF that is concerned. It's not in use basically. Java is much more useful in terms of back and program which means you take data and Do something with your data and stuff like that, but it's not well suited for UI applications and it's not used to that extent in Market or industry. You have Java dot SQL which is nothing but your database related stuff. So we want to connect to your post gray or if you want to connect to Oracle. You have all the stuff written in Java dot SQL. So mostly in Java data skill, you have interfaces and this interfaces as I said, it's nothing but specifications and this specifications are implemented by database vendors. So it's nothing but interface is just an abstract method it would have like four five abstract methods within so all this concrete implementation. Someone will have two women to use this interfaces or someone will have a class which will implement this interface has and we as developers can use those classes to interact with databases. So Wenders like Oracle will have its own set of implementation to the Patients that are mentioned in Java dot SQL as I said most of the thing in Java dot SQL or interfaces. So about the access modifier. We have spoken earlier. We have public we have protected private and default modifier public is nothing but it could be accessed from anywhere within your application. So you could have your methods as public you could have your class as public you could have your instance variables as public which means that particular method could be accessed from anywhere within your application. You could have protected modifier protected modifier is nothing but your subclass is can access it and your current package whatever the package in which a particular method or particular class resides in which you have protected method. You could access it from that class or any class from that particular package access the protected methods defined within a class that package so I will give you an example since we have spoken about inheritance now, so I will give you a demo on protected private. Modifier is basically it's private. It's within a class. You cannot access it from outside. If you try to access it, you would get a compile time error saying that it's not visible default modifier is package is public within package So within package any class can access it. So basically it's like protected right protected can be accessed within the package plus it has like if a sub classes are outside the package, even though subclasses can access it whereas in default. It's just within the package. So protected has wider scope then default modifier. This is kind of public so public has almost like everything so why didn't scope then comes protected then comes default and then comes private so access modifiers public word Republic. So when you have Public Access modifier within a class in this case, you have two packages. Are you Ricardo back one and a new record out back to and you have some public members within your class one, which we can see here that all this public. Members could be accessed by Class 2 class 3, which is there in the same package as class 1 that is at Eureka dot Pack 1. So now there are two classes in a do record back to one is a class which doesn't have any relationship with glass one but still it can access it though. It's there in a different package. But still it can access the public members of class one. You can see class for which is a child of last one since it extends class one, but it's there in a different package but still it can access the public members of class 1 so protected protected is nothing but it could be accessed within the package in which the class is defined and it could be accessed by members that are outside the package but child of that particular class. So in this case we can see that there are few protected members in class one which could be accessed by Class 2 and class 3 since they are in the same package as class 1 plus 3 and class two are defined in Eddie cannot pack 1 we have class 5 Is not related to class 1 which means it's not a subclass or it doesn't have any relationship with class 1 in that case class 5 cannot access any protected members within class 1. So here we have class for which extends class 1 which is nothing but plus 4 is a subclass of class 1 which is there in a different package at your record back to but it can access the protected members of class one since it is there in a different package private member is nothing but it can be accessed just within the class in which it is Define. So in this case you could see that this is private members. So you have class one which has got private members and you can see that class to contacts is it class three contacts? Is it either class 4 or plus 5 no one can access it. It's just that class one can access private members. So we have seen this in examples that we took in session one default package. So default package is nothing but only within the package in which it is defined. It so in this case you have class one which has got default members with default scope and you can see that class 2 and class 3 can access it but not class 4 and Class 5 since they are out of this package since Class 2 and class 3 are defined in the same package as class 1 that is a deal-breaker DOT back one. That's the reason you could access from there. This is same for attribute or method. There's a table here, which is summarizing whatever we discussed so far you have modified public. So yeah, it's within the class. Yes. It's within the package. Yes, if it's within the subclass. Yes and within the world days so everywhere it could be accessed right? That's why you have public protected is within the class. Yes, within packages within subclass. Yes, but not within world. So just within package and subclass, but if you have different package or if you have different package, but it's not a subclass. Then you can't access it. No modifier, which is a default scope within the classes within the Yes, but we saw that it cannot be accessed within the subclass if the subclass is in a different package when we save world world is nothing but any package and they are not related in this case the previous example that we should saw last five is something that could be thought of as laws that are unrelated. But reside in a different package private is just within the class you can see that it's not with package within the package. It's not within the subclass. It's not within the world. So I think we have spoken about private public and default scope earlier. Let's start off with protected. So in the meanwhile when it starts, let's talk about this. So here we can see package demo which shows public it has got a public method that is message. There are three ways to access the package from outside. So let me talk about how we actually recorded. So there are three ways to access the package from outside. The package one is with import this case like you had a direct a 1 and enter a car to right there. Sample that we saw earlier. I do record Pack 1 and add you taken right back to these are the two packages you have if you want to access something you want to access class 3 from class 5 you would have to import a new record Pac-12 class 3, since it is outside the package of back one if it's within the package so far the examples that we were taking was all within the same package, so we didn't have to import it now. I will just show you an example wherein you would have something that is outside the package and I will show you how to access it. So we have to import it. So whenever you have it in different package, then you have to input that particular package within one thing is importing the entire package. The other one is importing a particular class. So in this case you have a package demo, and we can see that within package demo. There's a pack demo, which is nothing but a class defined within it. So, let's see how to access package from another package you have a Demo here that's a class that is defined within the package demo as you could see here. There is one method which is MSG and which is taking two parameters as input TJ Ryan integer J. So what are the ways in which you could access this particular class that is packed demo from outside the package. So the first thing that you could do is you could import the entire package itself. So demo dot star or demo dot asterisk as you could see here, which says that all the classes within this particular package can be accessed from this particular class. So you have a package demo class defined here, which says import demo dot star and which would input everything all the classes within demo. So in this case back the more you could see that pack demo class could be accessed from within package demo class that's there in different package. So basically this package demo class that you see here is defined in some other package other thing is See if you want to import just a class and not the entire package. You could do that thing as well. So here what we are doing is import demo dot pack demo. So we are importing a specific class and not the entire package that could be done as well. And the third one is instead of importing you can do one thing you can have fully qualified path name or fully qualified name like demo dot pack demo. That's your class name. You can access it within your class. So basically you would use the fully qualified name who might use it. You did not do it, but you might use it in case where you're just using it once within your class, but you would go with this options demo dot pack demo or demo dot star in which you class has multiple is referring to the class in different package multiple times. So in that case, you just do it once and could be used within your class. You need not do it again and again, so I create a new class which is Calm down at Eureka new DOT. So I created a new package. So there is one that is calm down Eddie Rekha, and the other one that is calm dot ed u de canoe this are different packages you have if you want to use something within this package Comdata Rekha suppose I want to use Vehicles, right? So this is what I was talking about. When you try to access it. You can't do it you can access vehicle from here because it's there in a different package. Now you are not able to access it because you haven't imported it. So what I do here is import calm dot Ed u-- Rica dot vehicle once I do this I am able to access it now. Now what I was saying is if you are accessing multiple classes from multiple classes within the package like car also you are accessing so instead of writing it like this. So what you would do is calm down at Eureka the car now the compilation error has gone. So basically instead of doing this like instead of writing. Multiple times the other option that we have is like calm down at Eureka dot star. So now if I get rid of this 2 inputs still it would work. I don't need these two inputs because we have putted all the classes within the package. So it's able to access both the classes vehicles and Ed Eureka from calm dotted Eureka. The other one was you could get rid of this now it's showing up error. What you could do is calm down Eureka dot vehicle. You could access it directly with the fully qualified name so you can see the error has gone. So these are the three ways in which you could access different packages or access classes from different packages. Now, let's understand. What is the regular expression so regular expression pretty much similar to other languages that you have regular expression is nothing but an expression through which you could extract some sequence of characters from your string or you could check whether a specific Fake regular expression or whether a string is aligned to a particular regular expression. So you could Define a regular expression saying that if for example email ID, right one of the use cases of regular Expressions could be like you have email IDs and you might have seen on websites where in you do some kind of registration or something and if you don't give a proper syntactic 1 then what it would do is it would give you an error at the red gmail.com. If you don't give that it would throw you an error showing that it's not proper. So it's not checking against the Gmail server to see whether your email ID is proper or not. So it is just checking syntactically. You might have seen it. So if you give a wrong syntactic email ID and if you go to the next tab, if you tap to the next column or to the next space what it would show is you haven't entered it correctly. So basically what it's doing is its checking it against a regular expression. It has got a regular expression saying that This is how an email ID could be it should end with so-and-so characters. It should be at the rate. It should have at the rate. It should have Gmail or it should have some characters in between then add followed by.com or something of that sort. So basically to have this syntactic this thing done just to ensure that you have given it properly you have a regular expression. So yeah, one of the use cases could be to have this pattern Checker usually to see if you're giving value which aligns to what is expected. So maybe other thing could be if you're typing something or if you have been asked to put some amount and if you type characters there it would give you an error saying that it's not allowed those type of checks could be done through regular expression or if you want some value to start with a particular character and end with a particular character. You can check it against a regular expression regular expression is a pattern used for searching and manipulating strings. It could be used for manipulating strings as well. So one of the use cases is Ching and the other one is for manipulating the regular expression either matches the text or fields to match. So basically it would validate and say whether it's a match or it's feeling so we call regular expression as Rex which is nothing but abbreviation for regular expression. So Java supports regular expression, and these are the pluses that we have with in Java, which is in Java dot util package. So remember we spoke about Java dot util package which has got utility classes. So these are among them. So here you can see a pattern class you have mature class and you have patterns in tax and tax exception. So basically if you have some exception if it's not proper, then you would get some exception as well. So we would be taking an example clarify what this is all about. So here are some matching patterns used in regular expression. So it just about to read through it. So you have like ABC It means it has to exactly match ABC if the string that you are matching it against has the content ABC it would match when you put it into square bracket, which is any letter a b or c should match any character. And again if there's a negation if within the square bracket, if you have this negation Mark, which says that any character except these three characters should be matched. So if you put D it will match the second case if you put a or b or c it will match and here it would be from D to Z. If you put anything it will match not just alphabets. It could be anything any character A to Z. So when you say A to Z, it says that we are giving a sequence of it, right? So we are saying from a it's a range basically so it understands range as well. So when you say a - Z which means that it is from A to Z here we are saying that any one letter or digit. Ben sequence so basically you could have uppercase and lowercase as well. Basically it is saying it should be in sequence. It should end with basically digit at the N dot is some kind of a wild-card character saying that any one character except line Terminator must be in sequence. This one indicates beginning of line. So we say that line should begin with so and so you could put some character here and we can say that if a line begins when Sue and Sue character sequence or whatever regular expression that we have put in then the entire line matches. The other one is end of the line with check if any character present at the end of the line other thing is word boundary. We have an example about this so which would give you a clear idea about it, but it's more about it cannot be part of a word here when we put slash B to the front and the end or to the start and the end of a particular character sequence, which means that it has to be separate word, but it I'd be part of some other word /b to verify that any character is not present at the word boundary /g to check that the character is present at the end of the previous match metacharacters. So we have /t instead of writing 029. You could use metacharacters. /d to define DJ when you want to Define on digit which is like you can see here negation of 029 set, which is non digit which could be like alphabets peace or anything which could be grouped as /t / s is a whitespace character who space tabs and stuff like that could be enter for that matter is whitespace character /s is a non whitespace character which means the actual character rather than white space / W is a word character and / uppercase W is a non word character you have quantifiers, which is a quantifier defines how often an element can occur. So star, which means that zero or more times plus which means that it has to occur one or more times question mark is it could be no or just one time you could mention the number of times you want a particular sequence to occur, which could be put into your curly braces occurs X number of times x you could put a range within within your curly braces X comma Y which means that it should occur somewhere between X and Y. So it's a range you have asterisk question mark it tries to find the smallest match. This makes the regular expression stop at the first match. So as and when it finds the first match it would stop so we will have a quick demo on regular expression. So here before we start off we Define a pattern here. Basically, then you could see it is basically saying from A to Z and followed by character one or more character then we have a check here, which is nothing but a string again. Which we are going to check first. We compile the pattern. This is a regular expression pattern that you have you're going to check against. So the first thing that we have to do is we have to compile this pattern to see if it's properly done or not. So first thing is to compile it against patent and if it's correct up to the mark you would get the instance if it's wrong then there would be some kind of exception thrown then there is a matcher. So once you have the pattern you do pattern matcher and you provide the string against which you want to check in this case you have happy learning welcome to Eddie break is the string that spin past and when you do see dot find if this is fine, it would return the result true and if you remember the while construct it would get in only if this is true, so it's a loop so it would basically I trait through and you could see here that it's displaying all the characters. I'll quickly run this. Let's name the class has pattern Checker now, I write a main method now if Remember, we had a pattern there which was like a to z followed by actress. Then we have string against which you want to check or you could say simple string to check. So we just put this one. So once you have this string to check now, what we want to do is we want to compile this particular pattern. So what we do patten.com pile, so one thing to see here is that's the beauty of using the IntelliJ or Eclipse. So you could see here. This package is already been imported when you use it. Unless you have multiple classes with name patterns, it would ask you to specifically explicitly mention which one you opt for. But in this case there was just one pattern class. So it imported it automatically then we give the pattern here. So basically if this pattern is correct, if it's rightly formed syntactically you would get a pattern here or so. Pat and I believe we have a compiled pattern now now what we do is we take this compile pattern and I think we have matured here. We get the matcher. No so matcher would check again string. So you have a string to check which would give you matcher. So here it's asking me which mature do I want I'll select this one and you see this one getting in put it here. So this is what we have done. We have compiled the pattern and we have provided the argument against which we have to check as a part of nature. We get the instance of matcher. So everything is in terms of class. This is what object oriented programming is all about. You have a pattern which is a class. You have a method within pattern which is compiling your pattern. So this is what object oriented programming is all about. Everything is realized in terms of classes and objects. This is nothing but the object of pattern class company. So now what I do is matcher Dot Find I just print this one match her dot check. So basically what we are trying to do here is once the entire string passes through we are trying to get the substring out of it. So when we get the substring from matcher, you would get the string indexes begin index and you would get matched end as well. So when we run it, you should get a PP y n so the first character would be trimmed off so you could see first character being trained of each line. So I'm putting regular expression. We saw that Java dot util don't reg ex gets imported. Then you have patent then you have string to be checked against the pattern and the sentence which is to be matched are given A 2 Z means any character from A to Z and plus means one or more the sentence check is checked whether it matches the pattern or not the strings from the sentence which match the pattern are printed. So basically here we could see that Echizen uppercase and we don't have uppercase here. So that's the reason I dreamed of the first character. So basically if I add H hear you now eh would match as well and it won't cream H or it won't remove edge. You should be able to see H as well. So yeah, as you could see here you have H appearing as with previous case. It was getting primed of so this one is for the word boundary. As I said, if you want to have something like you want to be sure it's a separate word and it's not a part of any word you could put something like this. So basically what we can do here is so we can mention here something like special are we and then in so what we are trying to do here is you could see here. What we are saying is we want to separate word as in we don't want it to be a part of any other word. So here in learning do you have iin? It didn't pass it because it's word boundary whereas Just a separate word here. It just passed this one. So if and I remove this one you could have seen two ions. That's what I mean to say. So now what's exception exception handling is nothing but typically so here you could see two ions when it's / / be it would be just the ones that are complete word instead of matching the word boundary. Let's talk about what are exceptions and exception is an event which occurs during the execution of a program that disrupts the normal flow of the program instruction. So to give you an example yesterday, we spoke about arrays, right if array size is 5 and if you try to access something more than four like if array size is 5 which means that the index is range from 0 to 4, if you try to access something more than four like if you try to access Sixth Element within the array it would give you an error saying array index out of bounds or if a particular Their object is assigned null value. And if you're trying to access that method within that particular object, you would get null pointer exception since it's not instantiated as yet when you instantiate it that's when the object gets created. But if your reference is pointing to null and if you're trying to access something within that reference or a class you would get null pointer exception similarly you have like / 0 and stuff like that. It's basically something that is not expected or something that would disrupt the normal flow of program execution. When an exception occurs the jvm creates an exception object to identify the type of the exception that has occurred. So basically within itself, it would create it or the gold would create it so I can create my own custom exception tomorrow. If I am writing an application usually in applications. That's how we do. We write our own custom exceptions. I can Define my own exception as well if My application something is not working or something is not running as I would expect it to I would throw an exception so that within my application it properly logs or it properly prints out in my console saying that this is the exception that's been triggered due to so-and-so condition. So an exception is often referred to as runtime error. So here we can see divide by zero exception as an example. Now there are different types of exceptions first one being checked exception the other one being unchecked exception and the third one being error. So checked exception is something that happens in the compile time. What happens is when you have a checked exception when you are invoking some method, which is throwing a checked exception and okay. I don't want to get into the catch block as yet because we haven't covered it. So this is also called as compile-time exception. It means if a method is throwing a checked exception then it should handle the exception using the try Clash block. It should declare the exception using throws keyword. Otherwise, the program will give a compilation error whenever there's a checked exception that's been thrown out thrown out in the sense not at the runtime. There could be methods which is throwing an exception. So whenever there is a checked exception you have to ensure when you give a call to that particular method say there is a method X which is throwing some checked exception which is throwing some checked exception from your application. You are trying to access this method X when you try to access this method X you have to ensure that you are taking care of the checked exception that is thrown from X. If you don't take care of it, it would give you a compilation error when I say when you don't take care of it. How do you take care of exception? That would be the first question that would have come to your mind. So when I say you have to take care is nothing but you have to catch it. You have to handle that exception. So try and catch is a mechanism through Which you handle the exception. So what you would do is Method call or the call to X you would put it into a try block and the catch block. You would say that if this particular exception occurs execute this block of code, that is a Handler for exception X or checked exception that is thrown from method X. So basically you write a Handler for in the catch block saying that this is what I want to do when this exception occurs. Once you have that when your program runs even if the exception occurs, it won't stop at that point it would go and check whatever is written and whatever piece of code that you have written and it can continue from there on it's basically a decision made by the developer whether to carry from their own or whether you want to break it there whenever there's a checked exception you have to ensure that you handle it either handle it or you say that I'm not going to handle this. I am just going to throw this off from my method or throw this off from the Well, I'm executing this method X method X which we spoke about which is throwing checked exception. I can choose not to handle it and just to throw it off to the calling program wherever the execution initiated from. So if you don't do that, you would get a compilation error unchecked exception unlike checked exception. It's not mandatory that you catch it's not mandatory that you handle it. So runtime exception basically it could occur any time and it's not mandatory that you go and actually handle it. So even if you don't handle it jvm would be okay with it and it won't give you compile time error. So basically these are nothing but runtime exception so divide by 0 that we spoke about his nothing but a runtime exception it's not mandatory that you go and actually, you know handle it during the compile time. You can either handle it or you can leave it as is and during the runtime you would get an exception. So compiler doesn't check for the unchecked exception. It's done at the runtime now error. These are Conditions that are external to the application and that application usually cannot anticipate or recover from it. For example, if stack Overflow occurs and error will arise they are also ignored during the time of compilation. So even the error condition cannot be anticipated during the compilation time. It's done during runtime. Right? So one of the classic example is the stack Overflow, we're in see for example, you call the same methods like thousand times not thousand time is too less for the stack to get overflowed. But suppose you call it like million times you call same method right in that case. Remember when I said when you give a call to the method it goes to the call stack, right? We have a call stack. So it would push something it would push state of class or it would push the properties that's been passed as an argument the class or to the method to the stack. I treatable if you call it like million times, what would - you would get stack Overflow because basically everything would get into the stack and it would basically, you know, give you a memory or float or even memory for the Heap memory for that matter if you create lot of classes if you create a lot of instances of classes, you are Heap memory would get overflowed and you would get out of memory error. Those are classic examples of error. So what the hierarchy of exception in Java when it comes to classes you have a stable interface and then you have error and you have exception. So exception is further. It has got runtime exception. The other ones are the checked exceptions. So ioexception SQL exception. These are the checked exception. This has to be handled if there's a method which is throwing one of these checked exceptions. You have to ensure that when you give a call to such methods you handle it or you throw it from your method to the right side its runtime exception, so it need not be handled as I said. Divide by zero and stuff like that would be runtime exception even array index out of bounds and Class cast exception arithmetic exception. Then you have null pointer exception that we spoke about all these exceptions are unchecked exception and you need not actually handle it during compilation time. So why to use exceptions when we execute a given program will get an exception exception handling is performed in order to get the output. So basically, why do we handle exception is nothing but to get the program going rather than breaking it at that point use of exception handling process exceptions from program components handle exceptions in a uniform manner in large projects. So basically, why do we do it? So it's done basically to get the process going rather than stopping it at that point and you could handle it the way you want to that 's the reason you have this exception handlers give you a simple. Example suppose 29 by zero what I am trying to print here result after dividing 29 by zero. So basically when you run this, it's not showing up any compile time error. It's compiling fine. Now when I run it since it's a runtime exception it's compiling fine. But when I run it, let's see if it throws an exception. So as you could see here it throws arithmetic exception which is divided by 0 and this is happening at the runtime. That's why it's a runtime exception or unchecked exception when a runtime exception occurs program gets crashed and control comes out of the program as we saw here when we ran it. It didn't run this part of it. You could see that it broke out just right from here. So whenever there is an exception if you haven't handled it program control would come out from there exception handling is done to execute the program without getting an exception. So handling is done basically to handle the exception whenever the exception occurs do some action it. It's flexibility to the developer to handle it the way they want to and get it going mainly try catch and finally our keywords for exception handling. So we have a trike at as I said, there's a try block where in all the suspicious one or wherever the exception you think that there could be exception occurring could put it into a trike block and in the catch block, you would say that if a particular exception occurs, this is what I want to do. All right, that's the catch block. The finally block is nothing but no matter the exception is thrown or not. A finally block is going to execute at the end. So basically finally block is usually used to release resources, right when you deal with databases and stuff you create connections against database or you create some socket connections and stuff like that. When you do some socket programming finally would be a place where in once the execution of the method is done or execution of something is done you say that we can release these resources of rather than Still establishing the connection, right which picks up some of your resources CPU resources or which takes up memory. So basically it's to release of the memory exception handling. So let's talk about try try block is nothing but code that could generate so suspicious could as I said that could generate an error is written into the try block. So the cache block could be more about catching a specific exception and doing something with it. So you could opt out to just break at that point or do something with it say for example want to profile an application or you want to have some instrumentation set for the application to see how much time what are the exceptions that occurring during runtime, right if you want to see that may be a typical way in which it is done is you write all this exceptions into a database and we're in later could apply some analytics to see you know, what kind of Errors have occurred in the application you could see that later on so that one of those cases where a new Let Whenever there is a particular exception you put it into a database you make an entry in the database saying that this is the exception that was caught in so-and-so time. And you could later on have some analytics to see how it could be improved how the application could be improved. So finally block is nothing but with a successful or unsuccessful the block is going to get executed as I said, this is nothing but mostly it's used to release resources such as connections and stuff like that. Let's see a demo of how we can handle exceptions to give you an example of try catch us with this was this is a suspicious code which we are running. Maybe you could put this in to try catch block and save and there is any kind of arithmetic exception that occurs just printing It Out Printing any kind of rhythmatic. So what we are doing here is nothing but we are catching exception and we are printing it so everything is in terms of classes again see exception itself. A class so you could click on it control click and you could see it as a class. This is source code for arithmetic exception. So you could see extends runtime exception which means arithmetic expression is a runtime exception. So it's a subclass of runtime exception you could see super and everything being used here whatever we discussed about. So arithmetic exception is nothing but it's a Constructor right and you could see super been called here. So that's how you could get into exception and you could read through it to understand how the source code is being written that would give you a good idea about how flexible Java is it's very much when it comes to flexibility and when it comes to object-oriented Paradigm, it's very much cleanly followed code so you could go and actually see at the the way the programs are being written. If you remember when you'd we did 29 by 0 the program bro, it came right from there and it didn't execute the following code. Now we have Handled it. We are saying that whenever there is an arithmetic expression in this piece of code. That's here. We are saying that whenever there is an arithmetic exception. We are going to just print it and we are going to continue it. Don't stop at that point. So you could see here the program didn't break right it give you an opportunity for you to actually handle it and it didn't break it continued. So you could see this statements been executed as well. That's why you have this results. So we had printed here. So as a part of handling exception handling, what we did is we just printed out saying that what kind of exception had occurred. So exception dot get message that gave like divide by zero this divided by 0 that you see here is nothing but is printed out by this message. So it give you an opportunity to handle it and get the program running as is so try catch finally block. Basically. What I can do here is let me Define integer denominator is equal to So as I said finally block is going to execute no matter of pot is going to get executed. So I just print the message here saying I will say here. I'll put denominator when the denominator is 0 we would get exception and it would come to the exception block here or the catch block here and it would print it and then it would come to the finally block. So let me run this and see so as you could see here, it came to the exception Handler it caught arithmetic expression that is divided by 0 and then we printed out saying that printing the typical message or the actual exception that we got and it came to the finally block here. Let me put a scenario which is not going to throw exception in this case. My denominator is 1 which means 29 by one we shouldn't throw any exception. So what I want to show is still it would execute the finally block so you could see here 29 been printed out which this got executed successfully this time because the denominator is not 0 it's one it got successfully executed still the finally block is been executed why to use multiple Catch blocks so you could have multiple exceptions and you could write multiple catch blocks. There are different exceptions that we spoke about it could be like a pointer exception as well which you want to handle right? So it depends upon your program logic or what you are trying to do here. So there could be null pointer exception then you have finally so you have multiple catch blocks here. So you usually don't handle null pointer exception but this is just to give you an example. So basically you have this arithmetic exception here been handled then you have null pointer exception being handled here then you have finally so if you want to have different exceptions to be handled within your application, you could have multiple cache blocks since all the exceptions are derived from exception catch exception. He should be placed at the end. So basically if you put the exception this exception, right if you remember the hierarchy that we spoke about all the exceptions are derived out of exception class so you could have something of this sort. So if it is not an arithmetic expression not a null pointer exception then is of course going to be some kind of exception which is going to be handled in this exception block. So basically we are catching all the exceptions here first is specific to edit mattock exception. The second one is null pointer exception if it's not a null pointer exception or arithmetic exception then this particular cache block is bound to get executed and it has to be last you cannot place it first because if you place it first this two blocks exception Handler blocks will never get executed because even this two exceptions are a subtype of exception class itself. So it has to be it is mandatory that you place it at the end or else it would be be compiled time exception so you could have something like array index out of bounds and stuff. So just to give you this is integer array. I put one two three I Define an array now I say integer array of Three elements right and if I try to access or just choose so when there are three elements the index ranges from 0 to 2. So now I put three here. So this is generic exception Handler for all the exceptions. We would have this Handler when you run it. This is going to give you a rain dicks out of bound because you are trying to access element at index 3 which doesn't exist. So you would see a generic exception and so it came here. What I was trying to say is so you could have arraigned X Out of bound here, right? So instead of null pointer exception now, I have arranged index out of bounds now, it would be handled by this block and it wouldn't come to the generic exception Handler. So here you saw it came to the generic exception Handler. Now what you would get is array index out of bounds exception Handler because it's been handled by this particular cache block and not the last catch block. So this one is as you go down it becomes generate. So here you could see it's been handled by array index out of bounds exception as you go down. It becomes generic more. Generally it is multiple catch block. So this is pretty much similar. We have re we have arithmetic exception that occurred array has four elements 023 and you are trying to access the 10th element. That's when you would get array index out of bounds exception as we saw there could be nested try the rain. You could have try and inside try. So basically when you have prai inside try if there's an exception that occurs in the nested one or the innermost one, it would try to see if there's a catch Handler for that particular exception innermost one. If it doesn't find then it goes to the outer one. So in many cases it may happen that a part of the block may cause an error and the entire block may cause another such cases. You're going s to try block. So what I was trying to say is you have this one. We have one more like exception or shouldn't be done. So you have a nested one within this try you have one more wire. This thing with says array index which is handling null pointer exception sending just the null pointer exception. It's not handling array index out of bounds. So what I was trying to say is if such scenario occurs, it would check the innermost one if it finds the exception Handler, it would execute it. If it doesn't find then it would come to the outer one. So basically though this try doesn't have Handler for arraigned X Out of pound still it would be taken care of so you can see here. It came to the outer one. So if you would have some piece of code right after this, it won't get executed. So this piece of this code will not execute if inner try so basically if there's a reception which occurs in the inner block and if it's not handled it would come to the outer block but this piece of code whatever you have in between this catch and this catch would At x equal to Y to use throw keyword the Java through keyword is used to explicitly to throw an exception while executing the program. So if you want to throw something as I said, you could create your own custom exception and if you want to throw something you could throw it out you could throw an exception from your program. It can be used to throw checked or unchecked exception any kind of exception could be thrown using throws up using through and the Java through keyword is used inside a method so you could see here. Basically if B is equal to 0 you throw new exception / 0 causes an exception. So before it goes to actually dividing it by a by B, you are kind of handling it prior to that you are checking whether denominator is 0 if the denominator is 0 you're throwing Exception by yourself, you are creating a new exception. This is kind of your own exception, right you are you're creating your own exception and saying that it's divided by 0 so for any condition so basically Denominator is equal to equal to 0 you could throw it from you're saying or denominator. So basically if I keep this denominator has zero and this should be prior to this just cut this and this should be done prior to this event to use throws throw this something as I said, when you have a checked exception, you can either handle it using prai catch or you have to throw it out of the method saying that I am not going to handle this let the collar handle it you could do that using throws keyword. The method is not taking the responsibility to handle a checked exception and it is, you know, asking the collar of the method to actually handle it. This is in terms of just checked exception when you have a checked exception. So basically since you're throwing it from there, but since you have Handler here is coming to this so you have this denominator you through an exception from here, but this exception is been handled here, so it came here saying That generic exception Handler. All right. So if I remove this that's the reason you have generic exception Handler here. So I remove this Handler I'm not going to handle exceptions whenever you throw an exception. It has to be handled since exception is a checked exception. So basically you could have run time exception which need not be handled. So basically the Handler that you see here, we just have two handlers which is for arithmetic exception and array index out of bounds exception, but we don't have a Handler for runtime exception. So that's the reason it gave you an error saying denominator is 0 so, this is an exception that we through here using throws. So it's giving you an error right here because this is a checked exception. The exception itself is is a checked exception. Now, you could either handle it like the way we had handled it here. You could write catch exception and you could handle the way you want to so you have two options now when you get into this scenario into this situation, You have two ways to handle it either right exception and handle it. This would be a Handler. If you see the compilation error has gone or this is one thing that you could do or the other thing that you could do is you could ask this method this method can say I'm not going to handle it. I'm going to throw it for my collar to handle it. So the main method is saying I am not going to handle it. I'm just throwing it off from my side from my code or the caller to handle it. So see the exception has again the error has gone. So basically Whenever there is a checked exception you have to option and this is happening at the compile time, by the way, so you have to ensure that you either handle it or you throw it throw in the sense throws its through throws me anything that I am not going to handle this at the collar handle him as you could see the throws keyword was added in the method signature. We saw how we Throw exception. We throw exception from here you check for some condition you throw exception from Why uvu's throws throw is basically to throw an exception and a method saying that I am not going to handle the exception. So what's the difference between through and throws the throw keyword is used to explicitly throw an exception. The throws keyword is used to declare an exception. The through keyword is followed by an instance. The throws keyword is followed by throwable class. Alright, so here you could see this is throws keyword is actually by instance you create an instance of exception. Whereas throws is the class itself through keyword is used within a method and throws keyword is used with the method signature. So you could see through is used within a method within the method body and you could see throws at the signature level. So you have throws and throw so throw is nothing but whenever you want to check whether there is an exception and you want to throw it out you want to actually trigger the exception that's when you would right through and you would This exception. So basically here we are checking for a condition if denominator is equal to zero, which is potentially which would cause error further down the line. So we are checking it up front saying that if the denominator is 0 then we are not passing it further write in such scenarios. We could throw the exception right away. That's how you figure the exception from the program Rose is nothing but it's at the signature level of the method that you could see and what you mention out by throws this that main is saying here that I'm not going to handle the exception and just going to throw it off. So this are unchecked exceptions, by the way. So whatever is not been handled here if there's some exception handled here it would get to the exception Handler or the catch block. But if there is something that is not been handled here would be thrown out of this main method main method won't handle it. That's the reason why we have throws through keyword is used within the method and throws keyword is used with the method signature. Through keyword can throw only one exception whereas throws keyword can be used to declare multiple exception. Basically, you could have something like this one exception say ioexception so you could have multiple exceptions here. So the main is saying I'm not going to handle ioexception. I'm not going to handle exception or something of that so you could have multiple exceptions after throws user-defined exceptions. You can create your own exception and it is called as user-defined exception or custom exceptions user-defined exception class can be created by creating a class child class of exception. So basically create exception. I create a clasp which is SE custom exception. Now, this custom exception is extending exception so you could have your own classes defined and it would have like this. So what you exception you get you go you could pass that exception directly here. So this is See, what I'm trying to do here is overloading of Constructor. So you could see if you are passing string. It would come to this. If you are passing exception to come to this Constructor. So you could create your own exception here. So basically to give you example of this instead of exception. What I throw is I can have a new custom exception. So initially I was throwing exception. Now what I am saying is new custom exception. This is the exception that I have created. It's my own exception when I run this now, you can see that it should throw custom exception so you can see here exception in thread main thread main is nothing but your main method where your program is executing and it shows the exception type which is custom exception which is created by me and I have passed the strings in the denominator is 0 and at what point or at which line this particular exception occurred can see it in the stack trace. This is a stack Trace basically. Whatever you get here when an exception occurs is nothing but stack Trace. So hi everyone, welcome to module number four before I start off L. Just briefed on what we covered in module number 3, so we covered on Hoops Concepts in general. What are the Hoops Concepts what are different concepts or terminologies that we have in oops? Then we saw how Java is aligned to those Hoops Concepts how Java is known as object oriented program, right or how Java is aligned to object oriented programming Paradigm. Then we spoke about abstract classes, which is a different modifier all together, right and then we spoke about a hundred percent abstraction, which is nothing but interface which is a construct in Java which helps you to specify something and you could have different implementations as per the specifications then we spoke about exception, right? What are different exceptions and why do we have exceptions at all? And how do we catch exceptions or what is the need to catch exception and what are different types of exceptions right? Have like checked unchecked exceptions checked exception has to be caught by your application or a particular method my top to just throw it off rather than actually handling it through the throws keyword, right? We touch base on regular expression as well. And why do we need regular expression and what are different classes that Java has to support regular expression? Alright. So today we would be covering file handling and Java Collections framework. All right. So file handling is nothing but you have external files you might have something on your network or it could be on your local machine itself and you want to access it and do something on it or you might want to have data that's been coming to your program. You might want to write it into a file so that you could kind of analyze it later. I spoke about exception right? If you get an exception, you could write it into a file so that you could later on go through it and understand at what time a particular exception occurred and you could act upon it. It's a kind of profiling and instrumentation turn on application to understand more on the behavior of the application and to improvise on it. Such activities could be done using file handling will talk about Java Collections framework. Java Collections framework is nothing but you have a re array list and everything. That is we spoke about arrays in the previous topics. But Java Collections framework itself exposes array list, which is a dynamic list. You don't have to manage it. So remember in list we said that when you take Claire a list or declare an array, you have to mention the size of it whereas array list is dynamic. You don't have to mention it. It keeps growing. So these are the topics that we are going to cover file input output of operation in Java wrapper classes in Java. We are going to talk about Java collection Frameworks. We are going to talk about list and its classification in Java Q in Java and sets and their classification in Java. So as you could relate all this Action all this components within the collection Frameworks are nothing but data structures in general. That's you straight. So maybe in see you might have used different data structure and whereas in different languages, you have different data structures, right? This is just to handle data data structures are nothing but to store data efficiently and you could select one of them based on the use cases that you're handling within your application. So let's start with file I/O file I/ O is nothing but you have a file on your disk and if you want to do something if you want to write to that or if you want to read from that file, you would ideally use file I/O API. All right. So file I/O is used to process the input and produce output for a specific file. All right, so you could access some file within your local disk do something and you can write it on to a different file as well. Write Java dot IO package contains all the classes required for input and output operation for a Phi. All right, so As we said package is nothing but namespacing right? So everything is grouped. All the I/O classes are all the classes in Java that is handling. IO is grouped into Java dot IO package. Okay, that makes it easier for programmers to understand as well. Right? So if you're doing a lot of I/O operations, you could directly say import Java dot IO dot star which would in put all the classes within your Java dot IO package. All right, the files can be text file or it could be binary file, right so you could imagine not always you deal with a text file, right you have other files as well. So nowadays. There's a lot of things going on on iot right internet of things. So you get data from different systems. It could be like your mobile phones. It could be from the car sensors or elsewhere, right? You have a real-time raw information coming in into your system for analytics. So such data cannot be a text file. Txt file as such is a heavy file, right so such iot applications. What is been passed between systems our intercommunication between systems is done through a binary file, which is kind of lightweight right compared to text file txt files are heavier. So you could imagine this files not being just the text file. It could be binary files and so on when I say binary files, it could be it could be images as well write different images that could be shared among system or some image that is there on your local disk, which you want to read into Java and do something on it some kind of graphical processing on it right stream is a sequence of data. So you convert this file into a stream and you use it with in Java. Okay, we'll look at example, which would give you a clear idea of what I'm talking about. Okay, so here you can see an example where in you have a file which is student dot txt into your local system into your local disk where you are running this program right then you have a pretty Traitor this is nothing but a printwriter is a class that is exposed by Java which is there in Java dot IO package you would pass on this file. So initially you have new file and you pass on the path of this file that you are going to read or do operations on not just read it could be right operations as well. So basically you have new file and you specify the path name or initialize the file. The next thing that you do is you have printwriter wherein you pass this file. All right. Now what we are trying to do here is we are trying to write into a Phi, right? We are trying to write the name or the some ID or something. We're trying to write this content into a Phi right into your local file will write a program on this which would give you a clear idea and the next step that we are doing here is kind of we are reading it from a Phi. Alright. So the first step that you do is write it into a file The Next Step that you do is read from the same file and print the contents of it. All right, so it's not mandatory that you have to specify the same file for reading right? This is for just for the convenience or just to demo it. We are using the same file you could have different file as well. All right, so let me show you how this is done. So again, I create a new project for today, which is All right, so we create a new project and Eureka. module 4 Alright, so we have this project now. Let's create a new class. Calm down daddy. Rekha is nothing but the package name and I give up. input output demo Alright, so before we start off I can do one thing. I can create a folder here. Say said, Eureka. All right, so we'll put all the files here. So this is the empty folder that I have created right now or let me put it here. So for Simplicity, I'm going to put it on C drive itself. Alright, so on see have created a director IO directory where in we are going to dump all the files, right? Whatever we are going to do is going to come into this particular directory. Alright. So the first thing that we are going to do is so now we are thinking of writing into a file first right? So I create a main method right? The first thing that I do is create a file. All right, and I create a new file. Which is nothing, but I am calling the Constructor of a class of the class file, which is with in Java. Right? It's not something that we are writing. So Java itself has this internal file class, which is file. All right. So now a point to this particular directory. All right, calm down Ed Eureka IO and we say so I call it as employee info dot txt. Alright, so we are going to write into this file now from java program. So now it's showing up an error saying that which file I want to refer to as we said the all the I/O related files all the all the I/O related classes are placed in Java dot IO package. So I select this package once selected you can see an import statement here. Being up. So why do we have input statement because file is a class which resides in a different package then calm down Eureka had it been within calm down Eureka. You need not import it it's outside. So you have to put it right then there are different ways in which you could write it, but now we'll follow the same example. So I write printwriter printwriter. Is there within Java dot IO and you could see it imported here. All right employ info writers if example, okay now we create a new printwriter and if you see the Constructor of printwriter, so we spoke about Constructor overloading and stuff like that. Right? So you could see if you go into the source code. If you want to Deep dive more you could go into the source code and see it takes file. Alright, so here you could see an option which is nothing but it consumes file. So the file which we created above. I can put it as e employ info file. All right. So there's a file that's created here. So I put the same file here right since the Constructor supports file itself. Now this is checked exception. All right, you could see here. It is saying Java is explicitly saying that you are not handling this exception. All right. So ideally the better practice is we shouldn't be writing everything into the main because it would become cumbersome to understand later on right you shouldn't be dumping everything to the main method. So as a good practice, what you should do is you should create a new method right to file. All right. So this is best practices, right? It's not mandatory. Java is not going to tell you there is an error or something. But as a part of best practices, this is how you should write programs which would make it readable for others because tomorrow some other developer is going to handle this particular class. It's not that you have going to be there throughout right so basically so that other developers can easily read It and maintain it. Well, this is how we write it. I move this content. Whatever the writing part is. I move this content here. Alright, so now it's showing up an error saying that it's not been handled right file not found exception is not been handled because it's a checked exception. So remember in the checked exception we said that there are two options one is to handle it within your method all this right to file method can hop to throw it off saying that I am not going to handle it let the caller handle it. So when I say caller caller is nothing but this method alright, so I am going to create say here input demo. Sam trading in instance here. Alright and demoed right to file and I'm going to pass the file that we created here. All right, so there was one file that we created here which is pointing to an employee info Dot txt. And we are calling this method to write it if you think about the reusability part of it. So this is how you make the method reusable. If you put it into Maine you cannot reuse it. If you're taking the right logic outside the main and refactoring and putting all the code that is specific to writing to a file do particular method. You could reuse this method you're making it generic right now. I opted to throw it off or let's handle it. All right when I say let's handle it. It's nothing but you have try catch block. All right, so I say Catch so what exception was that? It was filenotfoundexception. So you need to have file already in place. Alright, so here I print saying that given file was not found on the local disk. All right, and once that file Maybe we can print the name of the file as well. Alright, so here we have chosen to handle it. Okay, so we remove this. Alright, so we have a try catch block written now and we say that Okay, so we are handling this error. So we say that it just print a message saying that given file was not found on the local disk. And as a good practice, I don't want further processing right if I don't have a file I don't want to process it further. So I say through runtime exception and I so runtime exception is unchecked exception. It won't give you error even if you don't handle it, right whereas this was a checked exception. That's why you are getting error. Basically. What I'm doing is I'm catching the checked exception and wrapping it into unchecked exception. All right, because I don't want this to be processed further. So once we have this printwriter set, so I'll have to take this print right outside or I'll get here. Alright, so what I do is employ Dot println and I write some content to it and say in this case I am writing vinod. I write some ID to it as well. Anything you could write. Okay one side right into the file. I have to ensure that I close the file. So basically you could have finally block so you would do this. I'll have to take so this if this is within try so it's not accessible within the finally block. So to make it accessible what you will have to do is you'll have to take it outside. All right. So I Define it outside Dry block so that it gets accessed in finally. Alright, so now what I do is employ info dot writer Dot close I close it. So that's one of the use cases of finally as I said, it's basically for closing the resources. So this finally would execute even if this doesn't throw or don't throw any exception and it would get executed even if it throws an exception. All right, so that's what the use of finally block is. So let me quickly run this program to see I have to create a file here. If I create a text file here Dot txt. All right before I create a file maybe I will I would want to show you what happens if we don't have a file, right? So if you don't have a file I run it so we don't have anything in to see at Eureka I oh, all right. Basically, you're trying to write into a file which doesn't exist at all. So it's building. And it's running now. Even if you don't have a file, it doesn't throw file not found exception rather. It creates one on its own. So remember we didn't have anything here. Now. Let's see the content of this file. You could see whatever we rode right the employee name and you could see the employee ID, which is hundred. So whatever you wrote here came into that file. All right. Now, let's write a program to scan or read through this file. All right, so maybe I can use the same file or I can use something like All right. So I write something like BMW cities howdy. All right, I I write something like this. It's a vehicle info and say you have something like let's keep it as is okay. So you have vehicle info in here. So now we are writing a program to read from a file. All right, so we pass on the file parameter here. There are different ways in which you can do. All right, so we create scanner now scanner takes if you see instructor you could see that scanner takes file as a parameter. All right. So I put scanner file again. It is saying that file not found exception is to be handled. So in this case, you have to be sure the file is present, right, since you are reading the file the earlier case it was writing to the file which can create a file but reading to the file you have to be sure that the file is present or else you would get a file not found exception. So in this case, I choose to throw the exception. The read file is saying that I don't want to handle this exception i instead threw it off. All right, you could see throws here. Okay. Now what we do is we read lines from it, right? So we have like Okay, so we read line from it and we just print it out. basically, you would have something like So let me just print line read from the input file, right? So this is nothing but we are just printing whatever we read from there. Basically, this should have something like it should Loop in until it's end of the file. Alright, so this is how you use the while loop similar to what you do in C and C++ right till the end of the file till yo F character is encountered you kind of read the Lines within the file. All right. So this is a method that we have written but we haven't invoked this method yet. So I create file since it's a different file we have to create a file vehicle info is equal to new file. We give the path of it, which is nothing but a Eureka IO vehicle info dot txt. All right, we created a file here. Now, what we are going to do is we are going to call read file on this file or vehicle info file and we should be able to see the contents of it. All right. So now one thing here is since you have thrown exception it's saying that exception has to be handled here. All right, I can choose to not handle the exception here as well and I am adding it to the method signature. Sure, so main would throw as well. So basically what would happen is if you don't have a file which is being read your program would stop at that point because you're not handling it anywhere, right? You're just throwing it off up the ladder. So basically at the end if you don't have a file you're going to get an exception your program is going to stop there. I run this file and let's see what we get. All right, so you could see BMW Mercedes and Audi being read out from vehicle info. This was the content that we had within the file and which you could see it's been bred. So file writer and file reader so similar to print this one is a different way of writing it. So what's written within this program is nothing but we create an instance of file writer and we pass the string the path of the file rather as an input to the file writer now file writer is nothing but it's character-oriented right print was not as such character oriented. This one is character oriented which means two bites right character is nothing but two bite-sized with in Java. So this one is not like it doesn't work at the byte level. Basically, whenever you're dealing with character-oriented file, you could use this one rather than printwriter. All right, objectify lighter is being created which is a character oriented file or which is a character oriented place. All right, and you write to a file you're writing to the file here. All right, and similarly when you use file reader, it's a character oriented reader reads character one character at a time from the file that you have mentioned here. So maybe I will take just an example of writing it because it's going to be pretty much similar. So quickly write this program. You have a main method you create a method to say you have public or it could be a private method as I said, the best practice would be to restrict as much as possible rate. If you don't want this method to be called from outside, you could have private method so it's going to be right to file. So you need to give string or you can have file as well. Whatever you prefer to would have file and file to write to okay. So basically we were talking about file right? All right, so I create file right to object. Okay, and again say it's a bike info. And I pause this file to which you have to write. All right. So again, you could see now you could see a checked exception that is nothing but issuing that ioexception has to be handled now I choose to throw it off. I'm not handling it here. Bike in four thought I write to the file and I write some content. Basically, this should be writer just to make it more elaborate. All right, I say right Road close close this particular file. Okay. Now I give a call to this method which is nothing but file writer demo is equal to Nu we are creating instance of it. Okay, let me create a file which is nothing but file bike info file and which is new file and within the same directory, which is nothing but calm dot Ed u-- record at I/O. I create by info Dot txt. Alright, so what we are doing here is using file writer. We are going to write into biking for DOT txt. And we are going to write this content that is Ducati and maybe after this we could have whatever you have in buffer that that would be flushed off to or disc. Alright, so when I run this basically we don't have a file now bike info and I think it should create it so you could see here. We don't have a bike info file. Okay. So again, let me talk about this program. So what we have written is we have a file. So what we are trying to do is we are earlier the program we wrote using printwriter. Now we are going to use five writer which is a character stream based I/ O so we are going to write into bike info dot txt file and we have a method right to file in which we are creating a file writer object which is taking up this parameter or taking this pile, which we are going to read through as the input. All right and not read through its rather, right? So the file to which we are going to write is taken as an input parameter to the file writer and we are writing into this file. So right now we are just writing to cart either. All right. So I invoke this method like file writer demo dot right to file and I pass on this file here. All right shows up an error that you have to handle iOS. Option which is been thrown from right to file. So I choose not to handle it here as well. Which means if you don't have that file or if there's some ioexception that's been triggered you would program would stop. All right, so I run this program. So basically, it should create file and should write to it as well. All right, so I go to the directory. So you see bike info file has been created here. We didn't have it earlier. It got created after we ran this program now, I just open it up and you should see the value Ducati been written there. All right, so that's about file writer and similar to that. You have to just read through it. You have to pass the file that you want to read as a parameter and you just have while loop to iterate through till the end of the file and you can print the character. So basically it's pretty much similar to what we did for the printwriter, but I just wanted to demo for one of these cases so we took an example of why writer. Alright, so now let's move towards stream stream based I /O so Java streams are used to perform input and output operations on eight bits. A bite right screams is basically operating on a bite input stream. It is used to read the data from The Source it could be file it could be keyboard or it could be anywhere across across the network, right? It could be a socket as well. So basically it is used to read the data from the source that is input stream and output stream is nothing but if you want to write something from your program to any resource on a network, that would be nothing but write that would be nothing but output stream. All right. So with output stream you would typically write data to a destination and with input stream. You're going to read it from a source. All right, just to walk you through so we have object as I said all classes or every class in Java is inherited from a class. That is object. All right. This is a super class for all the objects all the classes in Java. Okay. So you have object and you you could see that this input stream and output stream. So let's talk about the input stream. There's file input. Beam, there's byte array input stream this filter input stream and this object input stream. So we'll talk about this in the coming slides. Why do we have object input stream and stuff like that. But right now you could imagine that we have multiple classes or you could think that there are multiple classes with it input stream, which are used for different use cases. Like you have buffered input stream, which is nothing but it buffers it. It doesn't read or write it in one go. It's sort of buffers it and then it flushes it over. All right output stream similar to input stream. We have an output stream. It's an interface. I believe which has got several implementations like file output stream. You have byte array output stream. You have filter output stream. You have object output stream and filter output stream is further categorized as or has further sub classes as buffered output stream and data output stream. All right, so in further slides, we are going to discuss file input Stream file output stream object input stream and object output stream. Okay, so file output stream class and file input stream class. Let's talk about it. The file output stream class is used to write to a file right you you could take a bite array and you could write to a Phi. All right, so you could take something. If you have a string you could convert it into a byte array and you could pass it and it would write to a file. So remember we said it's a byte oriented, right? So basically it's going to write take array as input and it's going to write to it write to the file that you have mentioned in there. Right so you could take integer as well. It is used to write the specified bite to the file output stream. So you could provide integer as well. There's a close method which is nothing but closing the Stream So streams are nothing but it is hooked up to the resources. It is taking up resources and there is a Action between your program and the file established rate when you create three times. So when you close it you close that connection and it is free for garbage collector to remove that particular object from memory. So basically freeze memory as well right unless you close it. It's going to stay in the memory. So it's a good practice to close it right after you use it. Okay rights, you could write to a particular offset, which could be done using right method. So right length bites, whatever length you have mentioned in as third argument, it would write it to a particular offset. It would write the bite that you have even or bite that you have passed in as input. It would write that bite do a particular Offset you have flush method, which is nothing but flushes the output stream and forces any buffered output bytes to be written out. All right, so it could be buffered as I said, so not writing it each and every time You have bite basically it buffers it and you could have flush method to flush it off to the Phi. So basically we have buffered stream, which is this Method All right. So here we have file output stream and using file output stream. We rewrite it to the file and then we close the file. All right, as far as the syntax is concerned. It's pretty much similar to file writer example that we took but just to give you a demo just to show you how it is. We'll have fun demo done here. All right, so I create a new class which is nothing but file output stream demo. Alright, so we have a main method and I create a new method which is like file write to a file. Which could be like private method private void write to a file? Alright, so we are going to write to this file using what using file output Stream So it showing up this so I select Java dot IO dot fight. All right. Okay now I create file output stream. Create an instance of it right similar to how we did for other programs. Now, it says file not found exception has to be handled. I choose not to handle it and I throw it back to the calling program. All right. So now what I do is I do file dot right file output stream. I am going to write it to this file. So I just write a text here. All right. So write a text here. Hello folks. Hope you're enjoying the session and I just closed it off again it throws ioexception when you close it. So remember we said there could be multiple exceptions that could be thrown out of a method. So I again I choose to throw this one as well. So basically what I'm trying to do here is I throw IO exception as well. Okay, so it doesn't take a string as a as an input. So what I have to do is I have to do not get bites. As we saw the Constructor of it constructed isn't takes string as input in case of output stream or in case of file output stream. It interacts in terms of byte array and stuff like that. So I converted this string into byte array. So when you see get bites get bites method is a method on a string class which converts the string into array of bytes. All right. So now what I do is I give a call to this particular. I'm writing to a file and I'm going to take create a new file. So I can take the same file, right? I am going to take a b or else I will create a new one. All right, so I create a file which is like message dot txt or you need not even create it. It will create by its own. I will delete it may be okay on the thing is I love to create see a Eureka yo. All right. And here we say message dot txt. All right, so I call a method to write to the file using file output stream night choose to throw it off from here as well. Alright, so we have a method which is going to write into a file using file output stream. All right, so I run this program. Okay, it ran successfully. Let me open this message and see if we have the message written there. All right, so you could see here. Hello folks. Hope you're enjoying the session which is written from your program. All right, so this file input stream as well, which is pretty much similar it again operates in terms of bytes. As you could see the signatures of the methods within it would read the contents of the file into the byte array that you have passed as a parameter. The second one is to read from a particular offset the length that you have mentioned or passed as a parameter close is pretty much similar. It would close the connection that's been established and it would make the class available for garbage collector to clean it off. Okay garbage collector is nothing but unlike see where in you have to delegate the memory location that's been used garbage collector is parallel thread that is run by jvm to remove the or to free up the memory space that's been acquired by classes. So it runs sporadically it's not within your control. It runs per radically and it clears of the memory locations. We have a reed method which is nothing but reads the next bite from the input source. So on the file input stream instance on which you read it, it would read out the next bite and if it's end of the stream, it would return -1. So the return value is integer as you could see here you could skip specified number of bytes from the input stream and available Returns the number of bytes that can be read from the currents tree, right? So maximum number of bytes that could be read out. So I'm just going to read through this light or if you want. Yeah, I can take an example maybe since we didn't take example on reader. I'll take one example and reader as well. Okay, so here I to file input stream demo All right, so we create a class here and I have a main method here. Okay. I have a private method which is void and it's not returning anything and I said read from file. All right. which takes file Again, I'll have to import file. Okay, so Java dot you could see the input statement coming up here. So now I create file input stream. Okay. I create a new instance of it. Which would typically take for that matter it would take string as well. Just to show you a different variant of it. It's not that you have to always pass file it you could pass string as well. Alright, so we are passing a string here. It says file not found exception has to be handled since its read you have to ensure that you have the file there. Right? So I choose to again throw off this exception. So I'm not handling it. So typically you would handle exception when you want to do something on it. Right when file not found if you're trying to read a file and that file doesn't exist in your drive. I wouldn't handle it. I would just throw it off. I want program to break right there. Right? I don't want it to proceed because our program at this particular method is trying to read from a file and if it doesn't exist it, it doesn't make sense to proceed further. All right, so I have input stream. Now what I do is not read and as you could see it's written in integer, right so This has to be looped. All right. This has to be looped until you get minus 1 right. So basically you would have like say teacher and you have like so this is integer read from file. All right, and I keep this as integer, which is so whatever you read I need to assign this because I want to write that as well. All right, so I'm assigning to this and unless this is minus 1 you are going to read through write it again shows exception, which I need to handle. So this time it's ioexception and I'm going to throw this one as well. All right, so you have a reed method you are going to read it and basically till the time its minus 1 it's going to be red right now. What I'm going to do is within the loop. I'm going to just type. So basically I'm going to just type cuz this to character. It's read as integer. So you have to convert it into character. If you want to see in terms of character. If or else you would get the ASCII value of it. Alright, once this is done. Basically I need to close off the stream as well. Okay. Now what I do is I create the instance of file output stream demo. Just nothing, but creating instance of it. Right demo dot read from file. But remember this time we are not creating a file instance. We are just passing the string. All right, so you could take any of this file since we are reading it we could take like let me take bike in for it just got valued Ducati. So I'm passing this as a string this time. All right, and it's a different variant. You could pass it as a file as well. You could pass it as a string as well. But since I have been passing as a file in previous examples this time I choose to pass it as a string. Alright, so now I am throwing it off from here as well since I don't want to handle it right. So if I get an error, I want the program to break. So that's the reason I am throwing it off from here as well. So coordinator, let's see. What's it? Okay, so I have to put double slash here. All right. I miss that one. So basically if you don't put double slash it would take it as a regular expression sort of again. It's not bike in Foods dot txt, which I missed I believe so it says that bike info file doesn't exist. Right since it's a text file, right? You have to provide the extension as well. All right, so you could see it read in terms of characters, right? So you could see the first character read as D then then you could see it followed till till it red Ducati. All right, so that's about file stream or file input stream. That's how you write programs. Now what serialization and deserialization I will quickly cover on this one since this is something that's been used widely in big data when it comes to Big Data or when it comes to distributed computing. Just not to if you understand it's good. If you don't understand you don't have to think much but I'm just talking in terms of distributed computing. Right? So when it comes to Big Data, it's not that you have server farms and everything. Your program doesn't run on server Farm anymore. It's more about you have commodity Hardware on which a program is run and that's what Big Data Frameworks are good about the investments in terms of infrastructure by having server Farms has been reduced a lot has been cut down a lot and you could have commodity Hardware on which you could have this distributed Frameworks running. So say for example, you might have heard about Hadoop or Apache spark, which could actually run on normal Hardware right or you could Need to on cloud as well. So you have like Amazon web service which is cloud like you you have Google as well Google services, which exposes as a cloud you have a seizure, which is nothing but Microsoft's Cloud. So all these are kind of not big Hardware not server Farms that you have. It's a normal Hardware that you could configure and you could run through your chunks of data or petabytes of data that comes in from cloud or from elsewhere, right? So that's the beauty of it. That's the beauty of java and one of the main things are main feature that Java has got a serialization and deserialization which helps in having this distributed framework going. Okay. So serialization is nothing but you have class right and you you create instance of a class, which is nothing but object right now this instance of a class if you want to pass it over to some other computer or some other computer on your network, right? This could be done just because this Serialization there's a concept of serialization right suppose. I create some object of a class today on my computer. And if I want to pass the same state, right it's about passing the street not the behavior behavior is of course just methods, right? So it's about passing the state of the object. So whatever state my object is or whatever properties my object bolts at some particular point if I want to pass it over to some other computer on the network. This could be done just because you have serialization was what you would do is basically if you remember the object stays in Heap right Heap memory, which is protected which no other process can get into that particular. He process Heap memory, right? That's a security that Java provides if you remember in the first slide we covered it, right. So what Java does by serialization is whatever contains of a particular object or whatever contains a particular object whole set any could be written. To your disk as a binary file and you could send it over to some other computer via wire, or you could take it plug in your USB drive and you could just take that particular file the binary file that's created and you can go elsewhere and just play that file or just deserialize it to see the contents of it. Right? So you could imagine this is something that is needed in terms of distributed computing since not everything is been carried out on a single computer you you would process something on your computer you would you would write it to a file and you need to pass on this file toward or transport this file to different computer right or typical example in which you would think of serialization is more about you. Could you could have say for example one operation carried out on one computer and same operation or different operation on a same file carried out on some other computer now you want to move Just them together and that's where you would have serialization and deserialization coming into picture basically to understand the concept serialization is nothing but writing the state of the object to a file and deserialization is nothing but again taking the state of the object that's been written to the file again putting it back to a class format or when you want to use this serialized class. You would basically deserialize it use it. So serialization is a process of converting an object mrs. To sequence of bytes, which can be persisted to a disk or file and can be sent through streams or can send across wire or could be you could actually take it on your drive and transport it elsewhere the reverse process which will convert data bytes into object is called D serialization. All right. So how do we have this serialization and deserialization done or what classes we have for supporting it. Let's talk about that. All right in this example. You have a student info which is having ID and name, right? And basically you could see that we have created an instance of student info which which has value of 9 and John. All right. And now what we are doing is we are writing the state state is nothing but the value that this particular object holds right which is nothing but ID of 9 and name value of John, right? So we are writing this into a do a file which is nothing but student Dot txt. And and we are just writing that to a particular file. Okay, and this is nothing but the student dot txt file that you see it should be txt. Actually. It's it's a binary file. So you should I would rather prefer to have student dot Pi n or binary and you would write it to that file using right object. So the supporting class for serialization is object output stream and object input stream. All right, so I will quickly take a demo of this. So the first thing that we do is serialization serialization is done by object output stream. All right. So again, we have a main method suppose. I want to serialize it. So I would do something like say I have a private method which is void, which is serialize. Okay. So the first thing I would want to create is nothing but Java class which will hold the state right. So this is a class which you want to serialize or which you want to send it across two different computers. So such losses are known as model classes, right? Basically such classes are nothing but classes which holds chunks of data. So for Simplicity, we have taken small data like ID and name, but in general you would have like chunks of data. They're all right. So here I say Vehicle info. Maybe this is the class that I have here. Alright, and now what I do is suppose I have Suppose I have two parameters here. All right, so I have two parameters here, which is nothing but integer and suppose I have like string name of equal. Alright, so now I Define a Constructor for vehicle info which takes T three parameters for Simplicity number of Wheels. First. Say for example, I take name of vehicle. then it's number of wheels and say I have one more parameter, which is mileage. All right. Remember we use of this keyword since the name of the arguments and the name of the instance variables are the same we need to use this this DOT number of Wheels. Is equal to number of Wheels? All right, and this dot mileage is equal to mileage. All right. So this is a simple model class which is supposed to hold values. Basically in reality. This would be holding like chunks of values. Okay. Imagine like could be like megabytes of information or even huge gigabytes of information. All right, but for Simplicity here, we are taking this simple class right. Now. What we want to do is we want to see realize this into a GFI. We are going to create an instance of this particular class and we are going to dry this state or whatever values we have that particular instance. We are going to write it to a file so that it could be read from somewhere else or it could be used by any computers on the network. All right, so I have vehicle info. Again suppose I write BMW is equal to new vehicle info. Now, what I have to pass is name of the vehicle, which is BMW right number of and I pass some value like Like 10, all right. Okay. Now we have created instance of vehicle info and we have passed the values that we want to pass it and now we want to see realized this. Okay. So how do we see realize is nothing but we use object output stream, right? So what does it take? So basically you could go into the source code and if you want to deal more you could actually see what other Constructors that it takes. You could see it takes output stream. So one is output stream as a Constructor. If it takes output stream, then I'll have to create file or stream. Basically. I will name this as object stream and this one would be filestream. Okay, I create a new file output stream and you could pass the file on which you want to write it. All right. So in this case the file on which I want to write a particular class. I will pass it as file and I'll be passing it over here. All right. So what I am trying to do here is resolve this okay. So you take the file or to which you want to see realize so basically this vehicle info would be serialized into this file and this file would be transported anywhere across your network. So it shows file not found exception again, I choose to throw it. It shows my exception now, I've passed this file stream here. Alright, so this is how we usually write programs. You have file input stream file output stream, which is nothing but the file to which you want to write write the state of the object and you instantiate object output stream. Okay. Now let me write to it. Okay. So basically what are you going to write is nothing but vehicle info just instance of okay. So you're going to you want to write this instance of vehicle info particular instance of vehicle info into your into the file? Okay. So I write something like this. Okay. So so basically what we'll have to do here is whenever you have this thing whenever you want to write or whenever you want to write the state of a class to a file you need to implement one interface, which is serializable. All right. It's a do-nothing interface. It's just used by it's a mock-up interface as well marker interface rather. It is just used by jvm to say that this particular class could be serialized but it doesn't have any methods within it as you could see if it would. I've had some methods it would have shown an error saying that you should implement it. But in this case it didn't because it doesn't have any methods within right? So basically when you have object streamed, right? Okay, so it takes all right. So we we create objects stream and we pass the file that we want to write to and we have right object method which would take the instance of the class that you want to write and we have like we flush it and we close it. So one thing to note here is vehicle info class has to implement serializable. That's a marker interface serializable is nothing but a marker interface and it doesn't have any method within it is just an indicator as you could see it's an empty interface. All right. This is the source code of it. You could see it's an empty interface. It is just a marker or it is just a notification to the jvm saying that this class is something that could be serialized. Alright, so we have this class and we are going to serialize the state of BMW object into a Phi. Alright, so now what I do is I create Object output stream demo and I call serialized within it now this serializes taking two parameters. So if the first parameter is this is other way of passing it. We are not actually creating instance. We are passing it directly. All right, so I pass this and I say serialized file. Okay, maybe dot bin and the other parameter that it's taking is nothing but the instance of class that you want to serialize. Alright, so here we are again getting exception which needs to be thrown off. Alright, so this is a simple class that we have we have vehicle info which carries BMW instance or we have created instance of vehicle info with BMW values and we are trying to serialize this to the to a file which is serialized file dot bin. Okay. Let me see if it runs. Alright, so I hope it ran now. This is a binary file. If you see you are not going to understand everything that you have within this file. Okay, so I just Okay, so here you could see it's not something that could be completely readable, but you could get some idea about it. It's during game W. All right, and this is not meant for you to read it writes not in a human readable form. This is basically for passing this over a network and at the other end you would deserialize it. Alright, so this is how we see realized it now. We will check on how we deserialize it. All right. So you you saw the contents right? It's something that is not readable. Okay again, I'll open it up. Not everything would make sense. But you could see that this is for BMW. So basically you could see the value BMW here, right? So now what I do is I want to see see realize this right. So this is how you see realize it. We spoke about it how we see realized it now we are going to deserialize this. So basically this deserialization won't happen on the same computer. It might or might not or it could be saved different application within the same computer as well. So if you have two applications running and want to interact between the two applications running on the same computer could use serialization and deserialization or you could majority of the use case for this feature is more about passing it over the network. All right. So, let's see how we deserialize it. Okay. So when you easy realize it you use object input stream. Okay, so in the same class or I'll just for Simplicity sake I'll change this to object stream demo because this is not just all right, so I Defector it and I change we name this too. Okay, so this is been renamed to object stream demo now create a private method, which is nothing but void deserialize. Again First DC realization you need to have the file right you could imagine of you having the file and file should be okay. Okay. So now what we do is basically we could have this as a file rather since we are going to send the same file. Same file for DC realizing as well. So it's better to have it defined here. And you pass it as CD list. Okay so far we have serialized it now we are going to deserialize it. So what you do in D serialization is nothing but you use object. So the first thing that you will have to create similar to be created file input stream about now, we are going to file output stream in the serialized case, but here we are going to create a file input stream. And a provide the fight here. Alright, so we have file input stream created now we have object input stream. Alright, we are creating instance of it and it would be new object input stream and you would be passing the fill input stream that you created the step above all red showing you for exception. You have to could either throw it or you could handle it. So this case I'm throwing it off. Alright, so we have so here you could see we had bright object now, I'll have read object. So read object throws filenotfoundexception or class not found exception that you need to handle right again through it. So here you could see IO exception and class not found exception right single method can choose to throw multiple exceptions from within. All right, so we have chosen to throw it now we have vehicle info or we don't know whether it's BMW at that point. So I say d serialized object. All right, so object streamed read object by default. It returns object type. So we need to we need to type casted. This is how we typecasted one form to the other. So basically we know that object streamed or read object is going to give us vehicle info object. That's why we can actually type cast it. All right. So now what I do is once I get this D serialized object, I'm going to print out the values that I have within. All right, so I'm going to print the name of the vehicle. So I say All right put us. Right, so name of the vehicle the serialized file similarly. I just copy paste. It will print number of Wheels Alright and we'll print mileage of we go I need this one. Alright, so basically we are serializing it and then DC realizing it after deer is realizing it. We are printing the value of the contents or we are printing the contents of a particular object to see if it is what we expect. All right, so maybe I can do one thing. I can delete this off. Let me close this and let me delete this off. Okay. I'm deleting serialized info. I'm going to run this program again and this program will serialize and deserialize it. Okay, it will see realize it in the first case. And now I'm going to write would be serialization deserialized and the serialized file. All right now here as well. I am going to throw away. Okay. So first we are going to serialize it and then we are going to deserialize it and see whether we get the contents that we expect. All right, so it's running. Let's see if the file has been created. So we deleted the files. It's not yet come. So we can see that a file was created here. Right which is a serialized file and we printed the value from be serialized file as well after DC realization. We printed the value of the contents in the serialized file just like we got the expected value which was BMW 4 and 10, which you had said. So basically what we are doing here is we are storing the state of a class or state of the object to a disk and this could be transported anywhere when I say it could be transported is nothing but this is just a binary file, right so you could take it into your text file or you could take it into your pen drive and you could take it anywhere. All right. So that's the beauty of serialization and deserialization. I spent more time on this because this is something that is very important for Big Data since big data is nothing but all the big data Frameworks that we have they follow distributed computing and this is one of the important internals of distributed computing though you need not. Take care of it. It's all taken care by the Big Data framework. But this is an important concept to understand. All right, so let me quickly talk about wrapper classes. It's not an important topic to but I will quickly cover on this thing. So wrapper classes are nothing but you have primitive data types that we discussed the first day, right? So initially we didn't have this wrapper classes in picture when the initial version of java was created. So data types were dealt in terms of primitive data type itself. Then since Java is object oriented, right? It has to be completely object-oriented so they came up with a concept that we shouldn't be dealing data types as a primitive data type rather. We should be having some sort of object to it which is rapper, right which is wrapping this primitive data type. So in order to make it completely object-oriented they have come up with this wrapper classes, right so int when you define int right if you define int something of this sort, it's Native whereas you would have something like this. Inti is going to be primitive data type and whereas you would have something like this which is nothing but wrapper class, right? So if you go into the wrapper class, you could go into the source code and see it's nothing but it's doing the same thing. It has got some utility methods as well on the top of it, but basically it storing your value. So for now they have changed the source code quite a bit. Basically, it's touring in terms of characters, I believe. All right, so you need not take care of this. But what I am trying to say is wrapper class is nothing but a rapper built upon the primitive data type so that everything is taken care in terms of classes since it's completely object-oriented programming language, right? So Java has a class dedicated to each of the Primitive types. These are known as wrapper classes because they wrap the primitive data type into the object of that class. All right, so you could see for bite you have a wrapper class corresponding wrapper class as bite with starts with capital. Be all right, since it's a class it has to start with uppercase or it has to follow camel casing short has again short int has integer long has long float. You could see a corresponding wrapper class with name float double will have double character CH AR will have character which starts with a bouquet see again Boolean again has camel cased Boolean as its wrapper class. All right, so when it comes to classes you could have hierarchy. So basically you could see that all this byte short integer long float double. Everything is subclassed from number. So basically in the source code that we saw for integer you could see it's extending number right? So that's what it is saying here is a subclass of number integer is a subclass of number. So how do we reduce wrapper class? It's basically you just have to pass value to it. You could have as a part of Constructor, you could pass some kind of value to it. So you could either assign value of hundred right or you could have something like Something like this. Okay. So you have different variants of it. You could either create it directly assign literal value to it, or you could have something like this but as you could see this is deprecated. This is no longer required. Actually. It is still accepting it. It's not throwing compile time error, but it's deprecated. Which means if you're writing a new code, you shouldn't be writing it this way. So there's also concept of Auto boxing which is nothing but if you have like integer a could be assigned value K directly. All right, or could be assigned value J directly. So it could be converted from wrapper class into your primitive type without any kind of conversion. That is known as Auto boxing. It does it by itself? What is generic in Java generic is nothing but template in C C++ in C++ rather you have you define a template which is which is a general. Thing you're not putting in a specific data type you are saying that this is what it is. It's a template and you could have any data type during runtime. So basically what you're trying to say is this particular method or this particular class is a generic class, which could handle any data type that is passed. So it's not specific. All right. So generics in Java is similar to templates in C++ generique enabled type parameters when defining classes interfaces and methods, right? So the type parameter is nothing but a generic type and it's not saying that it's going to deal just with integer or with character or with string. It is saying that it could handle anything that comes anytime that you would send it any type that you would instant. She ate that class with. All right. So when we take example, you should get some more idea about this generate provide compile time. Type safety allowing programmers to catch invalid types at the compile time. So generics work on type Erasure, which is nothing but which is done at the compile time itself. Basically, it's done at the compile time. It can catch exhibitions during the compile time itself, or it could prompt you during the compile time itself, right? We can specify the type the angular brackets. So whatever type you want to do, whatever type is that class going to handle we can put it into angular brackets, which makes it generate right? So here you could see that this is a method which is print array which is taking e as type. So as you could see he is the type here. All right, he is a type here and we are not mentioning that it is going to take print integer array or string array or something of that sort. We are seeing that it generates. So whatever you pass or whatever you instantiate it with it's going to take that array and print elements within it. All right, so this Method could be thought of as a generic method, right you could think of this printer as a generic method not a method which is just taking integer and printing it. It could be string array or it could be anything else. So that's what generic means advantages of generics type safety objects or single type can be stored in generics. We would be looking at it in the next example typecasting is not required. There is no need to type casters because it knows that what kind of objects that particular data structure would carry or hold compile time checking it checks type mismatch error in compile time, which avoids runtime errors. All right. So imagine a list which we are going to talk in further slides what is list, but imagine a list which is a collection. All right, and you have like imagine a list which is holding strings. All right, so you have list dot add and you you add a direct cut to it. Now when you get 0 typically get Zero would have object the return type would be object since it doesn't know that it is just carrying string know where you have mentioned that it is a string of it's a list of string right? It's a generic list so it could hold integer value as well. Alright, so in that case, what you need to do is when you do list dot get 0 you have to Typecast to the string here. The next element could be integer. We don't know right since we haven't said that it's a list of string. So that's that the reason you need to have typecasting done. All right now using generics you could Define that this list is a list of string. All right, it's going to carry only string nothing else. It's going to hold now. It makes it simple right you add either a car now. If you try to during the compile time itself, if you try to add integer to it, like list dot add hundred. It would throw an error saying that it cannot pulled integer because it's meant for string. So that's the advantage that you get over. Rick's you could hold it you could catch errors during the compile time itself. All right, so it won't allow you to add or it won't allow you to put a hundred in to your list of string. All right, and since we know it's going to hold only string there's no need of typecasting it as well. You can see here. It's not typecasting it in this case you had to put this string here, right? So basically in this case, you need not type custard. There's no type question required because we know it's a list of string now what a collection Frameworks collections framework is nothing but you have data structures in terms of classes. Again, it's a wrapper for data structure. All right, it's nothing but like you have array which is normal primitive arrays, but this one would be sort of growing array. So basically you need not take care of actually, you know adding up indexes to it. It would automatically It's a self growable array. So you could imagine when it comes to array you could imagine collection. You could imagine one of the classes within collection is list, which is nothing but growable array of any data type. All right, so Java Collections framework provides an architecture to store and manipulate a group of objects or Java Collections framework includes the following it has interfaces classes and algorithm interfaces is nothing but again specification. This is how it should be. So Java says that you know, when you have a list it should have so-and-so methods like adding to the list setting to the list removing some elements to the list something of that sort. So it defines collection you have a collection you should have so-and-so methods and list should have so-and-so methods and so on and so forth. So basically it's for specification classes is nothing but concrete implementation so list by itself would have Would have all the methods that you just the it's an interface, right? So it would have all the methods that you want without any implementation. But this classes would be actually implementing it or rather. It would be implementing this interfaces and would be giving a concrete implementation for methods. Right? So as you could read here, it's concrete implementations of collection interfaces in essence. They are reusable data structures, right algorithm is nothing but there are utility algorithms that you have like if you want to sort a particular collection or if you want to sort a list list of string you could do it using using your algorithm using a predefined algorithms that already comes pre-loaded with Java. All right when I say algorithms and where are these algorithms residing? It is a class which is collections. So you have a collection which is an interface top level interface and you have a collections class which is class. Which is holding all the utility methods or algorithms, whatever you call who basically you could just read through this hierarchy. These are different types of data structures that has been supported by Java. You have a collection. So the top level interface is as you could see there's collection, which is extending I treble all right, extending iterable interface collection itself is an interface you have a list as interface, which is extending collection. All right. So list is extending collection Q is extending collection set is extending collection. So we have three distinct type of data structures Year's list queue and set list is nothing but you could say it's a ordered one, right it maintains the insertion order write the order in which you inserted data into the list Q is nothing but first in first out and whatever you push in first would come out first and set is nothing but To sit in mathematical form right over in you have unique values. You cannot have duplicate values. So that's what set is but it's it need not be ordered. It need not maintain the insertion order, right? So you have the concrete implementations for list our array list, which is nothing but again similar to array that we have right the normal primitive array that we use. So it's a wrapper class for it. We have a linked list. Alright, so this linked list is nothing but doubly linked list. All right, so you could insert from you could Traverse the either direction you have Vector as well which is which is Legacy Forum, which is not used to that extent yet as of now. So we have vector and we have a stack which extends this Vector redstack is nothing but last in first out and it adds some more capability on the top of this Vector, which is nothing but it's a subclass of Victor. All right, so these are Implementations of list we have a Q and as you could see here, there's one interface here DQ which is nothing but it is extending Q. Alright and we have an array D Cube which is implementation of TQ. All right. It's a class which is implementing DQ interface. All right, this is a priority queue as well, which is a class which is implementing Q when it comes to set we have a sorted set which is again an interface which is extending set and as you could see there is a tree set, which is a concrete implementation of sortedset and it sorts the element that you put into a set. It sorts it into a specific order. All right, again, the concrete implementation of set f is our hash set which is nothing but which does some kind of hashing which is a default implementation of set and which doesn't maintain insertion order as set is nothing but it is indexed to for fast reversal or Want to go get something out of a set, its kind of indexed set. You could say right it has buckets and everything. It follows hashing algorithm, right which is which is basically for indexing or which is basically meant for retrieving data faster from the hash set from the set and that implementation. That's the default implementation which is has said, all right, there is a linked hash set which maintains the insertion order. All right. This has said doesn't maintain the internet insertion order. So if you put X & Y into your hash set and if you retrieve it or if you Traverse through it and print the values, it's not mandatory that you would get X and Y in the same order whereas in the linked has set its pretty much you could be a hundred percent sure that X would come before why all right. So it maintains insertion order what is less list has nothing but an ordered collection of elements which can contain duplicate son like sect it can contain duplicates, but it has ordered an unlike say State has ordered write lists are further classified into following arraylist linked list and vectors, right? So based on the use case, you could select one of these data structures. Let's talk about array list arraylist is nothing but similar to arrays that we had and here you could see element stored within of size 5-a released of size 5 and you could see value stored within right. So this is how you instantiate an arraylist array list object is equal to new arraylist and you have an arraylist created one of the main things about arraylist is as I said itself growable or its Dynamic you unlike array the normal primitive array where in you had to within your square brackets, you had to mention the size of the array during the Declaration itself. Whereas in Array list, you need not have to mention this sighs. All right, it grows by itself as then when you insert data into it, it would go So basically you could imagine a normal in general scenarios or in most of the programming cases or in most of the real use cases. You don't know up front. What is the size of data that a particular array is going to hold right. Now the number of elements that a particular array is going to hold you cannot know it up front because things are Dynamic right? So suppose you are reading from the database. You don't know what that size of the data or what what are the number of elements that a particular database is going to have. So typically you could imagine real cases you would go with arraylist and not primitive arrays. All right. So also you could imagine this is this is this is saving us in terms of memory because we are not hard coding the values of it. So by default, it starts with 10 size of 10 and then it keeps growing as and when you insert it. So again, it has a logic it doesn't keep going for each and every That you do but it has a logic within to grow it by particular size. So which is all optimized which is good for your for your cases use cases. So these are the methods that we have within our A-list. It's very straightforward. When you do add it appends the specific. It's usually add and not collection for collection. You have a doll methods. So it's a typo here you have ad and you you mention an element that you want to insert into a list if it's a string you would have string string element or if it's something else if it's an integer, you would have integer element you could add it to a particular index you could clear it removes all the elements from the list you could have last index of a written the index of this list of the last occurrence of the mentioned object. So if you have multiple as we said they could be duplicate values within but when you give last index of it's giving you the last index All right last index of the object that's been passed you could clone it. So it's basically coming clone is nothing but a method that they're within your object class and it would shallow copy the array list. So whatever list you have there would be a clone of it. Right so clone is as we could see it's it's it's from the object class. So any class that you create could be clone. All right, then you have to array so you could have an array list and if you want to convert it into a primitive array and use it in some form you could do that thing as well by doing two array you could trim to size. So trim to size is nothing but prims the capacity of this array list instance to the list current size. All right. So whatever is the size it would trim to that so moving on let us understand how we can Traverse through a list of collection. So travel cell is done through I traitor interface. Okay. So basically you have a nitrate interface and that's how you Traverse it. Basically you have implementations of it since it's an interface it is it is just the specification you would have an implementation of it. So I traitor is an interface that I traits the elements. It is used to Traverse The Collection access the data element and remove the data elements of the collection. All right, it's used for traversal as well as removal of data elements within the collection. Okay. So what are the methods that we have within I traitor first is has next. So it's it's nothing but as you could imagine it is written in Boolean. So if it has a next element it would return you true. Okay, and if it doesn't then if the arraylist is already exhausted then it would give you false. So you would I basically would have a loop wherein you would see if it has a name next right and if it has next you could This is the next element using next Method All right, so next would return the actual object and to remove it you could do I treated or remove which removes the last element written by the I traitor. Alright, so here you could see how I treat her is being used you have you declare an array list and you you I trade through it and you print the elements so quickly we can take this. So basically I do calm dot edu Rekha dot I create one more package now for arraylist. Okay, Isaac collections, demo dot array list. All right, so I have this particular class created now. I create a main method and I create private void. I write a method which is create array list for demo. All right, as you could imagine when I see create it's going to return an arraylist. All right, we want it to return list. Okay, what I do here is I would create list and this list is going to be list of string. Okay, imagine generic that we spoke about you are saying that it is going to be list of string now, it's three mirrors saying which list I want it's going to be Java dot util so you could see Java dot util doll wrist here. Now. I say it's strings dot new. I didn't list. You're saying that here what we are doing is we are instantiated. So we have a list of strings and we are instantiated it since we want arraylist. It's going to be a release. So here you could see array list being imported as well. All right. Now what we are going to do here is we are going to add some values to it strings dot add or maybe I will put again since we have been talking about cars and bikes I will cars right? So we are creating here cars list of car. All right, so I put BMW But what? all right, so all German cars and then we Then we written it. We are returning this. So we are creating a collection. Right and we are inserting data into it and we are returning it. All right, so this would create a list for me right now. I want to I trade this list, okay. So I create a private method which would return void and which food print arraylist or demo. All right. So as you could imagine this is going to take a list as parameter. All right list list to be printed or it's pretty much implicit or implied that list is whatever list you pass as a parameter is going to be taken for printing. Okay. So here what I would do is list dot I traitor I take the I traitor. Okay, so I get the list I traitor I say I traitor and it's a list I traitor All right. So I take this list I traitor and I say list right while while it has any elements within so, how do we check with whether it has elements within is nothing but dot has next if you remember while it has any elements within what we are going to do is we are going to print out print the value the list. Alright, we are going to print it using I traitor dot next. Okay. So I've created two methods one is create a released for demo and the other one is print arraylist for demo create arraylist is doing nothing, but it's creating a list and it is returning the list and printer a demo is printing the list that you have passed as a parameter. Okay, so I create a new element of array list demo dot create arraylist. All right, and whatever I realize that I get over. Will is that I get I would be putting it here. Right now I create one more this and I print it. All right. Now when I print it I am going to pass this returned array list. All right, I think it's pretty clear now. So we have created a released in this method and we have returned it and in the second case we are just going to print it. We are going to take any array list and we are going to print it. All right. So let's see. So rest of the collections most of the collections you do it pretty much similarly. It's just that you know, it's used for different use cases. All right, I am getting some error I think okay. Yeah, you could see here. It has printed BMW Mercedes and Audi which we had put into the arraylist. Alright, so that's how you kind of I trade through it. Similarly. You could just remove it. You could use list I traitor Don't remove will remove the current element that's penetrated. All right. So yeah, this is I don't need to actually create one dot remove you could remove it. All right Drew. So that's how you remove it if you want to so you you have the same syntax. So basically we don't use I traitors nowadays more. It's more about we have Java 8 there are different constructs. Like we have Lambda expressions and stuff. We have screams stream processing, which is you have I traitors. All right. So this is what we have we have a hydrator, which is I creating through all the elements right and you could remove it as well using the I traitor usually nowadays. We use Java 8 streams which helps us to I'd rate through which is pretty much like the underneath is I traitor and stuff but there are some some kind of abstractions done so that we don't actually deal with I traitors there's some kind of abstractions are it's less verbose in this case. You have to write a lot of code to print through and everything. Whereas in streams. It would be just one method call which would do lot of things right. So that's what has been used as of now, but this should be good enough to start off with to understand the basics of it. Alright other thing is I was talking about the best practices. So it's good to have things broken down in methods. So that could reuse it rather than putting everything into the main method which makes it difficult for any other developers to understand mode. So basically it's a good practice. Make it modular, right and which enables reusability as well which reduces the lines of code within your program. So tomorrow if I have some other list, which I want to I trait I can just pass the list to this and it would right fit and give me the results. So I don't have to write the same piece of code again. Alright, so moving on so we have a released arraylist is nothing but abstraction done on a primitive array. So what are the advantages of using array list? It's more about it's faster in terms of retrieval right index based retrieval suppose. If you want to get to the index to just write like arraylist get to and it would give you the one at the end x 2 or the element at the index to whereas when it comes to insertions and deletions. If you want to insert a particular object at index 2 what it has to do is it has to move that was there at the index to to the index 3 and it has to increment the entire array by one or move to the right by Position which is pretty cumbersome, right which takes a lot of time so insertions and deletions are not good when it comes to arraylist, whereas when it comes to retrieval it's faster. So based on the use case you have to decide which data structure you should go for right? So simply put we think of Big Data applications. It's mostly about you don't have insertions and deletions as such it's not transaction, right but typical online transaction processing this thing would be application or say, for example, you have Amazon right Amazon or something where in you have a lot of transactions happening which needs insertions and deletions right in that case arraylist is not a good option. Whereas in terms of big data, which is like analytics right online analytical processing which doesn't have transactions as such right. It doesn't have insertions and deletions. It is one-time load you have data you load it into your data structures and you do some kind of processing or you do some kind of analytics on This data, but you don't manipulate this data. You don't actually have insertions or deletions done in such cases. It's better to go with a realist. All right, so which is a variant which is good for insertions and deletions that is linked list. All right, when it comes to insertions and deletions and you want to maintain the order of the list insertion order of the list. That's when you would go with linked lists. All right. So linked list is a sequence of Link's which contain items each link contains connection to another link and that's how insertions and deletions are simpler. You don't have to shift elements to the right when you insert it or you don't have to shift elements the left when you delete it. There are two types of linked lists to store element singly linked list and doubly linked list singly linked list is nothing but it has pointers in One Direction doubly linked list is like it has previous and the next its stores. Both each node would store previous element pointer to the previous element and the next element. So yeah, this is a singly linked list wherein you see that it has pointed to the next. It doesn't have pointed to the previous one, right? It's a one directional traversal, right? Whereas in doubly linked list, you could see that it is looping back to the previous element as well. So it has a pointer to the next and it has pointed to the previous one. It's a bi-directional traversal. So linked list has pretty much similar to arraylist you have ad you could add a particular object. You could check whether a particular object is contained within the linked list and that object has to be passed as a parameter to contains. You could add a certain element at a particular index. You could add it to the to the head of the list you could add to the last you could check the size of the list. You can remove the element from the list and you could get the index of a particular element so you could pass some element and get the index of it since linked list is again, it can have duplicate elements. If you want to get the last index of a particular element you could do that thing as well. So if you have multiple elements, you would get the last one right the index of the last one. So linked list example here you could see that a linked list of string is being created and you add values to it, which is fragile Rahul and Richard you add things to it. And and yeah, this is just about adding elements to the list. All right. So arraylist versus linked List released internally uses Dynamic array to store the elements since I said, it's Groove able it grows on its own linked list internally uses doubly linked list to store the elements to add an element in between or to remove an element from the array list slow because it internally uses array if any element is removed from the array list, then the rest of the elements should be shifted to the left. All right, similarly when you add something to the list you have to move everything to the right adding an element in between or removing an element with linked list is faster than arraylist because it uses doubly linked list. So no element shifting is required, right? You don't have to shift any address. Or something. It's just about moving the pointers. Right? So you would just move it skip one element and move to the next in terms of deletion. Whereas in terms of insertion, you would insert a node and you would manipulate the pointers according T. Alright arraylist can act as a list only it is normally for list but linked list could be thought of as a list as well as Q right since it's a doubly linked list you could have like first-in first-out arraylist is better for storing and accessing data. All right. So as I said, this is pretty much good enough for analytical sort of application analytical nature of application. Whereas when it comes to transactional linked list would be better. So linked list is better for manipulating data and it is slow in searching an element because it needs to compare the elements from the first note when it comes to you know, index based search. It is slower because it has to start all the way from the start. Was it goes through links? Right? It has links to next element and that's how it traverses through vectors are similar to erase but the Legacy form of it. It's a dynamic array again similar to arraylist. All right, it could be visualized very much similar to array list, but just that it's a legacy of java. It's not used to that extent or I would say it's not used at all at this point. But what is important to note is Vector is synchronized when it comes to multi-threading it's better to go with Vector, but nowadays we have concurrent arraylist arraylist that is supporting concurrency. So there are a lot of optimized versions of it which gives lot of performance Improvement. So vectors are no more used as such an industry. It's a Legacy form of arraylist. There are concurrent versions of arraylist that that has been evolved which could be used in multi-threaded applications. All right, Victor. Contain many Legacy methods that are not part of collections framework. So it doesn't even fit into collection framework because it contains some Legacy methods which are no longer used or which are not part of collection framework at all. Now Vector is again taken into collection framework and it implements list and that's the reason it has the implementation for this methods because this methods are typically coming from collection and list collection interface and list interface and all the concrete implementations have to implemented. And since Victor is one of the concrete implementations of list. They have to ensure that they Implement these methods as well. All right. So these are the methods pretty much similar to what we spoke earlier add clear and add to a particular index remove and then you could have size and you could have last index of and last index of object. So it's a vector of string then you add element you add. Issued fun and Kumar and you just write great through it to print out the message from a chiffon and Kumar would be the output of this application or this program. All right, so you could see I traitors use here as well. Like we did it in list. So let's talk about QQ is nothing but first in first out whatever goes in first would be first to come out a priority queue allows you to initialize the queue. These are implementations of Q. So you have a priority queue you have as we said linked list is list as well as Q so you could have linked list assigned to a queue right linked list is the list and linked list is a queue right is a relationship which means it's extending it right. So here we can see double ended queue lets you to a door and remove so double-ended interface DQ DQ interface allows you to Add and remove elements from Peak as well as from the bottom. That's what DQ is double ended queue, right and array d q is nothing but the concrete implementation of DQ EQ is an interface and the concrete implementation is array d q. So what are the Q & DQ methods you have ADD method which is nothing but it adds to the top of the queue and it returns a Boolean as you could see here if it is successful if it has added to the top of the queue it would give you true. And if not, then it would give you false right you have offer which inserts the specified element into the queue again, it does the similar stuff. It inserts to the cube. All right, you have removed which removes the head of the queue we have pull which retrieves and removes the head of the queue again. It does the same thing retrieves and removes the head of the queue and returns null if the queue is empty. All right, bullying is nothing but getting the top of the queue. And you have element which retrieves but does not remove. All right. So when you do Q dot element it would give you the top of the queue of the head of the queue, but it would just give you but it would still be there. So if you want to check value that is on the top of the queue if you want to check it and do something with it based on the value that is there on the top of the list or top of the queue. If you want to perform some actions we can do it using element Peak again does the same thing it retrieves but it does not remove the head of the queue if you want to actually retrieve and remove the head of the queue you would either use remove or pole. Basically you would use pole not remove right remove is not a good operation to do when you want to retrieve and do some actions on it. The best practice would be to use piec to retrieve and use Pole to actually retrieve and remove Alright, so let's take an example of Q. So right here in the package I create. Secretary main method, right? So I create private. Q v8q for demo All right, so it's asking me which Q I will go with this one, which is Java dot util dot Q. All right. Now I am creating a new priority queue which is a concrete implementation which would be say for example of integer, right? So I create a queue of integers. So we are putting integers within all right, and what we are doing is new. I am instance eating it. Alright, so this is a q which is going to hold just integers. That's what Jen Rick's come into picture, right? Queue of integers dot add suppose. I put a hundred and then I put ad could is used to as I said to insert right and I put 50. So I've created a queue and I written this Q. So I've created a q so far. Let me print this queue. Alright, so we have which is going to return void and print queue for demo and which is going to take you. All right Q of Cl you don't even put it here. I so now, let's see how we can retrieve elements from it one way is to I trade through it and let's see how pole and other things work right? So let me get the head of the list. So this is just retrieving it right retrieving head of the list. We are not removing it it is still there in the queue. We are just trying to check what it is. So when I say when it's retrieving it speak right now if I want to remove it if I want to kind of retrieve and remove it. So basically what I'm trying to say here is when you have q dot Peak it's going to return the top of the list which is nothing but 50. All right. So the first one the peak is just retrieving it. Whereas when I pull it it's going to retrieve and remove as well. So I have q dot pole is going to now when I do s out retrieve and remove Say this is the first attempt. All right, and we again do it which is the second attempt. This is just to show you that when you pull it it's actually removing it as well. Whereas Peak is not removing it. All right. So Peak is just retrieving it and this one is removing it. So the first pole is going to give you 50 whereas the second pole is not going to give you 50. It's going to give you 200 because it has removed 50 from the queue. All right, so this is what I wanted to show. So let me Q demo Alright, so here I'm going to do demo Dot. So when it comes to generic we can make this generic Q program by doing something of this and instead of hard-coding it you could put a Ste here. Right now, let's keep it as is. Alright, so the first case Q is being created the second case. We are going to see how we can pole works. Retrieving is just ringing and it is still keeping that element at the top of the queue whereas polling is actually removing it as well. All right, so you could see here Peak is giving you the last one here. It's a double-ended one. So it's giving you the last one here and pull is giving you this one. It's based on Friday. I think. All right, so you can see pole is giving you 50 as well and when you pull it again, it's giving you a hundred. All right, let's move on to the double ended queue. All right. So here we have something like you could remove first. All right, you know, so it's a double ended queue you could in fact in both the directions you you could actually remove first and add to the last and stuff like that. So you could see here that there's a double ended queue created with four elements initially 2142 63 and 84 and you could see that remove first is removing 4221 rather from here since 21 is the first one so it's removing 21 and remove lost or add last it's adding to the last which is nothing but it's adding hundred and five to the last So what is set is nothing but as we said it's a representation of mathematical set which is unique which holds unique values right? You cannot have duplicate values within set set has its implementation in various classes such as hashtag preset and linked as set so it's a mathematical set abstraction. We have variants of set in Java which is has said linked hash set and we said hash set is nothing but it hashes it or basically there's this indexing done and it's good for retrieval as you could imagine since it's indexed. It's good for retrieval. Okay. So the analogy behind this could be our it is analogous to index page that you have in books, right you have index page you just go to the index page and see at what page is the content that you are looking out for this one is pretty much similar to that. So when you do hashing you would be able to retrieve it much faster then sequential retrieval. All right, so that's what has said does and it has unique values of course, which is a property of a set. You can't have multiple values within or duplicate values within it doesn't sort automatically. This is a typo here has set is acid doesn't maintain maintain any order at all its internal to The order in which the retrieval would be done is pretty much internal to the runtime or what I mean to say is if you have a has set with the same content and if you run it multiple times you would see that the retrieval is different in different instances. So it doesn't maintain any order your application might demand something or demand a data structure that is set as well as it maintains just the insertion order right? That's a scenario in which you would go with linked hash set. So link - there is nothing but set which has its insertion order maintained. All right. So the third one is tree set, which is nothing but it so these are the methods that gets inherited into hash set and but similar to other collections that we have, but just to talk about this one so you have ad which is just adding object into hazard or linked has set you have contains which is basically checking whether a particular. Object is present in a set. You can clear the contents of the set. You can check whether a set is empty using he's empty method. You can remove a particular object from a set using remove method and pass. The object that you want to remove clone is nothing but a method that is inherited from object class, which is super class and it is basically meant for cloning any data structure or any class or any instance of a class. All right. So when I say cloning it's not but making a copy of it and it's a shallow copy. There is a steep coffee and there's a shallow copy shallow copy is nothing but the properties within the set. So the references remain the same basically you would have a value say for example string right? If you have a value say at Eureka you would basically have both the set pointing to the same instance of a dareka. All right. So it's a shallow copy and deep copies were in you would have different instances or together. So when A Change Is Made in new set A particular element it won't be reflected in the other set. So that's deep copy, but by default the shallow copy that's done. If you want to deep copied then you will have to use some other utility or you some other class. All right, there's an iterator similar to other collection you can have I traitor to iterate through the set and if you want to check the size of the set you could use the size method. All right. So let's see an example of hash set and linked has set. Alright, so here I have created two methods create hash set which creates the instance of has set and add some integer values to it, which is 130 340 and 440 and you see there is one more method created which is create linked hash set which is again inserting three elements into it, which is hundred three hundred and five one. So I return this. All right now I write a method to 848 through it. Which is displaying nothing and Print set and which would hit s. All right. What you do is you have like set to print dot you could have I traitor right which would give you I traitor which would give you an instance of I traitor for set. Alright, so we have I traitor created for set now. Let's iterate through it. so remember how we I treated list so you would say set I traitor dot has next if it has next then print the value of So basically we have this then you have set I traitor dot next which would give you the actual value. Alright, so we have a method which would I trade through the set and display its content? All right. Now what I do is I create instance of set demo. I create has set and whatever value I get. I put it as as set. That's it for demo. All right, keep it I set. All right. Now I have against it. I say linked has set for demo. So basically we just creating the set. All right, then we create the linked hash set now said demo we are going to print it. The first one to be printed is is Hash set for demo. And this is what is reusable ET right? See I'm not fighting the method to print it multiple times. It's just once and which could be used for printing has set as well as linked has sit. So this is what reusability is all about. If you don't expose it as a method and if you write it within your main method, you won't be able to reuse it and you would have to write the same piece of code multiple times which adds to the redundancy and which is not a good practice. And this also makes it much more readable by looking at it. You can understand that. Okay, it's creating a hazard. The second method is creating a link has said and the third one is printing asset. So it makes much more readable, right? So that's an important factor as well when it comes to programming. Alright, so here we can see that when I printed the hash set it gave me 133 4440. Now the thing is it's just three elements. So it has maintained the insertion order. But basically if I have more elements you can just copy this multiple. Okay, I remove this. Okay. Now you can see that you won't get it in insertion order since it was it was just three elements its by fluke that you got it in the same order as which you inserted. So if you see it now. So now you can see that, you know, the first element that got retrieved is 4401 which was basically you put it at the last ride. So it's pretty much random. As I said linked has set. The retrieval would be pretty much random. You could see 4401 then 130 which was the first element inserted than 340 then 440 then you saw 40, which is again out of order. So basically this is what linked has said does and suppose I put the same values in the link has set you would see that insertion order is maintained. All right, so from here if you see from 130 in from here, it's printing linked has it and you could see the insertion order being maintained as is 4410 and when you see Hazard, which is very much like this one, you can see that it's random. All right, so that's what link has set an asset differs own preset is nothing, but it Sorted set and you have a retain all method retain all method is nothing but intersection between two sets. So basically you could pass one more set to the retain all method and you would get an intersection of two sets. So what I mean to say is if you set has value one, two, one, two, three four and you pass one more set to it or you invoke retain all method and pass one more set to it which has values 1 and 2. All right. So your Source set on which retain all method is being called that has got four elements 1 2 3 & 4 whereas the set that is passed to retain all contains only two elements. That is one and two. All right. Now when you invoke it your Source will have only one and two your 3 & 4 would be removed off from the source set because the retinol method is nothing but it's an intersection between two sets. Okay? So size and hashcode, so all these methods remain the same as other ones that you have in different collections, right? So you have like size which would give you size. Hash code is nothing but a unique integer that's written for any object in Java. It's not just free set. Any object in Java when you invoke hashcode, it would give unique integer. All right, because this particular method is inherited from object class of java contains is nothing but pretty much similar you pass element and check whether that element is contained in the source set contains. All is something like retain all it would return true only if all the elements in the collection that's passed here as an argument is present in the source set. All right, it has to have everything all the elements. So the previous case wherein I said the source has one two, three and four and if you do collect contains all on a set Are you pass a set to contains all with values 1 and 2 it would return true. Whereas if you pass a collection with values 5 & 6 it would say false because you don't have values 5 & 6 in your Source collection. All right, I traitor is nothing but it Returns the iterator that we checked on you can convert it to to array any collection could be converted to to array which would give you object array. You could check equals basically checks if the collection is I think it has to be empty here it checks whether your collection is empty. So there's a typo here. Just to give you an example. I will create one more. So I copied the same method and I said create rehash set. All right. So what I do here is I will make these changes. I will keep it as this could be kept as set and this is like free. All right, so tree set and and we are set. Now I print this one. Okay, basically set the dough dot create rehash set. All right, so I'm printing this so prior to that. Maybe I will put a statement here printing stre set. All right, so I created a tree set with this random values 133 4440 and stuff like that. Now let's check whether it has sorted it or not. Right? So I created a tree set and I'm just printing it here. So what you can see here there's we have created reset now if you see it right after printing tree set all the values that you see here then 3044 41 3440. It's all sorted efficiency. Right and it's Unique as well. So if you insert it multiple times like if you insert n multiple times still in it would take Just one value of 10. All right, so you cannot have multiple values if you put 10 unlike array list or linked list, which will have multiple values. This would take just one 10. All right, it would ignore the other one. Enunciate is a special type of set which creates genome is nothing but a constant it's a replacement for constant in Java. So basically the replacement for public static final and basically for constant earlier. It was like we used to use public static final but now it's advisable to use enums four constants. All right, we'll see an example which would give you much more clear idea about it. So first one is all of all of method is nothing but creates an enum set containing all of the elements in the specified element type. So it would create enum set with all of the elements that you have copy of is nothing but creates an enum set initialized from the specified collection. All right, so you could pass a collection and it would create an enum set out of it. None of is creates a MD enum set with the specified element type or this creates a in mm set initially containing the specified element. Can you could initialize it as well? So basically here we are giving a specific class with which it would be created or the enum set would be created range creates a enum set initially containing the specified elements, right and clone is nothing. But again, it's pretty much similar. As I said clone is a is a method that is inherited from object class and is meant to clone or have a shallow copy of the data structure against which it is invoked or object against which it which the Clone method is invoked. All right. So here we can see there's the enum which is months. Alright, so here you could see a in a months which has like three months declared within Jan Feb and March. All right. So now what you do is, you know him set off and you just wait set out of two of these elements, which is Fab and March. All right, so this is what Them office so you could have some enum values put in and it would create set out of it. Now when you write rate through it, you would see that you have Fab and March into your genome set. All right. So this is something that is required when you have enums with multiple constants and if you want to have or you want to create set out of it and do something with it, right? So it would be pretty much common or you imagine of enums as exhaustive list of constants, right which is used throughout your application. Now there might be instances where in you want to have you want to put them into set and do something with it. Right? So basically this is mint because the values within your enum cannot be put into a data structure as of now or prepare to enum set. We were not able to put the values within the enums into a data structure, right? It was considered as a separate entity. So now this is That you could put it into a data structure as object and you could play around with it. So that's the reason we have enum set. What is map map is nothing but it's a key/value pair and it is unique Keys you it holds unique keys. So suppose if you try to insert same key with different value, you would have your value updated or overwritten with the new one. All right, so but it won't duplicate it. So what I mean to say is it maintains a key value pair, but the key is going to be unique across. All right. So This Could Be Imagined as a table, right? You have a table in data structure, which has got one primary key say employee ID and there's a name which is like name of the employee right? Imagine. This ID is a primary key, right? So you cannot have multiple values. So if you try to put some multiple if you try to put one more value to it, it won't allow you to put in. The only thing that you could do is update the value of existing ideas. He's our add a new ID. So this is pretty much similar to that. Right map is specifically for maintaining key value pair and we're in Keys would be unique and if you try to map and existing key with a new value, you would see that the value is been overwritten, but you won't have to kick it keys. Right again. There are different variants that we would look at map has hash map which is similar to Hash set which is based on indexing or hashing. All right, you have linked hash map, which is pretty much similar again. Hashmap doesn't maintain the sequence of insertions linked hashmap maintains the sequence of insertions. There is a sorted map which is again free map and which is sorted on based on Keys. All right. So the structure that you see here is pretty much similar to set right we had hash set we had linked hash set and we had preset so this one is pretty much on the same lines as set So how do you put data into your hash map? It's with put method, right you have put method and you you put some key and value. All right, we have put all we can have an existing map. And if you want to put all the key value pairs that they're into a map into a new map, you could use put all or you could remove some key. You could get some key. All right, you could check whether a particular key is contained within hashmap. You could get your key all the keys in the hashmap as a set, which is key set give you extract all the keys as set and as their unique already, then you would get a new set returned out from he said entry said Returns the set view containing all key value keys and values. So basically you would get all the keys and values as a set when it comes to entry set from the entry said you could get key and value distinctly. All right, so get key is nothing but obtained a key get value would give you a value against the key. Now. What are the typical exceptions that you get when you deal with map some exceptions Throne while using map interface is no such element exception. So when you are trying to invoke some item from the map if you're trying to invoke a key that doesn't exist. This is what you would get. Okay, this is more about when there are no items if there is no item that exists in the map at all if it's an empty one, and if you are trying to retrieve something that's when you would get no such element exception. All right Class cast exception is pretty much. It's a generic exception that you get when you try to cast it against an object or suppose value is a string. All right, and if you try to cast it to integer you would get a Class cast exception since string cannot be mapped into integer. All right. Now pointer exception is the runtime exception which we saw that if You haven't initialized your hash map. And if you try to put something into it, you would get null pointer exception. So you have to make sure that you instantiate the map first and then start using it unsupported operation exception. This occurs when an attempt is made to change a map which is unmodified unmodifiable. So you can get unmodifiable version of a map. And if you try to change something within it this is what you are going to get unsupported operation. Hashmap linked hashmap and free map. So this is pretty much similar to the examples that we saw for the set write Java hashmap class implements the map interface by using hash tables. It inherits abstract map and implements map interface. It contains only unique elements hash map contains values based on the key. It may have multiple null values, but only one real key. So this is important to note. You can have multiple null values. But only in one alky you can't have multiple in alkies sonal is also treated as a key as a valid key when it comes to hashmap, right? Whereas in hash table this one more variant of key-value pair, which is Hash table, which would throw you an error if you have G as null but hashmap take ski as null so that's an advantage of it. So hash map doesn't maintain the order of the element linked hashmap maintains the order of the elements. In which they were entered and treemap sorts based on the key. So these are pretty much the same thing that we discussed for map earlier. If you see entry set key set and all those things we have already discussed about and it's the same this something that we have in specific to tree map. You could get first key. You could get lost key. All right, since it is sorted you could get it now. There's a hashmap example. I create a main method first. Then I create private map and then create. hashmap And I create a new map here say app of integer string. Typically you would have integer as your ID right employ map. All right, and which would be new suppose. I create a new hash map. Read so I'm creating a new map here, which is like the key would be integer your value would be string. not put Buddhism method that we use and say employ map dot put Alright, so this is how you put into it put into map. All right, so I'd written this map from here. So we so we'll take an example of hash map. Where in we would be putting some ID and we would be putting some value as a string and we would check how it gets I treated or how we can hydrate through or get something out of the set out of the map. Okay. So here you can see that I created a hashmap. I created this method which is create hashmap and I put some value within which is nothing but and you could see here. It's a map of integer and string. So I put a value of one and I put value as X I put 2 and value as Y and I put a hundred and value as a right. So I created a map of employee ID and employ name so to say right? Okay, so I've created this and so what we are going to do here is so you could even print out a map. See if you want if I print it out like this like map to print you would see all the values contained within the map. All right, so this is all right. I print the hash map right here. So basically I created demo dot create hashmap. Okay, demo dot print map and let's print this map here. All right, so we have inserted three entries into this map 12 and hundred with ID 1 to 100 and which has got value of XY and a respectively And what we are doing is we are just printing the map contains of the map right here. So you could see here is 1/2 and hundred been printed out here. Alright. So again, this is a hash map and you could have it's based on hashing. So it doesn't maintain any order. So if you have multiple values within you would see that the order is not maintained similar to what we had in hashmap. So if I put something like this Alright now when I run it you would see that insertion order is not being maintained and when you retrieve it, you will get it in any order. All right here we can see that the order is not been maintained 112 is displayed first, which is second last actually. All right, so it gives you all the entries within the map but it won't maintain the insertion order. So that's if you want to maintain the insertion order you have used linked hashmap. All right, if I change this to link to map linked hashmap just one single change would sigh copy the same stuff here. All right, and I put a link hashmap. All right and suppose I create one more which is 43 map. All right, so we have created three Maps here one is your tree map. So the other one is linked hashmap link - map now. Let's print one by one, right? The first one is hashmap that's already been printed here. Now, I create linked hashmap. Right? And the third one that I print is demo dot create remap. All right, so we have all the three maps created and we are printing it here. Alright, so here you could see that when it comes to hashmap. The key value pair is not maintained. Right? Whereas when it comes to link the hashmap. This is a link hashmap and you could see that the order is exactly the same as the order in which we put in. All right, and when it comes to tree map with the third one and here you can see that it's sorted one. So sorted by your key. Not the value. Alright, so see the key to the left hand side when it says 1 equal to X1 is the key and X is the value if you see it will see that 12 Levin 2,100 hundred and eleven hundred and twelve 1010 and 1100 so you could see that it's been sorted / the key. All right. So this genome map in a map with specialized map implementation for enum Keys. All right, which we saw here. We can see that there is a enum which is nothing but constants and you could see three constants been put into the months, which is Jan Feb and March and you could see here is a in a map created for all the months or for all the months that you have within your genome that is months right you have this in a map and you could actually put in values something like this. So basically in a map is nothing but you could use the enums or the value within the enums as your keys. All right, when you use in a maps and you could just write rate through it to see that you know, you have this Keys put in and values put in properly. All right. So, so just to give you an example we can have we can create an enum here. I'll choose to create them same one and I create enum here, right? So I create in a month and which has got say for example, Jan Feb March. All right, so we have created this now what I do is I create a new in a map with months and with string as its value, so I create a main. Gina map fifth month and maybe we could put into your head. I create this in a map here. All right in a map of our you have month and integer. Alright, so here we will have to give a month dot or even months. Okay? Ticks class 1 class. All right. So in the Constructor we could see that it takes class as a parameter. So we put one thought class as a parameter now I put ma'am don't put I put like the the key is your it is depicting something like seals ton per month. All right it basically it refrains you from putting anything but the enum value as your key. All right, so that's what we are trying to do here and you could just print. In a map calendar and you should be able to see the values. All right, so it's basically restricting the key as one of the values or one of the constants declared within your enum. See how you can see here. Jan is equal to hundred fehb is equal to 200 you could. Now I will quickly talk about comparable and comparator comparable and comparator are the two interfaces or it's used when you want to have sorted set or if you want to sort a collection say for example, you have lists of integer and you want to sort it a list of integer is something that is by default could be done because integer itself implements comparator, but if you have a self-defined class or if you have your own class say for example, if you have your own defined class something like this vehicle info, which has like a number of Wheels mileage and name of the vehicle put in now if you want to sort this particular class if you give it to a sorter, it won't understand because this is a self-defined class straight. It won't understand what you want to sort in this right. Basically when you have something of this sort when you have your own defined class and you want to sort it, that's when you use some variable and comparator. All right, so I'll just walk you through it so comparable. Phase is used to sort the objects of user-defined class in an order. So to give you an example suppose you have an employee class which has got ID and say salary, right? If you want to sort it by default. Java wouldn't know what you want to sort within that particular class, right? You want to sort it by the identifier or the ID field within the employ or if that's the use case, then it could be like you want to understand the order in which employees joined the company and the other case. Could you want to sort it by salary to understand which employees taking the most salary or to understand the sequence in which salaries been paid to the employees, right? So to make Java understand which use case you are trying to solve based on which identifier or based on which property or instance variable within your class. You want to sort to just indicate Java that this is what we want to do express it in a form of implementing comparable interface. It is in Java dot length package and it contains only one method that is compared to it provides single sorting sequence only that is you can sort the elements based on one data only you can't have multiple data consort based on multiple data. All right. So I'll just walk you through this which would give you an example. So so basically you have a student which implements comparable now here you could relate to the example that I took wherein you have roll number and name now you want to sort it. Now what we are trying to sort here is by rule number. So that's how you express using comparable. Right? You have comparable student, right? And you could see here. There's a compareto method that this comparable student has got all the comparable interface has got now compared to will take student as a parameter. All right. Now you could see that we are comparing rule number right you're comparing the rule number of the parameter student that's been passed to the compared to if it is equal then it's 0 right you don't have to do anything if it is greater, then you written as 1 and if it is less then you return as minus 1 so basically based on this compared to Java will do sorting All right, it will sort it based on whatever you provide here. So what you are trying to tell Java is if it is equal we are returning 0 so this is a contract. Okay. This is what we need to actually this is how it's been coded or this is a contract that you need to follow whenever you compare to. So if it is a real number then you say it's rule number 0 or return 0 if if both the real numbers match if the one in your instance is greater than the one being passed here. Then it would written one or else - one. All right. So how do we use this? So basically you can see here you created student. All right, so they were like three students created 101103 and 102. You could see three IDs being created here. All right. Now what you're doing here is collections dot sort and you're passing your array list of student and you use collections dots Not right when you do collections dot sort what it would do is it would arrange it or it would sort the array the order of rule number so 1 0 1 would be first 102 would be second and 103 would be the last. All right, so there's comparable and this comparator. All right. There are two interfaces comparator is nothing but it is used to order the object of use again. It is used to order the object of user-defined class. But what is different in comparable is comparable takes compared to which takes just one parameter as input and the other parameter is nothing but the instance within the class itself. All right, although this instance rather the instance on which this particular method or instance on which compareto method was called. All right. So basically comparable will have only one method compared to all right, whereas comparator when you use comparator interface it will it will take two methods or it will take two parameters in the compare method. All right, and it will compare both the parameters that are passed. So basically it's for customized sorting in the first example, that is comparable. We are putting the logic of comparing within the class itself, but you have a separate class which implements this particular comparison logic. So basically you could see here right you have a class student and student is just holding the values of roll number name. All right, you don't see how you don't see the comparison logic with them. Now you have another class which is named comparator which implements comparator. Alright this name comparator which implements comparator now if you see the compare method, it takes two parameters, the earlier one the compareto method incomparable was taking just one parameter here. It is chicken two parameters, right? And what you could do is you could simply compare based on name right since name is a string you could do S1 dot name dot compared to S 2 dot name. This would compare based on name. There's another one you could have one more class created which is nothing but rule number comparator which implements again comparator. Now here you would use the same logic that you defined earlier for rule number. All right. If S1 dot roll number is equal to equal to S 2 dot roll number return 0 else if S1 dot roll number is greater than x 2 dot roll number written one or else if it is less if S1 dot roll number is less than S2. Total number written minus 1 So based on this logic you would see that the compare or you would see the Sorting Happening Now, how do we use this? So we have defined a class. We have defined a model class. So model class is nothing but a class that has got just the state right student. If you see student doesn't have any Behavior as such it doesn't have any method with them. It is just a state. So this is a model class. Alright, so student is a model class which has record roll number and name and we have two separate comparators defined here named comparator, which is comparing the name and we have a rule number comparator, which is comparing based on rule number. Alright now, how do we use it? This is not sorting at yet. Right? How do we use it? So how do you use it is nothing but you have collections dot sort. All right. This is pretty much similar to proceed other part of the program. This is just about putting the data into your class. All right, so you have 1 0 1 put in as Vijay 106 put in as a J1 05 put in as Jay. Alright, and now we are trying to sort this based on rule number as well as name. So both this can't happen in one go by the way. All right. This is like first you can have something done on rule number and so it's not in one go. All right, you could do it in step five manner. So as you could see here, how are we using this comparator is nothing but you have collections dot sort and then comes the collection that you want to sort. In this case. It is a L2. All right, and then you provide the comparator. So here you are providing new name comparator. Alright, so after This particular statement is called you would see that the collection is been sorted based on name. All right, and the first one here as you could see collections dot saute L2 and here you are passing roll number comparator in the first statement or here the first collections dot sort statement would sort based on Roll number. Whereas the lower one would sort based on name. All right. So this is basically offloading or just decoupling your comparison logic out of your class. That's when you would go with comparator. Whereas you would go with comparable when you want to put the logic within the class itself. All right, so it depends on what use case you want to do. But as far as the performance is concerned, it's pretty much the same. All right, even if use comparable or comparator, it's pretty much the same. It just depends on how you want to write it the programmers wish so few people refer to have modular programming rather than coupling everything into one class. They would go with comparator and few people like to add things to the class itself, which they would go with comparable. So what is comparator and comparable comparator provide single sorting sequence? That is we can sort the collection on the basis of single statement such as ID or name as we saw that you would have just one compareto method and based on that. You would have the sequencing done or the Sorting done. Whereas comparator you could have multiple learning since you could have multiple classes implementing this comparator and you could write your own logic like in the previous example, we saw that we had a comparator based on rule number and we had a comparator based on name as well comparable effects original class comparator does not affect the original class. So we saw the student class right the student class within the student class itself. You define the compareto method when you use comparable, whereas when you use comparator you wrote different classes. So that's about decoupling that I mention comparable provides compare to method to sort the elements and comparator provides compare method to sort. All right comparable is found in Java dot Lang package and comparator is found in Java dot util package. We can sort the list of comparable type by collections dot sort lists and we can sort list of elements of comparator type by collections dot sort lists comma comparator method. All right, when I say list, it's a list of some type, right? So in the previous case, it was list of student and since student class itself at the logic for comparison. We don't have to mention it explicitly taken care of by itself. Whereas in this case, where an you use comparator and you had different classes where in you put the comparison logic in that case, you have to explicitly give the comparator right? Like we give something for rule number. We instantiated rule number comparator and gave it for sorting by a rule number and we instantiated name compare. There for sorting by name. Alright, so that's how we sort user defined classes. So basically why do we have comparable and comparator just to reiterate but jvm or Java wouldn't know how to sort a user-defined class, right? It could be based on rule number. It could be based on names. It won't know by itself what you're trying to do. So that's how you using. This interfaces you express your logic of comparison. So what is XML so Henry handles the database of a college but the data is stored in a form of XML file. He wants to extract information from this now. He is learning XML so that he can handle it easily. So what is XML all about? It's extensible markup language. It is designed to store and transport data XML has hierarchical human readable format XML is platform independent and language independent. Why did XML come into picture at the first place? So it's basically you have different systems Mauro you might develop some system or you might have some service that is exposed to the outside world. So what happens is they has to be some contract you as a client or you as a service provider. First of all would expose a contract saying that if you give input to my service in so-and-so format, I will give you output in Swann Format, so basically when you want to send data from a client the service you would send it in a specific format that the client understands or the server understands. So the server exposes or the server expresses the input format in a XML form and this is platform independent. This is like you might have a service tomorrow in created in.net which can use the same XML as used by Java program as well. So it's a platform independent thing. Basically, it's used for carrying data as I said store and transport of data, which we'll see in the coming slides but you could imagine this as nothing but a file which is used to send data from your client to the server for communication. It's pretty much human readable. It's not like yesterday we saw but serializing and serializing the state of the object which was not human readable. So this one is pretty much human readable you could imagine like you would have an employee ID or You want to start something in the employee directory and there's a service which is exposed for that you could imagine that you could send the ID to it or you could send an employee name to it and format in which it is sent would be pretty much human readable. You could see that okay, there's an ID there is a name which is sent to the server and the server is doing so and so things so it's hierarchical and it's pretty much human readable again, as I mentioned platform independent and language-independent. It's agnostic of all these Technologies. So there are a lot of existing Services which use xml's as a part of input data and output data. So as we go through the examples, you should be clear to you guys about what XML is all about why we need XML XML is an industry standard for delivering content on the internet. So it's a standard. So most of the services most of data entry communication that's happening within in Annette is done in the form of XML. They communicate with each other in the form of XML XML is designed to store and transport data XML is the extensible because it provides a facility to Define new tags. It's not that once you define it. It's all done. So it's extensible. It's extensibility feature wherein I can say today, my server is accepting employee ID and employee named tomorrow. My server want to accept employee salary as well. So you could add that to it add tags to it, which makes it extensible. So it's not one time Define. You could change it. You could evolve the xml's XML is used to describe the content and structure of data in a document. So it has got its own schema and you can say that my XML is going to contain just email ID and employee named nothing else and you could validate VL XML or the actual XML that you have against the schema and if you Some extra parameters put in it. Would throw you an error. So that's about white need XML. Let's talk about what are the features of XML? Why is it so widely used writing XML is pretty much easy. As I said, it's human readable and you could actually write it and there's a lot of API or lot of sdks that are exposed for reading and writing with xml's and very optimized version of it. So you could see parses, right? We had multiple parses. It's for Performance Based on the needs of your particular application or the nature of your application. You would select one of the parsers. So writing xml's is very easy. The other one is XML data can be extended with DTD and xsd. It's a schema description. As I said, you could extend it. It's not that it's one time Define. You could extend it XML can work on any platform this platform agnostic. You could run it on any platform either Dot. Or it could be different languages or different platform. It could be different operating systems as well. I could run it on line X tomorrow or I could run it on dotnet any tool can open XML file and can parse it in programming language. So simple editor or even notepad you could open it in notepad plus plus and just you through it and there are different tools available in the market as well, which would give you kind of format your xml's so that it's much more readable. So there are a lot of tools available already XML separates data from HTML. It separates the actual data from HTML code XML simplifies data sharing. So basically as I said it pretty much intercommunication standard between systems, you just have to put it into XML and you share it across systems XML simplifies data transport. What is the difference between XML and HTML so XML is used for storing data and data communication. So as I said inter system communication standard and HTML is used for display. So whatever you see on the web is something that is you have a HTML page you have coded it in HTML format and it's used for displaying it XML uses user-defined tax HTML has its own predefined tags. So when you define your XML, it's a user-defined XML. As I said today. I might have a service which is taking employee ID and employee name which is like user defined which is not predefined. Whereas when you use HTML HTML is nothing but it has to get parsed into or it has to get past into a page which has been visualized by clients. So that's why you have a predefined tags. You cannot have anything you cannot put something of your own or if you put your own tags, it would show up an error. So it's validated reason being you have to compile it or you have to run through to show it as a view or show it as a HTML page with the plants. There's an interpreter which has to understand what you're trying to do. So it's predefined tags XML is case sensitive and HTML is case insensitive in XML. It is mandatory to close all the tags. So you cannot keep any tags open. So we'll talk about the tags. Once you see the format of the xml's but basically if you have a every property or every data that you want to send out will be enclosed in a tag you'll have to ensure the tag is closed. So for example employee ID right employee ID will have opening tag and it will have an employee ID as a value and you will have to close the tag you have to ensure that employee ID tag is closed right after the value in HTML. It's not mandatory to close the tax all the time XML is dynamic because it is used to Transport data HTML is static because it is to display it it. So basically when I say, it's Dynamic it's extensible. So tomorrow you could change it. You could change the format or you could change add few more elements or few more tags or add some attributes. So it's pretty Dynamic would change it whereas HTML is aligned to a proper predefined tags and you can't change return. You cannot add some tags additional tags of your own XML preserves white space and HTML does not preserve white space. So what are the rules let's talk about XML rule XML considers white space as the actual data. So whatever you are sending data through XML. So imagine you are sending data between two systems, right? So space is also a character when it comes to XML. So suppose you want to send some data that is client is typing. So of course you need To have Space Center as well. You cannot have spacing node. It's actual data between two systems communication between two systems and since space is valid data. It's been considered as data by XML ordering and nesting of XML document should be proper. As I said, you have to ensure that once you open a tag you have to close it there could be nesting so there could be a tag with says employ and within employed tag, you might have employee ID tag, and you might have employee name tag. And once you have this employee ID and employee name tag, you have to ensure that you close the employee tag. So that's nesting. So your nesting ID and name within employee tag. So your this might be really confusing at this point. If you have no idea about what the structure of XML is all about, but don't worry in the coming slides. We have examples and it's pretty straightforward XML tags are case sensitive every opening tag must. Have a close tag else XML be not correctly function. What does an XML file consists of it has one root element that is one tag, which encloses the remaining tags. So it has one root element within which the entire content would be and each elements consist of start tag content tag and an end tag. So there is one of the components of XML is nothing but element within an element you would again have some content expressed in form of element again, which will have start tag content tag again and end tag. This is about nesting it will see in the example which is pretty much like readable format XML tracks are case-sensitive opening and closing tags should be exactly the same without any difference in the case. So you have to ensure that it's been enclosed with the same case as it was started off. This is an XML. So the first That you see is nothing but XML declaration. The first line that you see here rather is nothing but XML Declaration of prologue. So this is nothing but kind of saying what the XML is or the format in which it is encoded here. You could have your dtds which we'll see in the coming slides but so kind of summarizing your XML what the XML is all about. That's your Declaration of prologue and that's mandatory. If you don't put it it would throw you an error then comes the student tag, which is user defined you could imagine this as a user-defined XML, right and you could imagine this as data being or you could have a service a for example, which is doing something with this data may be inserting to a database right? So you could imagine this being sent from client or you have a webpage say for example, wherein you enter first name last name and email address of a student and say for example that comes to a server and it's loaded. To your database. So the root element of the document is nothing but student here, you can see a student tag. And as you can see here, it's an element which starts with angular bracket then the name of the element and it ends with the angular bracket. So this is student and then the next line is about you define three tags within it. This is nothing but the content of student and here you can see it's following same strategy or it is following the same structure. You have was named Henry and disclosed the first name element. You can see the second element as last name and with starts with angular bracket last name and and the angular brackets. Then there is actual value lie, and you could see that it ends with the tag or with the element last name. So one thing to remember here is about start and ending of a tag ending of element. You can see the right after the value. The element is closed and you can see This thing here as well. So student is a element and you can see first name last name and email being nested into student element nested or they are the child elements of the root element. So you have child elements defined here and you have the last line which defines the end of the root element here. We have XML which has doors or which is used to transport. First name last name and email address of a student across systems. Let me show you the tree structure of this XML so it could be imagined as student being the root element and you can see that first name last name and email is nothing but your child or is the child for student since it's a root element and you could see the values the actual content of it within your first name tag, you saw the value Henry within the last name you saw the value lie and within the email address you saw Henry 123 at gmail.com. So the leaf node is nothing but the content of elements or the actual contents of the XML that you're trying to send across systems. This is pretty straightforward. Like you could realize XML in a form of free format where in your root node is nothing but element of your XML and the leaf nodes or the leaves are nothing but the actual value stored in the XML. So let me talk about three rules in this given example student is a root element. Then first name last name and email are descendants of student. This is pretty much straightforward when it comes to tree so you have a root node and you have descendants and we can see from the structure and sisters in this example student is ancestor of all other elements, so root node, so it's ancestor of all other elements within this tree order XML attributes you can have attributes. Which are common across or you could have some attributes defined within an element. So here we can see that message. That's nothing but an XML with the root node messages and you could see individual messages within so there are two messages here within messages Tab. And the first one is to any and it's from John and you have a body there the actual body of the message what you want to send and you can see here this ID or this something that has been provided as an attribute, which is nothing but you could see Mi di is equal to 1 that's attribute has to be enclosed within single quotes or double quotes. So whatever you see within the element and closed within codes that is nothing but attribute so modifier, you can say some kind of a modifier to your element. So attributes add more information about the element it is adding some more Formation to the element XML attributes must always be coated either. It should be within single quote or you could have it within double quotes here. We have it within double quotes for our XML comments. So to make it more readable or to increase the maintainability of an XML so that someone else can understand what you are trying to do you could have comments put in so this is pretty much similar to comments in other languages. The reason why we rationale behind why we put the comments it's more about make it much more verbose and understand what bag is all about how we comment is nothing but you have opening angle bracket. Then you have exclamation mark then two hyphens and after the - you have the comment and once you have the comment you close it with double - and then closing angle bracket. So one thing to note here is exclamation mark, is there only when you start the comment and at the end you don't have Exclamation mark double - and then closing angle bracket similar comments are just like HTML comments comments are used to make the code more understandable. What are the rules? Do not Nest a comment inside the other comment? Okay, you can't Nest it. And I don't see any need to nested was your just expressing it or we are just adding comments to make it more readable. So if you nested it would give you an error do not use comments before and XML declaration XML declaration should be the first line. You shouldn't be using comment before that comments can be used anywhere in XML file except attribute value. So you can't put comment within an element or you can't put it right after the element is defined or say, for example, you have this message tag, right which starts with angular bracket and then message and right after the message. You can't have comment your element tag has to be closed after this closing angular bracket you could Any comment but it cannot be within this space wherein you define the attribute so basically comment can be put anywhere but it cannot be as attribute value. So let's see a well-formed XML and what do we call well-formed XML as there must be exactly 1 root element and XML should have exactly one root element. You cannot have multiple every start tag has a match intact. So we saw in the previous example, like if you start student you have to ensure have an intact for student as well. So that's what it is about every start tag must have an end tag attribute must be coated either with single quotes or you could have double quotes comments and processing instructions may not appear inside a tag cannot be inside a tag and you have opening angular brackets or and must not occur inside a data element. Your data cannot have this as value or your data element cannot Contain this as a part of the name of element. So let's move towards XML validation. So well-formed XML can be validated against DTD or xsd. So communication between multiple systems you have to ensure plant is sending data or is kind of you know, preparing an XML which is aligned to what server expects right? So that's where you have decreed in the and xsd. Let's see. What is D TD. E TD is a EB NF grammar defining XML structure. It's a normalized form at grammar, which defined XML structure a DTD defines a legal element of an XML document. So it says what XML can contain what an element could be or what the attributes could be and it's a legal element. Okay. So basically when you define a DTD you can expose the service today, which could be used by Tomorrow right? Google can be using it for some purpose. So this is a legal document saying that my service expect or accepts the times 1 so format, so you have to send it in so-and-so format for us to process it through. All right. So it's a legal document between multiple organizations XS T is nothing but used to address the shortcomings of DTD uses name space to allow for reuse of existing definitions. So you could Define an xsd and you could just use it or through name spacing you can have it within other pieces of xml's as well. So, let's see. What is GT D PT d stands for document type definition. DTD is used to define structure of an XML document or DTD defines the legal elements of an XML document as we spoke. It defines legal elements, or which cannot be Accepted so basically you define what your XML is all about through DTD so you could see a student DTD here. So you have XML which is nothing but which has student which has first name last name email and marks. All right. This is what you have within your XML. Now you define a DTD which could be put into your doctype. So the first tag that you see is nothing but declaration and it's linking your kind of tying it against a DTD with that's defined external DTD file. All right, you define this and you have a DTD file below which is student dot DT D. And here you can see that it says that within student element you can have for other elements or as a nesting of for other elements, which is first name last name email and marks. All right, if you since this DTD is linked with your document or with your ex. Mel document now if we try to add something if you have one more element here which could be like a dress right? If you have one more element here, which is address. It would throw you an error because your ETD says that student can have only first name last name email and marks address is not a valid element within student. All right. First name now, let's define. What can we have in first name? Alright. So first name is nothing but character data again. Last name is a character data email is again a string and Marx is again taken as character sort of so this is how we Define DTD. Alright, so we are trying to establish the structure or we are trying to say that student can have a nice one so fields and if there's something else then it's invalid. So here we can see ETD contains root element and declare the child elements we can see That it says student can have only first name last name and email and marks. It defines last name child element and data from this element is possible right when it is PC data. It's possible again you have first name, which is possible you have last name, which is possible you have email address which is possible and you have marks which is possible. All right. So what is XML schema XML schema is used to express constraints about XML document. All right, it's pretty much it does the same purpose as DTD but it's much more advanced than DTV. It has much more features XML provides more control on XML structure a well-formed XML document can be validated against xsd. So you have an xsd again similar to DT which defines the structure and a well-formed XML should be validated or should be Against a particular axis T. So here we see an xsd, which is much more verbose or which is much more clearer to understand compared to DT DT D was something like was not expressing to that extent but X is T is pretty clear in terms of what the content could be. Again. It defines the root node and declare the child elements. So here you can see that exists is defined in a form of XML itself. All right, it follows the same pattern as the XML. So it says element which is a keyword. All right element is a keyword for your xsd and you have student as a attribute. So this you could realize xsd as I said as an XML itself, it's a valid XML cracker, which says that you have an element with name student now what can students hold is again a sequence when you say sequence it has to The same sequence break the sequence it's again going to be invalid then it says first element first child element within student should be first name. The next one to follow should be last name. The next one should be email and the last one should be marks. All right, and it defines what type is particular elements hold. So first name is a string. Last name is a string. You may raise a string and Marx is a string as well. So this is how it is you define a structure to the XML and you have to ensure for your XML to be valid. It has to be valid against this exists e it's a similar scheme are descriptive. So what's the difference between DTD and Xs T DT v stands for document type definition XS d stands for XML schema definition. DTD is not extensible access T is X Zebra dpv provides less control on XML structure xsd provides more control on XML structure. ETD does not support data types xsd supports data type. We sort the data types like string and stuff which is like it supported just in exist. You don't have DTD supporting and DTD does not define the order of child elements as we could see it just says that you could have four elements within but it doesn't have any specific order as such whereas when it comes to xsd. You could Define a sequence right as we saw in the previous example, we said that the first one should be the first name, then the last name then email ID and then marks so you could Define the sequence in which your sub elements should occur XML CSS file CSS is used to add more tiles to the XML document. So if you want to color coded or do something that's when You CSS pretty much similar to HTML document. So here we can see that you could Define student which has got a background color of pink. Then you have first name, which has different font sizes here. First name last name and email ID and marks which has got different font sizes. So we want to have font size of 25 for this child elements. You want to display it as a block and color as white and the margin left as 50 pixels. All right, when you have such thing defined if you want to link it up if you want to link CSS to XML, you need to have a XML stylesheet tag defined and you would type as text or css and you put H ref as your CSS name to make the changes in the styles of the XML file CSS file is linked to XML file through this statement. So this is how you link your CSS file to your XML file. Now. What is XS L XS L stands for extensible stylesheet language XSL navigates all the nodes and elements and display XML data in a particular format. All right, it's basically for parsing sort of it navigates through all the nodes and elements queries can be specified in XSL. If you want to query some particular data or like we had message this thing in a couple of slides back. We saw multiple messages within message, right? So if you want to read some messages extract the messages that are sent by the users you could wear it out using excessive it displays data on the browser as per the format given in the Excel file. So, let's see what is accessible file all about. Okay. So here what you're doing is nothing but you're extracting data. All right, you are. Acting first name. So the first name here would be taken from your student and would be displayed here. And again the second one you have last name you select the last name particularly. This is acting upon student dot XML. All right, how do you link up accessible to XML is pretty much similar to CSS. You have style sheet and you have type as text / XSL and not CSS, right and you have H ref as student accessor. So that's 4X s l-- and again, let's see. What's the difference between CSS and Xs L fi CSS files are easy to understand Excel files are difficult to understand CSS is less powerful than accessible CSS is specifically for display right changing the font size changing the colors background colors and foreground color and everything XSL is more. Full then CSS since you can extract data or do something with it. Basically, it's a processor. You actually can process the XML using Excel CSS does not use XML notations Excel uses XML notations, which helps in writing code. CSS can be read by modern web browsers XSL is not supported by many web browsers. Now, let's talk about XML parsers. Okay. So XML parser is nothing but you parse through you have an XML and you want to read data from it or XML parsers could be used for writing the XML as well. Okay, creating an XML could create an XML using XML parsers as well or you could read through the existing xml's. So an XML parser is a software Library which provides client applications to work with XML document and XML parser is used to check whether the Comment is in well format or not. It is basically used for compiling our parsing your XML as well. It is used to validate an XML document and parsing XML refers to going through XML document to access data or to modify data in one or the other way. All right, you could actually read through the xml's or you could extract data or you could modify data using XML parsers. What a bar says here. You could see XML document right being sent to the parser parser is nothing but API so you send the XML The Source XML or the XML that you are trying to pass is going to be sent to the XML parser and this API is going to be used by client application right to parse the XML files. So XML parsing could be broadly classified into two different types one is object-based and one is event-based right object-based is nothing but document object model or it is also known as Dom even base. We have two different parses when it comes to even based one is sacks and the other one is tax. All right, so let's talk about object based model Dom parser. It stands for document object model. It is an object-oriented representation of an XML parser tree. So remember we assign XML and we passed it into a tree like structure where in your root node of the tree was the root element from your XML and we had all the elements and at the end the leaves were nothing but the values or the data that the XML stores actual values right or XML stores or care. Rather, so that's what trees all about. It defines the standard way to access and manipulate documents Dom is a common way for traversing the tree. So as we look through the examples, you should get Fair idea about it creating an XML document using Dom parser. So what is required to use Dom parsers? How do we do that? First is you have to import all the parsers. You have to import all the classes that you have within partial Java x dot XML dot parsers. These are all input statements that you have. You have to import different packages which when you use IntelliJ or Eclipse, it would prompt you to import it it would suggest you to import it. So you did not actually write this input statements, but it's very important to understand what we are trying to do here. So these are different packages that we are trying to import and as you could see all your XML related classes. Are put into Java x dot XML dot transform or basically G of x dot XML package. So once you import it, you can start using the classes within the first thing that you do is when you generate an XML, you have document Builder Factory, so you have document build a factory dot new instance. You create a new instance of it and you get document build a factory that's instance of it. So now with the document Builder Factory instance that you got you would create a new document Builder Okay. So this is a factory design pattern. We have a design pattern in Java and document Builder factor is nothing but it's following a factory design pattern, right? You don't have to think much about it. But basically what we are trying to do is instead of creating the instance of something on our own which is like we usually do with new and the class name, right? Sort of doing it on our own Factory design pattern is nothing but the creation logic is written within a class which is not exposed to you. So you need not create it there's some class which creates instance for you. All right, and that is nothing but a factory class then you create a document Builder. So it's nothing but F dot new document Builder. Okay, you handle exceptions and everything here. So now let's start with creating the actual document. You have the root element as students. All right, and within student you have student within students you create student and within student you have like first name last name email and marks and you could see first name put as Henry. So how do you create element is nothing but using dog create element, how do you create X node or text node or the actual value that you have? Then your element you would do it with create text node, and you could Nest it using appendchild. So basically you have first name appended to T1, which is nothing but this one right T1 is appended to the first name first name element that you have T2, which is the text node, which is holding. The last name is appended to the last name element p 3 is appended to email element and the for which is your marks which is appended to Mark's element. So basically this is how you make nesting of your nesting within the xml's. Alright. So once you create this document you append all the child's and everything you create a well-formed document here. Are you create an XML here and all the XML that you would get is within this dog, since we are creating element you could see here we are. Getting elements within doc creating elements and text node and everything within dog. So at the end once you have all this done, you would have a well-defined XML stored as a form of document class. So we want to print this particular document in a text format, right which could be readable by us or do you want an XML out of it? So that's when we use Transformer. So there is a transform Factory dot again since it's a factory design pattern. It's exposing a method which is nothing but new instance. So you create a new instance of Transformer factory and you create a new Transformer. So at then what you get is nothing but a Transformer and what are we trying to transform is nothing but we are trying to transform the object or the document object that we created. We are trying to transform it into a human-readable text file or the XML file all So that's a transformation that we are trying to do here. So here you could see that you transform it TDOT transform and you pass the document object that you created and put the element into element and text notes and everything into which is holding a valid XML. You are trying to transform it into a XML file. So how you do that is T dot transform. Then you have the new Dom source and you specify the instance of document which holds your XML then you have stream result and new stream result class which takes file output stream as its parameter. So you have to pass the parameter where you want to write this XML to and when you run this at the end, we are just printing that XML file is been generated. The first thing that we do is we are creating a document and using the document. We are creating elements the wave that we want. So in this case, We have a students as the root node and within student you have student and within student you have first name last name email ID and marks, right? We created this structure till here. And as you could imagine this is just dealt in the form of object. Right which is stored in dog. So now since you want to write it into a file, which is into a human-readable form or which could be passed across Network. You have to transform this into XML file, which could be read. So that's what we do here through Transformer. We are transforming your document or the XML which is in the form of document into a file. So, let's see this program. In the meanwhile, we can do one thing. I will create one more directory here. At Eureka XML. Okay, and we don't have any files with them. Yeah, let's hold on for a minute. Yeah, I just come up. All right, so it's the same program that we spoke about. So I have loaded into my ID. So we do the same steps here. We create all the elements all the required elements and stuff. So we are writing it into a file right so you could have your own file here, whatever file you want to write into. okay, so I right into the directory that we created which is nothing but Ed Eureka XML we are writing the XML file there. All right, let me execute this program. It's building it and if it's generated you should get XML file generated at the end. So this is about using Dom. All right. So when you say Dom it's nothing but document object model its building it. So hold on for a minute. In that see I think it should come up soon. Right. I think it's coming up. Alright, so we have this program here, which is kind of creating XML document. This is same as what we spoke in the slide. Right what I walked you through. So basically you have students you're creating students elements within students element you are going to have student and then first name last name email and marks. Alright, we are going to create a text node within this elements. So this is nothing but your first name, which would go into the first name element. This is the last name which would go into the last name element that we created earlier. Then we have email and marks going into a prospective element. Alright. So basically we are nesting it here at the end. We have the Transformer which is kind of taking the document and converting it into XML file that we want. So let me go and delete this off and run the program. In this folder, we don't have any file right I run this program from here. So you could see that it says XML file generated. All right. So let's go to the folder and see up there is a file that's generated that is student studying similar. Now I can open this with any tool say I open it with notepad and I see something like this right now. I want to format this I want to format this into because this is like one single string, which is Big right? So if I want to format it, we have tools that are online, even you could format it online, right? So I put this and I say I want like three spaces or indent level which is good and I formatted okay when I click the format. You can see that it formatted the entire XML for me. So the basic thing that it's doing is just about formatting this XML. All right, this is much more readable right after formatting. You can see that it's readable can see first name as Henry Lee and Henry 123 at gmail.com and you have 70 put in here, which is what we expect out. Okay. So we saw this output after running the program Now quickly. Let me run through what's Dom parser and how do we use Dom parser for parsing and existing XML? All right. So these are the classes that you need to import which would be suggested by your IDE as well either IntelliJ or Eclipse. So you have document Builder Factory you use the same thing get the new instance from the factory where in you get an instance of document Builder Factory with this you create document Builder and once you have the document Builder you parse it Boca parse method The document Builder and pass the XML file name, right? So whatever XML you want to pass you would send it across now. Once you have this past if you want to get the node name if you want to display something like what's the root element within your XML you could do something like this talk dot get document element and get no name. So this would basically display the first element that you have within your XML, which is nothing but the root element right you could read this on the name. You have the tag names or element name. So you have methods like get Elements by tag name and you could give the name of the element and it would retrieve it as a node list. Now, you will have to I trait through this node list to display the contents of it. All right. So here what you do is you I trade through it. So when you get a node list, basically you would get list of notes. All right. So now what we are doing is we are printing it out one by one. Printing the nodes are the contents that we have within one by one. So in this case, you can see that when you do student dot get Elements by tag names and you can see student here. So this would give the number of student that you have within a document the previous example that we took the number of element is just one right we just had entry for one student. So it would I try it. Just once in this case it would I try it just once all right. And what we are doing here is we are kind of taking again element by tag name and these are nothing but your actual values or the first name last name email and marks this Loop is going to run just once since we have only one student and this is how you display the content of an XML. So basically what we are doing is we are parsing it when we say parse we are trying to get data or we have trying to load data into Dom or document. And we are printing it out. Why do we have parsers is nothing but to retrieve data if you want to query out particular data, you could do it. You could write some logic to read out a particular data from an XML. Say for example, you might have a long XML and you want to read data pertaining to student Henry. So what you could do here is you could write some logic here saying that if student is equal to Henry then written mock secured by Henry. So that's why we have XML parsers in picture to have it loaded into memory and play around with it. Alright, so let's see the example of XML reading using Dom I give the path here as see Give the same file. All right at Eureka XML. Student dot XML that we created or let me do one thing. So I create one more student here. Say for example. Just for Simplicity purposes. I'm just putting test last name as the last name test email and I put test Mouse. All right. So these are the values that I have put for one more student that I've created or maybe I will put this one as Just to be consistent. So we have two students now within so first one is Henry D. And the other one is like we have created a test to let me show you when we run this program. What we are trying to do is we are going to read this XML that we have created and it's going to parse it parsing is nothing but it's going to display the contents of it. So it's going to Loop through its going to understand there are two students within and it's going to display first name last name email and mock secured by each student. All right. It says the processing instruction. Okay, we can see the output being displayed here. All right, so we can see two students here the current element and really calm and re 1 2 3 gmail.com and 70 and there is one more student that we added directly into the XML and we can see it displayed as well saying that test first name, press last name test email and test marks. So that's how we bars it. Okay using Dom parser and what Dom parser does is nothing but it creates a tree if you remember I said it creates a tree like model that was there in one of the slides that we discussed earlier. It creates a tree-like structure with a root element as your root node, and your leaves are nothing but this values Henry Lee and all this stuff whatever is been displayed here or nothing but leaves so of your tree advantages and disadvantages of using Dom it is preferred when we have to randomly access separate parts of the document. So if you don't want to do it sequentially its preferred that you use Dom it supports both read and write operation. So we created XML using Dom and we read XML using Dom as well. So the first example that we took about creating student dot XML was using Dom as well since it was document. Remember we created object of document and then we inserted all the elements within that is nothing but Dom it supports both read and write operation as we saw and what are the disadvantages of using it. It is slower than other parsers since it has to create free. So it's a one time activity that it does. So remember in the second example that we took we saw parse here, right the sparse here document Builder dot parse this is going to take lot of time because it's going to create a tree if you XML is big enough based on the size of the XML it would take time because it's going to create tree. Parsa's something that is going to take time and it's not very memory efficient since you could imagine if you have a big XML so xml's in general are like it could have like a hundred million records within they are humongous. They are not small examples that we are dealing right now. It's coming from different systems, right? So you could imagine their system pushing data in the form of XML and sending it to some other system to process it. So it could be humongous could grow up to like a hundred million records or something of that sort. So imagine that you want to load all this into memory, right? I'm create a tree. So this parse method is going to take a long time to create a tree and the other thing is it's not memory efficient because it's going to load this entire document into your memory, right which is going to take like lot of achebe's of memory right to load it. So it's not pretty memory efficient when it comes to parsing using Tom. So that's the reason we have other variants of parsing which is not document object model, which is basically event-based. So we have like two parses even base parser one is like for push parsing it is sacks and whereas for will parsing it is Stacks. All right, so we'll just go through what is sax parser and sax parser sax parser is nothing but it stands for simple API for XML sax parser reads XML file. Sequentially. It's an event-based right? So when I say even based what happens is when a parsing event occurs, the parser invoke the corresponding method of a corresponding Handler. So basically you define a Handler you say that if I get so and so tag or if I get start of element tag go to this particular Handler. All right, and this handlers are nothing but user-defined handlers so you could say that Not get a start of element tag. Go to this Handler and do something, right? It could be as simple as printing it or it could be as simple as filtering it. So it's up to you to write the logic for the Handler but what the framework does is nothing, but when you see a opening tag, it would give a call to your method. Alright you Handler method sax parser is used when we have a large XML document. As I said in the previous example of you know hundred thousand records that you have within XML file document object model is not that efficient because it's going to load everything into the memory which is going to take a lot of time as well as memory, which is going to consume a lot of memory. So it's not good in terms of time and space complexity. Whereas Sachs does a good job when it comes to large xml's when it comes to parsing large xml's because it's not storing or it's not parsing everything into a object in one go. It's an event. Just so basically you would see that it sequentially goes through the XML and as and when it sees something right start of element start of an attribute or anything of that sort. It would give a call to Handler and Handler would process it. So basically it's not storing anything. It's not retaining any information into memory. It is just calling the event handler and just leaving it right there. So since it's not consuming memory, it's good when it comes to large xml's but it's not good for random search right random parsing because it goes sequentially so for sax parser again, you could see the files present in Java x dot XML dot parses dot sax parser earlier, it was document and here it's sax parser again. You could have this Imports done by your ID. This is what you event handler is all about. Right? So you are defining a an event handler here, which is nothing but a default Handler so Your XML reader using Sachs is nothing but a default Handler is a relationship is a default Handler you extended your extending default Handler, which is maybe an internal interface to your sax parser. Once you extend it. It's not an interface or it since it's extending it has to be class. All right, it's a class. So the default parser or the default Handler would have this methods within which is nothing but start element you have characters you have end element and end document. So these are the methods within right when you give a big XML in this example or when I say this one, so when it comes to student, which is your root node, it would go to start document when it reads this XML. It understands that it's a start of document. So it says document begins here. It would go sequentially this parser what it would do. Is it would read this entire file and it would go sequentially when I say sequentially then it would understand that there is an element again and it would give a call to start element and here what you could do is you could print it. So what we are doing here is nothing but we are printing the XML document using sax parser. All right, which is event-based whenever a particular event occurs in your XML. It would give a call to the particular Handler. So whenever there is a start of document in this case a student is a start of element again, which would go into start element. All right, when does it come into characters is nothing but when it encounters Henry when it encounters Henry, it would go into characters. All right, you see a character's method here. It would go into characters and you can see that it's a character array. Alright, so here it would print the entire array which is nothing but the value. Lou Henry and all this Leaf nodes. All right, Henry Lee and whatever values that you have would be printed by this characters method whereas the tag names would be printed by your start element and end element. This would be your end element. All right. So this is pretty much like it's an event-driven one, whenever it encounters something framework gives a call to a particular method and this method is user defined you could do whatever you want to so this is how you create a instance of it. So you have sax parser Factory dot new instance dot new sax parser. You create the instance of sax parser. Now you parse it P dot parse and you provide the Handler as well then let that you have provided which is nothing but XML reader using sacks. That's your Handler. So you have to create the instance of it and pass it over. Let's see this program now also you could see it is reading students dot XML, right? So I'll have to change this name to see. Ed Eureka XML All right. So let's run this program which is the same program that I spoke about in the slide, which is even based you could see methods implemented here and you could see it extending default Handler. All right. So there's a default Handler this start document basically start document and everything is coming from your default Handler. All right, and in the start element, we are just printing It characters and again when it comes to end we are ending it and when it comes to end of the document we are just printing saying that document ends here. Alright, so we are reading the same student file and this time it's using sacks. So you can see here when it encountered start of the document. It printed document begins here. Then you could see elements printed sequentially. So this is what it is. This is like event-driven right and at the end when it reaches the end of the document you can see document and C are being printed out. So basically this is as I said even driven and this is sequential, right it goes line by line. So if you say you have like a hundred thousand records within your XML and say the last entry that you are searching for it's going to go through the entire XML delete encounters the last any when it comes to random search or if you want to search randomly if it's not well suited but when it comes to Big XML, it's much better than Tom since it's not loading anything. So it's not keeping anything into the memory. It's just parsing it it just printing it out and it leaves it right there. So what are the advantages of Sacks, it is simple. It is memory efficient. Sax parser is faster than any other parser. It handles large document. We spoke about all this right here disadvantages of using is land will be unable to understand the whole information because data is broken into pieces. So it's not storing it in one place. It's broken into pieces. It's not even storing it into memory just flushing it off. It's just writing it and leaving it. So what's the difference between Dom and sax parser Dom stands for document object model Sixth and four simple API for XML Dom reads. The entire document sacks reads node by node, which we saw sequential. It would go Dom is useful when reading small to medium-sized xml's Sachs is used when big XML files need to be parsed. Sax is good for big and this one Dom is used for Two medium sized Dom is tree-based parser. We saw it creates a tree and sax is event-based far sir. We saw how it has event handler and you saw that it calls a particular method based on the event that it encounters Tom is little slow as compared to Saks and because it has to create the entire tree and sax is faster than Dom once the tree is created. I think Tom would retrieve it much faster than sacks. But the tree creation itself takes longer time, right when you parse it. It has to create a document model which takes a lot of time Dom can insert and delete nodes since it has entire tree it pre-loaded. You could actually go and delete it you have the entire tree loaded so you can Traverse to any particular node and delete a particular node or delete a part of a tree itself, which means that you could do insertions and deletions whereas sack Doesn't store anything in memory just reads there and just pushes it off. So you cannot insert or delete nodes into your Source XML. So basically it's meant for just doing something or retrieving information from your XML. It cannot manipulate the source XML sax parser is cannot manipulate the source XML now we have one more which is Stacks. So in terms of sacks, if you imagine sex, it's a push API. All right, when I say push API it's nothing but it reads through scans through the XML and when it encounters an event, it pushes the Handler to handle it. So there's a push from your API to the handler do perform some actions whereas Stacks it's a cool API, lets go through it to understand more stack stands for Java streaming API for XML sax parser pulls the required data from the XML this Sax parser maintains a cursor at the current position in the document allows to extract the content available at the cursor. So basically it maintains the cursor at the current position in the document which allows it to extract the content available at the cursor again, you could see Java x dot XML dot stream in the first one the Dom we had document the second one. We had sacks. Now the third one you could see stream. So that's the beauty of packages you could understand what files are there with them? Okay. So using Stacks you could see here. We create an event handler XML element Factory dot create XML event handler and new file reader. So you pass a new file reader and it's nothing but the XML file that you want to pass. Now, you could see that you get all the elements. So basically you have even Trader and you get the elements of front or you get all the events that you have. Then and XML. All right and UI thread through it. Now you have a switch statement which would do the processing for you which would say, for example, you have a start element similar to how we saw in the sax parser. So you have a start element and if it's a start element and even would be passed and you could actually get the element value. So basically what we are doing here is we are getting all the events and we are iterating through it and we have a switch statement which is handling the event. So instead of having the event Handler written in a separate class. We are writing the event handler in the same class. This is kind of again decoupling right? So imagine yesterday. We spoke about comparable and comparator. So comparable was like compareto method was written within your class right within your model class, which was student yesterday. All right. And again, we had other example of comparator which had a compare method which was Into student objects as an argument. So that's the difference. Right? So we are decoupling it. We are writing the entire comparison logic to a different class so we can we can imagine the same here. So that's what the difference between Stacks and stacks is Stacks is writing it within the same class. Whereas sacks you have a separate class for event handling so you could see here pretty much similar to how we did in the sacks so you can have like if it's a character then you have even - characters you print the characters when you encounter and document you have event as in document and so on basically you get all the events and you I trade through it and you have switched treatment handling the event. All right, so I take this example. So the first thing that I'll have to do is change the file name. Ed Eureka XML and I just run through it. Alright, so here we can see start element student. You have first element as Henry and so and so forth again, first name Henry and stuff like that again. You can see the same second student being parsed as well which was a dummy student that we inserted and at the end you will see end of the element student. Alright, so this is how we parse using three different parsers and we saw about advantages and disadvantages and which one would be apt one per your use. All right. So you have to understand the nature of the application or nature of the XML is that you are dealing with and based on that you could decide which parser to go for so that's about the parsers. Now, let's talk about XPath XPath expression is a query language used to select path of XML document based on the query string. You can create a query string and you can retrieve Wait using X bar X power threatens a node set representing XML nodes at the end of the path red. So this is basically like wearing language or you have X path expression, which you could write query in this example. If I want to get first name of a student with so-and-so marks if I want to get a first name of student with 80% marks, right? I could do that using XPath. So basically it's for querying right and it returns a node representing the XML nodes at the end of the path. It is used to Traverse elements and attributes of an XML document XPath defines the structure and provides XPath expression. So the 7 type of nodes that can be output of the execution of XPath expression is root element text attribute comment processing instructions and namespace. We'll take a look at it expert defines a pattern or path expression to select nodes or node sets in XML document what I expect Expressions you have node name, which is used to select all nodes with the given node name you define a particular node name and you could select all the nodes within an XML document that has named as node name. So it could be either element. It could be attribute or anything, but it could be just element named rather. It specifies that selection starts from the root node. If you have 1/4, it says that it starts from the root node. It specifies that the selection starts from the current node that match the selection. All right, so / scans the entire document / / is nothing but the current node dot it is again select the current node. So whatever node you are at during parsing, it would print it out dot dot is parent node. And at the rate is it selects attributes. So if you want to carry out certain attributes like at the rate ID is equal to 10 say the employee IDs been stored as an attribute and if you want to have employee ID with value hundred you could query out saying that at the rate ID is equal to hundred steps to use XPath again. You have expert related packages. You have to import you have to create document filter. You have to create an XPath object and XPath path expression create a document from a file or a stream. So basically when you are creating document is nothing but it's a dom-based parser. Oh, basically it's not well suited for big xml's for small or medium-sized XML. It's good enough because it's creating document out of your XML then fourth create an XPath object and an XPath expression. Let's do you have to create object and you have to pass the expression that you want to retrieve compile the XPath expression first, you have to ensure that the XPath expression that you have provided is up to the mark and it doesn't have any error and you're following the contract that XPath expression has I'd rate over the list of nodes. Once you get the result of the XPath expression you have to I'd read through the list of nodes, which is nothing but the result and examine attributes and examine sub-elements, right? That's a typical way in which you would use XPath so you could see here. It's again Java x dot XML dot X path. There is a separate package for it and it will have all the classes related to it like expat Factory you have constants and you have like exception and you have expert class itself here. We are again parsing students XML we pass it into Document first as we mentioned the steps that we spoke about we create the document and then you apply the XPath you have expression here / class / student. All right, and then you compile this expression what you expression you have here you compile it and you then evaluate it so evaluation is nothing but you are retreating to the result and you are printing out the result that you got to broadly classify. What we are doing here is we are creating a document object out of the XML file and the next step that we do is we compiled the expression and then we are evaluating it evaluation is nothing but doing something with the result. There are a couple of checked exceptions that you will have to take care of so you could see that it's been handled here. It's not specifically handling. It is just printing out the stack Trace. So let me quickly. The take this example. Alright, so from here go to resources. So let me go to documents downloads. And it's let me run through the same example and see if it runs. Alright, so we have I take the same example c letter c at Eureka XML Okay, so, let's see if it runs. It in fine dot txt size change this to XML. Okay, let's try to run. So what I am doing here is pretty much passing this XML and then reading it through. So basically just to again tell you I love to see why it's not running at this point, but it's more about you just created document model. You have your XPath set or you have the XPath expression you compile it and then you evaluate it which is nothing but whatever results you get. You can do something on it. All right, let me move on to the next slide. Dom4j is open source, Java based library to parse XML document dom4j is flexible and memory efficient. It integrates. Well with Tom Sachs apis, it should be used when you need the information in an XML document more than once. So basically with sacks if you want to pass through more than once if you want the information from the same XML more than once it's not that efficient because it will have to parse it again. So it doesn't store anything. It has to go through it again. Whereas this one is something that integrates well with dom and sax apis, which allow developers to use the information in an XML document more than once. So what are the steps? So basically you have to download this dom4j dot jar from the website or from the GitHub. So there's a GitHub mentioned above so you'll have to go and download the latest version from there. So once you have that Library, this is a common thing that you do in Java. You download a jar file. You can go and download any particular jar file that you opt for when I say jar file. It's nothing but the third party Java archive, which is nothing but it's a group of classes together doing something. You can download any jar into a specific directory and you can add it into your application. There could be a third party say for example, I want to add two numbers or say, for example, you want to do some big data processing a Java by itself doesn't have a big data processing library or framework. So what it would do is Big Data framework will have a jar file exposed. Right which is z for example Apache Apache is a provider which is providing solution for big data, right? So you would have the libraries or you would have everything coded into a jar file for big data processing now you need to import that jar file into Are you need to link up your application to that particular jar file to leverage big data processing in application. So in that typical scenario, what you do is you would have this jar files downloaded into your local directory and have you could add those external jar files or this is how you link to your applications. All right. So you go to Java you right click on your application go to build path. Then you click on Java build path here. And then there's a button here to the right which is ADD external jars. You would have a jar file in this case dom4j 2.1 dot o you have this jar files here. Now you link up to your application and you click on that and you click on open that would add the jar file to your application and you can apply and close. So now you could leverage that particular jar file or the functionality that is exposed by the jar file into your application. All right, in this case, it was dom4j introduction to Jack's be Jack's b stands for Java architecture for XML binding. It's a specification. Actually Jack's be is used to write Java objects into XML and vice versa. All right, so you could write it or read it. What are the features of Jack speed supports for all w3c schema features read all the standard w3c standard and all the features that you have in w3c. It has a support for it. It reduces a lot of generated schema derived classes. It cut Downs rather on the generated classes scheme are derived classes small runtime libraries in terms of size. It's pretty lightweight it provides additional validation support by jxp, 1.3 validation API. It steps to convert Java object into XML create a pojo or bind the scheme. And generate the classes. So basically Jags B is nothing but from the schema, you can create your class. All right, if you schema says like remember we had an excess T wherein we saw that it was like an XML which you could read through like you could have the schema if you remember we had a student schema wherein we declared this is what the format of XML would be you could have the name you would have student as a starting tag. We defined the sequence as well. Like first name should be first then last name then email address and then marks right? We Define the sequence as well. So that is nothing but that's a schema. That is XS T. So when use Jack's be what you do is from the schema, you can create Java classes. So basically schema is nothing but schema tells this is what an XML can contain and from schema. You can have Java classes created so there would be a Java class by the name student and within student there would be spring so We had the data type Putin in the exist as well. Like first name would be string last name would be string and stuff. There's a mapping between this data type and Java data type. What it would do is nothing but it would create all these properties or all the properties that you have all the elements of elements that you have within student. There would be a corresponding property created in a Java class. So basically this Java class could be thought of as a container for your XML, right you could parse them into this Java class and that's where Jack's be comes into picture. It's a binding it binds your XML into this Java classes. All right. So create Jack's be context object the so the next step is to create Jack's be context object. Then create the Marshal ER objects. You have to Marshal and unmarshal. So in this case, since we are going to do from pocho into XML, it's going to be Marshall method. All right. Create the content free by using set methods. All right, whatever. You want to set your going to set it into Java object. So unlike earlier in the Dom example that we took we were actually creating the tree. If you remember weapon child and stuff like that, which makes it very difficult to understand right which is difficult to maintain and if you miss something it's cumbersome to actually maintain it. Now, you have a student class wherein you just have to set into the student class. All right, so create the content free by using set methods and then call the Marshal method to convert this class into an XML. We have a student class and within student class. We would have all the properties created which is derived from your schema class from your schema xsd or rather scheming existing mean the same and what you are doing here is you are going to set it in to set values that you want in the XML in. The instance variables in this class student and we are going to Marshall it to convert this into XML. So basically rather than creating XML on your own what you are doing here is you're using the Marshall method to do it. So once you Marshall it, you should be able to get the XML. So let's understand Jason. Jason is nothing but JavaScript object notation. We will look at the format of it very soon. It is easy to read and write than XML XML is bit cumbersome when it comes to reading and writing and it takes occupies lot of memory as well. Jason is language-independent similar to XML. It's language independent. It is lightweight compared to XML and which is nothing but lightweight data interchange format XML is a data interchange format as well. And Jason is pretty much like the same used for data interchange. The medium of communication between two different systems Jason supports arrays of objects strings numbers and values. So most of the rest API is restful apis, which is nothing but a web service built upon HTTP. Mostly they use Json for communication between client and rest API systems. So this is because it's pretty lightweight and it's lighter compared to XML and as you could imagine since it is across networks since communication is happening across networks. You need to have lightweight system or lightweight medium or else it would occupy lot of the bandwidth between communication just because it is lightweight. It's preferable interchange format difference between Json and XML Json stands for JavaScript object notation XML stands for extensible markup language. Jason is simple to read and write XML is difficult to Then rate so we have been looking at the examples which were not pretty straightforward. Right? We had a lot of code to be put in so it is difficult to read and write Jason is data-oriented XML is document-oriented. Jason is less secure than XML XML is more secure than Jason Jason supports only text and number data type XML supports many data type as text number images charts graphs Etc. Alright, so it has restriction with the number of data types that can hold Json object holds key value pair. We took example of student earlier the form of XML, right? We're in new head. First name last name and marks. This is the same example, but in Jason, so here you could see opening brace and closing brace and you could see student is a key and followed by colon and again, There's opening brace and closing brace for student which means it is saying that student is object if you have value as which starts with opening brace, which means that the object the second one is as you get deep into this particular object wherein you see first name, right? First name is the key and you see a literal which is Henry as object as the value rather and as you can see here I Henry is not object. That's why you don't have it within braces, which means it's a literal value. Alright again, you have last name and D'Souza which is a literal value you have marks and 50, which is a literal value just to summarize whenever you have: to the left side of the colon is nothing but the key the right side it's a value and if you have a value starting with coats, which means that it's objects a complex object or you have multiple things with So in this case, you could see that within object. You have like three things put in like first name last name and marks basically student can be mapped to some object in Java which will have first name last name and mouse. So each key is represented as string in Jason and key is always string in Jason and the value can be of any type Json array represents order list of values. It is always ordered. Json array can store string number Boolean or objects. It can have string it can hold number it can hold Boolean or any other object as well. So here you can see the first example is array representing days of a week and you could see Monday Tuesday Wednesday, Thursday, Friday Saturday and Sunday put in there, right you could see another example is students and within students you could see it. Students is nothing but array of student and each student has first name last name email. So basically this is how you could interpret it. So students is nothing but it's an array. So the key is to dance here. Let's see how to run it. So the first thing that you do is Jason simple, so you can see here jar file is already downloaded which I would be using so we have like Jason simple. All right, so it's not there. Let me see. So whenever you want to deal with Jason's the first thing that you would do is you have multiple apis though, but the slides to come we are referring to Jason simple jar. So the first thing that I would do is I would download Jason simple jar. All right, so I go. So you could go and download this Jason simple jar. Okay, usually nowadays. We don't do this because we have other we need tools like mavin mavin is a build tool and you have a file XML file wherein you provide all the jars that you want and it would download it by itself. So it has got a repository from which it would download all the jars. You don't have to explicitly put it but I don't want to confuse at this point with Maven. Let's do it this way downloading it and then linking it. All right, so it's connecting. Basically, we are downloading the jar, right and you could see it has downloaded it. It's pretty small like when dkb jar because those are all class files. It's Java archive, which is nothing but class file. So I take this and I kind of unzip it. Okay, so I get this directory here and you should be able to see a jar file. Now. This is nothing but an executable jar file you could see it here would see the type as executable jar file. All right. So now I put it into on let's for Simplicity. Let me put it here itself. All right, so I create a new folder. Which is Ed, Eureka? Jason and I put it here. So now we'll have to link up our application with that. So what I do. So when we had this dom4j downloaded and linked up we'll have to do the similar stuff for this thing as well. So since I am using IntelliJ, the steps would be different than Eclipse. But basically what you do is you go into let me see the option here. There's open module settings. So you go to the open module settings and you would see something of this sort coming up. Alright, so now I want to add something right. Add a particular Library. So I go to libraries first. I click on add Java and I've Traverse to the path that I put the jar file into so I put it into Ed Eureka Jason. I select this jar file and click on OK. So this is basically you're trying to link your application to a particular jar file. All right, so you could leverage it. So here you can see that this is jar file that will link to your application. All right, I apply it which I already did and I will click on OK OK, so that's how you link any executable jar to your application. So you go to the build path you go to this is how you do it in Eclipse. Like in IntelliJ. I did module settings where as in Eclipse. You would go to the build path. You would go to the add external jars and you would select the path and then apply and close. So this is how you do it in Eclipse. So encoding Jason in Java, how do we encode Jason in Java? How do we write a Jason? How do we actually create Jason in Java? All right. So I had to comment this earlier now I uncomment this so there was some are earlier now. Let me try to resolving it. Okay, it's taking So it's asking me which Java class to resolve. So there is a Json object class. We'll have to see so let me select this one. So I have a Json file. So similarly, I would prefer just to keep best practices. I would say. Json object and this is like private method the return type is Json object and I say create Jason. Andre and I would prefer to put this here rather than in main method that's one of the best practices by the way, it's not something that you have to do. But as I said, I prefer to write something like this give a meaningful name. Something like this. So I'm just iterating through this so that you get to understand. What are the best practices it's not mandatory. So I say student. Jason then I say student. So this is to make it more readable tomorrow if I come and look at it. I would be able to understand and maybe as I said there would be many other developers who would be looking at the same code that you have written in order for them to understand and to increase the maintainability and reusability Factor as well. It's better to write like this. Alright, and then I could even say private void. Bring Jason. And I take the Json object. You have a print method which is taking Json object and say I call it as Jason because it could be any generic Jason and I print it out saying Jason. All right. So you have new Json encode a Creator instance of it and I create Jason now this Json object. Which is nothing but student Jason. It's going to be here and I'm going to call new. Json encode dot print Jason and I'm going to pass the student Jason here. So we have created a Json here with first name last name and email address and we have marks as well and we are printing this Jason there so I have run it. Let's see what it shows up. So Jason is pretty much light weight as compared to XML as you could imagine right XML has all this start tag in tag and stuff like that. So when it comes to a humongous big chunk of data, like millions of data, you're processing you could imagine the size of Jason is size of XML would be pretty much high as compared to Jason since Jason is just doing it in the form of key value pair. You don't have to end it you don't have the end tags and stuff like that when it comes to readability. I think in terms of readability XML could be better but when it comes to size, this one is better. Jason is better. So machine to machine interaction. Jason is better whereas Deputy I think XML could be at times more readable to humans compared to Jason's. Alright, so here you can see Jason being created. So again if I want to format this there are online tools since this have widely become standard for data exchange standards you have lot of tools dealing with it. All right, if I want to do online tools itself rather if I want to do Jason for matter, I have Jason for matter as well, which is online. And it's validating as well. If you miss something if you don't have a empty braces, or if you don't have a closing brace, it would give you an error, right? So if I do this, you can see that it formatted it and it has given you to collapse and expand so you could parse through and understand more about this Jesus. Also, it validates it. So if I remove this Cody Breeze and if I try to do it it would say it's a invalid Jason. So if I scroll down it shows invalid Jason since it was expecting closing Breeze at the end. I put this braces and it should be back up again. Be able to parse it. All right, so that's about Jason. So what do we have next is creating Json file. So you could write it into a file. Basically what you could convert it is into a string and you could write it into a file. All right, so if I want to write here Yeah, I want to write to file and I said Json object for right this Json object into a file. What I would do is say I do it using file writer and I take the file name as well. Say for example or string. It should be absolute filename. All right, so it's absolute path of the file name. So I do F or maybe I can use it within the file writer, right? So I create a file writer, which is nothing but Jason. File writer since we know that it's going to write just Jason's. All right. I create the instance of it. What does it take? So we have created a file writer for writing. It is showing some exception. Remember we have to add exception to throw it. Now. What I do is Json file writer. . Right I'm going to write this thing Json object as a string. Okay, so Jason dot to Json string. All right, I got a string and I would write it into a file. Now. What I do is Jason brighter dot flush. I would flush whatever is been buffered. And last thing that I would do is close it. So one thing to remember is you should always close it. If you don't close it. It's going to remain open and which is going to consume lot of your memory at the end which might become a bottleneck for your application. So remember you whenever you deal with file, you have to close it at the end. Now what I do is new I create a new instance of Json encode and I kind of write to a file. Okay write this to a file and I need to provide file path as well. So I say Ed Eureka. Jason died say Student Jason I have to handle the exception here as well. If I want handle I can handle it or else I can choose to throw it off. So in this case, I have thrown it off. So you could see the program executed successfully now. Let me go to a director Jason and I see student Jason here. Okay, go to see I go to a to record Jason. I just open it up and you should be able to see students that Jason has all the fields that we have gotten right first name marks email and this thing so yeah, we saw how to write it into a Json file, right? So we have created a Json file and we have similar thing like how to read it from a Json file you have like Json parser, which is again, you need to pass your file reader and which would pass it into a particular Json object. So from your file, you are basically converting it into a Json object and from Json object. You can read whatever data you want to again give you an example you could have private void read Json and you could have string say absolute. Alright, so you have this now what I'm trying to do is I'll create a new Json parser. You can see here. There's a parse method which takes filereader. All right, so I do dot bars. All right, and you could see there's a second method here, which is taking reader All right. So what I do is bars new file reader file reader is nothing but is a reader that's why you can use it there and I give absolute path name. All right, so this should pass your Jason. So it's asking me to import it. I am putted it. So this file not found exception that I need to handle which I will rather throw it off. Alright, so as you could see here, I have thrown of filed all these other exceptional swell that I need to handle which is nothing but IO exception which is again, I've thrown it off. Alright, so we have Parts this o on parsing what do you get is nothing but object You get Json as object right here. You have passed it. And you have got Jason as object. Now. What I'm going to do is I'm just print going to print say one of the attributes not all since it's going to be the same. I'm going to print the first name. So it says there's no method. Let me see. So you have this it cannot be taken as object directly. It has to be taken as Json object so that we could read it. All right. So this has to be typed costed to Json object. This is basically typecasting. All right, what is typecasting is nothing but you know what is going to be written doubt. But from the pass is going to be Json object so we can do it something of this sort. All right, once you do this, you can get based on the key. So I give first name key. Let me print the last name as well. All right, and let me print the email as well to for convenience. So basically we are going to read from this so its first name last name and email as we can see first name is lowercase. So this would give an error. So we have passed it as well, right we have read it from Json file. Now. What I do is I'll have to give a call to this which is nothing but Jason and quote dot read Jason and I passed the same file here. All right. Now it is asking me to handle the exceptions. So I add it to the method signature as I choose not to handle it. All right. So what we have done here is nothing but we are we are parsing the Json file. All right. So we have a read Jason method which is taking absolute file name as its parameter. We have a jsonparser class, which is one of the classes from the jar that we downloaded Jason simple jar that we downloaded and since it's put into your application since we have attached it with our application. We are able to use those classes, right? If you wouldn't have done that step of linking the library with the application you won't be able to use this classes. Okay, because these are third party classes. This is not as a part of the standard Java kit or SDK that comes with Java. We are to download it and then link it up with our application using module settings or if you are in an eclipse, then it would be configured build path. Then you parse it and you provide the reader instance of reader in this case. I passed file reader and I give the absolute file name. Once this is done you should be able to read messages or read the content or read the keys that you have within your file. You get this an object then I do Json dot get first name then I do Jason don't get last name. And the last thing that I am printing is email. All right. Let's see if this works. So I'm running this. You could see the value being printed here. First name that came out as John then the last name that is Lee and the email that we printed. That is John at the right one two, three. All right, so that's about XML and Json which is nothing but it's a standard set across industry for data entry exchange. So yeah having said that one of the main differences between XML and Json is its lightweight and most of the companies are the industries moving towards using Jason's rather than xml's but xml's our Legacy and they have lot of weed they carry a lot of weight in the industries lot of systems at this point. I call the financial systems. They have Legacy systems and they deal with xml's and less of Jesus. But Jason is something that is upcoming and lot of systems have started migrating to or started using Json speak since they are lightweight that's pretty much it from my sight and thanks a lot for Sting and I hope you guys all become an emerging coders and practice a lot on coding. All right, so all the best thank you. I hope you have enjoyed listening to this video. Please be kind enough to like it and you can comment any of your doubts and queries and we will reply them at the earliest do look out for more videos in our playlist And subscribe to Edureka channel to learn more. Happy learning.
Info
Channel: edureka!
Views: 2,517,315
Rating: 4.9161658 out of 5
Keywords: yt:cc=on, java full course, java, java tutorial, java tutorial for beginners, java programming tutorial, complete java course, java online training, java certification training, java for beginners, java programming for beginners, java video tutorial, java beginner tutorial, java (programming language), java 8 tutorial, what is java, learn java, java programming, java data types, java basics, java course, java certification, java training, java edureka, edureka, Edureka java
Id: hBh_CC5y8-s
Channel Id: undefined
Length: 610min 58sec (36658 seconds)
Published: Sun Jun 23 2019
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.