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.