当前位置: 首页 > Web前端 > CSS

java13面向对象深入

时间:2023-03-30 16:30:43 CSS

大纲包和导入包概述包存在的意义在于防止命名冲突带来的不便。包类似于文件夹,文件夹中有各种文件。包与包之间的从属关系由“.”连接,类似于父文件夹中的子文件夹。比如java.lang.String就是java文件夹下lang文件夹下的String文件。java.io.InputStream是java文件夹下io文件夹下的InputStream文件。同一个文件夹中不能存在同名文件,但同名文件允许存在于不同名称的文件夹中,所以不同的文件夹(即不同的包中允许有相同的类名)。为了便于管理大型软件系统中大量的类,解决类命名冲突的问题,Java引入了包机制,为类提供多个类命名空间。一般命名格式为:公司域名反序+函数名|模块名称。package语句作为Java源文件中的第一条语句,表示文件中定义的类所在的包。(如果默认该语句,请指定一个未命名的包)。包pkg1[.pkg2[.pkg3…]];示例:包com.java01.test;Java编译器将包对应到文件系统的目录管理。在包声明中,使用“.”表示包(目录)层级,比如使用语句:packagecom.java01,那么这个文件中的所有类都位于.comjava01目录下注意:不要定义和jdk相同的包和类,否则会造成很多你认为莫名其妙的问题Addpackages,不要使用defaultpackages。com.oop和com.oop.test,这两个包没有包含关系,是两个完全独立的包。从逻辑上看,后者似乎是前者的一部分。import如果一个类有包名,在其他包下使用该类时,必须使用完全限定名(简称全名或全类名,com.java01.MyClass),编译器才能找到该类;您还可以使用import在文件开头引入要使用的类。导入java.util.Scanner;导入java.io.*;//模糊匹配当前io包下的所有类publicclassImportDemo{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);//因为使用了import关键字来导包,所以可以使用java.util.ArrayListlist=newjava.util.ArrayList();//权限命名//导入集合注意:不要导入错包//使用*,有歧义MatchFilefile=newFile("D://test.txt");InputStreamisInputStream=newFileInputStream(文件);}}不需要使用import的类有:语言包下的类(java.lang)(String,System...)同包下类的静态导入:import语句不仅可以导入类,而且还增加了引入静态方法的功能类ImportDemo{publicstaticvoidmain(String[]args){out.println(PI);罪恶(1.1);}}将类放入包中,在类的源文件第一行使用包,必须保证类的class文件位于正确的目录下,如果要访问另一个类:写全称引入模糊匹配(引入的包类下均使用),会降低编译速度,但不影响运行速度。具体的类名静态导入同包下的类中,不需要导入JDK常用包简介:java.lang-语言包:语言中常用的函数,如:String,Math,System,Integer,Thread...java.util–工具包:提供了一些undefined垃圾回收机制要点:垃圾回收机制只回收JVM堆内存中的对象空间。不能对其他物理连接做任何事情,例如数据库连接、输入流输出流和套接字连接。目前的JVM有多种垃圾回收算法,性能各不相同。垃圾回收的发生是不可预测的,程序无法精确控制垃圾回收机制的执行。对象的引用变量可以设置为null,表示垃圾回收机制可以回收对象。程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,这会有一定的效果,但是系统是否会进行垃圾回收还不确定。垃圾回收机制在回收任何对象之前,总是会调用它的finalize方法(如果重写这个方法,让一个新的引用变量再次引用这个对象,这个对象就会被重新激活)。永远不要主动调用对象的finalize方法,应该由垃圾回收机制调用。block和debugblock{}在java中有各自的作用域,分为静态代码块构造代码块、普通语句块、同步代码块声明位置类、类外的方法、fsynchronized(){}中的函数methodsoutsidemethods整个类进行一定的初始化操作(静态成员属性赋值...)构造代码块用于对象初始化操作(静态或非静态成员属性赋值...)声明一些临时变量等...控制并发执行的时机第一次加载类时,只执行一次,如果有多个静态块,创建对象时从上到下执行,在执行构造函数代码之前执行,如果有多个,则执行从上到下跟随方法执行,执行方法注意:classfirst当类第一次加载时,静态代码块先执行;当类被多次加载时,静态代码块只执行一次;静态块通常用于初始化静态变量。它在类初始化时执行,而不是在创建对象时执行。不能在静态初始化块中访问非静态成员。构造函数在将执行静态块的构造函数代码之前编译,静态块仅在第一次使用该类时加载。构造块先于构造函数执行,每次创建对象时执行debug。在学习或者开发的过程中,难免会遇到bug。为了能够快速调试,可以使用debug调试工具。调试Java程序非常简单,主要包括设置断点、开始调试、单步执行、结束调试。2)启动调试Eclipse提供了几种启动程序调试(Launch)的方法,分别是通过菜单(Run–>Debug),图标(“greenbug”),右击->DebugAs。弹出提示,需要切换到Debug(调试)工作区,勾选“Remembermydecision”,记住选择,下次就不会提示了,然后点击【Yes】。3)单步执行主要是利用上面提到的几种视图进行调试,其中调试视图中的几个按钮有快捷键:StepReturn(F7):表示退出当前方法,返回到调用层。StepOver(F6):表示运行下一行代码。StepInto(F5):表示进入当前方法。[外链图片传输失败,源站可能有防盗链机制,建议保存图片直接上传(img-Hf8bErH7-1609146902222)(/1581682185893.png)]4)Enddebugging终止调试通过终止命令终止本地程序。Object-Oriented-Inheritance继承“树上有一只鸟,树下有两只兔子,有多少种动物和生物?”这里是继承的概念。继承:父子继承的本质在于抽象。类是对象的抽象,继承是对某一批类的抽象,从而实现对现实世界更好的建模。继承的作用:使用继承可以提高代码的可重用性。如何使用继承:父类|超级类|基类:根据一些子类抽象,提取图像部分,定义在父类subclass|派生类:子类继承父类,有权使用父类中的内容,可以定义子类的新内容,所以子类是父类的延续+扩展。extends关键字表示“扩展”。子类是父类的扩展。在java中,使用extends关键字来实现类的继承机制。语法规则:class[extends]{}//parentclassclassPerson{publicStringname;公共年龄;publicvoidsleep(){System.out.println("rest");}}//子类//教师类classTeacherextendsPerson{publicStringsubject;publicTeacher(){}publicvoidteach(){System.out.println("}}//学生类classStudentextendsPerson{publicStringschool;publicStudent(){}publicvoidstudy(){System.out.println("在知识的海洋里畅游!");}}注:子类继承父类的成员变量和成员方法,但不继承父类的构造函数,Java中只有单继承,并且没有像C++那样的多重继承。多重继承会造成混乱,使得继承链过于复杂,系统难以维护。就像我们现实中,如果你有多个父辈,那是多么混乱的世界。多重继承是实现代码复用,但是引入了复杂性,使得系统类之间的关系变得混乱。java中的多重继承可以通过接口实现。如果在定义类的时候不调用extends,那么它的父类是:java.lang.Object。ofInheritance:优点:继承可以简化类的定义,实现代码复用|提高代码的复用性,可以更好的扩展程序。子类一旦继承了父类,就可以有权使用父类的成员,也可以进行扩展。定义子类的唯一内容Java是单继承继承,易于实现。缺点:子类与父类紧耦合(耦合度高),子类依赖于父类的实现,子类缺乏独立性。不方便后期维护。单继承一个子类只能有一个父类,不够灵活,也不方便后期维护。super关键字supersuper是对父类的引用。super可以在子类的构造函数中调用父类的构造函数。如果构造函数没有显式调用父类的构造函数,编译器会自动为其添加一个默认的super()方法调用。如果父类没有默认的无参构造函数,编译器会报错,super()语句必须是构造函数的第一个子句。super可以用来区分子类中同名的成员。如果同名没有问题,可以直接在子类中调用父类的内容。super默认省略。如果出现同名问题,则在子类中调用同名成员。默认是这个。恒源调用当前子类中的同名成员必须先调用父类中的同名成员,必须定义为super。Members//父类publicclassAnimal{inteye=2;公共动物(){超级();System.out.println("动物");}publicvoidrun(){System.out.println("动物行走方式不同");}publicstaticvoidmain(String[]args){Birdb=newBird();b.运行();}}//子类BirdextendsAnimal{publicBird(){super();System.out.println("小鸟");}publicvoidrun(){super.run();//通过super可以使用父类的方法和属性System.out.println("ThebirdisFeifeifeifeifeifeifei");System.out.println("鸟有"+super.eye+"只有眼睛");}}构造方法调用顺序:根据super的描述,构造方法的第一句永远是:super(...)调用父类对应的构造方法。先回溯到Object,然后向下执行类的初始化块和构造方法,直到当前子类。this和super的区别是一样的:this和super都可以用来调动其他共构造子,this和super都可以用来区分第一行的同名问题。如果不区分同名,this和super都可以省略。引用对象,因此两者都不能在静态环境中使用。包括:静态变量、静态方法、静态语句块。区别:this(参数)构造函数第一行调用本类其他构造函数,super(参数)构造函数第一行调用父类中的一个构造函数。区分父类中的同名问题注意:this和super不能同时出现在一个构造函数中,因为this必然会调用其他的构造函数,而其他的构造函数也必须有super语句,所以在同一个构造函数中如果有里面都是同一条语句,就会失去语句的意义,编译器也不会通过。本质上this是指向这个对象的指针,但是super是java关键字重写和final关键字重写Override,父类的函数实现不满足子类的要求,可以在子类中根据需要重写,这是方法的重写。实现重写的三个条件:两个不同的类继承关系|相同实现关系方法签名@Override:注解,强制检查是否是重写方法注意:子类重写的方法会屏蔽父类的方法。调用子类对象时,会调用子类中重写的方法,子类没有找到父类。publicclassOverrideTest{publicstaticvoidmain(String[]args){思聪sicong=new思聪();sicong.getMoney();//调用子类重写的方法}}//父类Jianlin{publicvoidgetMoney(){System.out.println("先定个小目标,给他赚个亿");}}//子类classSicongextendsJianlin{@Override//强制检查是否是override方法publicvoidgetMoney(){super.getMoney();//在父类原有的赚钱方法上扩展新功能,旧函数保持不变System.out.println("NooneIknowhasmoney");}}重写了三个“=”:“==”:方法名和参数列表是一样的。“≤”:抛出的异常类型和返回值类型,如果是基本类型则返回值类型必须相同,引用数据类型的子类小于等于父类。“≥”:访问权限,子类大于等于父类。以下修饰符和修饰的内容不能被重写:private修饰的方法不能被重写final修饰的方法不能被重写类中的方法也必须是静态的)final关键字final表示final。final可用于修饰变量、方法和类。修饰变量:变量一旦初始化就不能再改变,相当于定义了一个常量。finalintx=3;//x=4;常量不能改变装饰方法:final方法是子类中不能重写的方法finalvoideat(){...}装饰类是指类不能被继承finalclassPerson{...}Objectclass对象类是所有Java类的根类。如果类声明中没有使用extends关键字指定其基类,则默认基类为Object类。链机制,建议图片保存后直接上传(img-oZzQmmTI-1609146902225)(/1581686929678.png)]toString():打印对象的引用时,默认调用toString()方法,默认返回:包名+类名+@+Hash码(根据对象的内存地址生成,唯一且不重复)可以改写为以字符串形式返回对象(打印所有成员的值对象的属性)Userp1=newUser("张三",20);System.out.println(p1);//等同于System.out.println(p1.toString());equals:比较是否相等**默认地址比较(“比较第一个框”)重写可以用来比较两个对象的内容是否一致object1.equals(object2)如:p1.equals(p2)比较引用的对象内容是否相同,见equals重写object1==object2的方法如:p1==p2?比较p1和p2的值,即内存地址是否相同是否相等,即是否指向同一个对象。注意:自定义类必须重写equals(),否则无法实现比其内容classUser{Stringname;年龄;publicUser(){//TODO自动生成的构造函数存根}publicUser(Stringname,intage){super();this.name=名称;这个。年龄=年龄;}//重写toString@OverridepublicStringtoString(){return"User[name="+name+",age="+age+"]";}//重写equals@Overridepublicbooleanequals(Objectobj){if(this==obj)returntrue;如果(obj==null)返回false;如果(getClass()!=obj.getClass())返回false;其他用户=(用户)obj;如果(年龄!=other.age)返回假;if(name==null){if(other.name!=null)返回false;}elseif(!name.equals(other.name))返回false;返回真;}}