JAVASE之类和对象(2)

JAVASE之类和对象(2)
哪怕犯错也不能什么都不做。主页趋早–Step专栏JAVASE接上部分我们继续来学习JAVAEE类和对象。引言这篇文章接上一篇后半部分结束类和对象目录一、封装1、封装的概念2、访问限定符注意1我们在需要生成代码的地方点击鼠标右键然后选择下面的Geneate2然后就会出现下面的界面3这时候我们选择图片中的选项4点进来的界面是这样的5我们按住Ctrl 或者 Shift 键用鼠标点击需要生成的方法6最后点击下面的OK他就会自动生成了。3、包1概念2导入包中的类3自定义包1 选择src并且右键点击2 选择new3 选择Package并且点击4 输入包的名称这里我输入的是demo2可以自己定义名字,然后回车就创建好了一个包。我们来说一下创建包的基本原则1.在文件的最上方加上一个 package 语句指定该代码在哪个包中2.包名需要尽量指定成唯一的名字通常会用公司的域名的颠倒形式3.报名要和代码路径想匹配4.如果一个类没有package语句则该类被放到一个默认包中。4包的访问权限控制举例二、static成员1、再谈学生类2、static修饰成员变量3、static修饰成员方法4、static成员变量初始化1就地初始化2静态代码块初始化三、代码块1、代码块概念以及分类2、普通代码块3、构造代码块4、静态代码块拓展四、内部类1、内部类的分类2、实例内部类3、静态内部类4、局部内部类5、匿名内部类五、对象的打印一、封装1、封装的概念面向对象程序三大特性封装、继承、多态。而类和对象截断主要研究的就是封装特性。何为封装呢简单来说就是套壳屏蔽细节。比如我们使用的手机我们可以给手机充电可以开关机可以调节手机音量的高低可以看到手机内的应用但是我们看不到手机内部的构造这就是厂商将内部细节封装起来了我们无法看到。封装将数据和操作数据的方法进行有机结合隐藏对象的属性和实现细节仅对外公开接口来和对象进行交互。2、访问限定符JAVA中主要通过类和访问权限来实现封装类可以将数据以及封装数据的方法结合在一起更符合人类对事物的认知而访问权限用来控制方法或者字段能否直接在类外使用JAVA提供了四种访问操作符当然我们也是通过代码来学习封装的我们看下面这个代码class Person{ public String name; public int age; public void show(){ System.out.println(姓名 name 年龄 age); } } public class Text { public static void main(String[] args) { Person person new Person(); person.name Tom; person.age 12; person.show(); } }运行结果如下上面的代码我们已经很熟悉了吧但是上面这个代码不够安全容易被修改所以这时候封装的意义就体现出来了我们将代码进行修改很明显这个代码已经有错了因为private修饰了属性和方法private的权限是同一个包中的同一类上面代码中不在同一个类所以就会出错再来看下面代码我们将它放在同一个类中就不会报错了我们运行试试这就是运行结果了。这时候我们想如果我们非要在类外面访问该怎么办呢这也是有方法的我们继续class Person{ private String name; private int age; public void show(){ System.out.println(姓名 name 年龄 age); } public String getName() { return name; } public void setName(String name) { this.name name; } public int getAge() { return age; } public void setAge(int age) { this.age age; } } public class Text { public static void main(String[] args) { Person person new Person(); //person.name Tom; //person.age 12; person.setName(Sam); person.setAge(15); System.out.println(person.getName()); System.out.println(person.getAge()); } }看代码我们运行一下试试这个代码就叫做封装。我们可以提供公开的方法进行访问这就相当于我们的手机充电口我们可以给手机充电但是我们不知道他是实现的细节。注意这时候我们说一个小技巧我们看到那么多方法需要一个一个字母敲出来可真的太浪费时间了为了提供我们的效率我们就用快捷方式我们的IDEA功能非常的强大可以自动帮助我们生成如何生成呢让我来告诉你我们先把那些方法删除现在的代码是这样然后就来生成吧1我们在需要生成代码的地方点击鼠标右键然后选择下面的Geneate2然后就会出现下面的界面3这时候我们选择图片中的选项4点进来的界面是这样的5我们按住Ctrl 或者 Shift 键用鼠标点击需要生成的方法6最后点击下面的OK他就会自动生成了。我们看结果这就是我们编译器自动生成的方法是不是和好用的当然我在这里写的比较繁琐我们自己使用的时候完全不会这么麻烦的同时我们再告诉大家一个快捷键 Alt Insert他也能帮助我们生成上面的方法至于他怎么使用大家自己尝试一下就知道了需要我们自己动手哦。3、包1概念在面向对象体系中提出了一个软件包的概念即为了更好的管理类把多个类手机在一起成为一组。比如我们的一个文件夹文件夹中的内容就是类可以帮助我们更好的管理类。在JAVA中包是对类、接口等封装机制的体现是一种类对接口等的很好的组织方式比如一个包中的类不想被其他包中的类使用。包还有一个重要的作用在同一个工程中允许存在相同名称的嘞只要处在不同的包中即可。2导入包中的类我们使用import语句来导入包我们看下面的代码这就是导入了包运行结果如下3自定义包我们如何自定义包呢下面就来介绍一下1 选择src并且右键点击2 选择new3 选择Package并且点击4 输入包的名称这里我输入的是demo2可以自己定义名字,然后回车就创建好了一个包。我们来说一下创建包的基本原则1.在文件的最上方加上一个 package 语句指定该代码在哪个包中2.包名需要尽量指定成唯一的名字通常会用公司的域名的颠倒形式3.报名要和代码路径想匹配4.如果一个类没有package语句则该类被放到一个默认包中。4包的访问权限控制举例我们在demo2中定义一个Date类然后我们在demo1中的Text中进行访问这样我们就可以访问不同包中的类了。二、static成员1、再谈学生类public class Student { public String name; public int age; public String gender; public double score; public Student(String name, int age, String gender, double score) { this.name name; this.age age; this.gender gender; this.score score; } public void print(){ System.out.println(this.name 今年 this.age 岁了他是一个 this.gender 生这次的考试成绩是 this.score 分); } public static void main(String[] args) { Student student1 new Student(Tom,12,男,66); Student student2 new Student(XiaoHong,13,女,76); Student student3 new Student(Sam,12,男,86); student1.print(); student2.print(); student3.print(); } }运行结果如下好的后面的操作我们都是在这个代码上提出问题并且在这个代码上修修改改。这时候我们有了第一个问题假如他们三个人都在同一个班中那么我们有必要都存一份吗很明显是没有必要的所以这个时候我们的static就出马了。在JAVA中被static修饰的成员称之为静态变量也可以称为类成员其不属于某个具体的对象是所有对象所共享的。2、static修饰成员变量static修饰的成员变量称为静态变量静态成员变量最大的特性不属于某个具体的对象是所有对象所共享的。静态成员变量特性1.不属于某个具体的对象是类的属性所有对象共享的不存储在某个对象的空间中。2.既可以通过对象访问也可以通过类名访问但一般更推荐使用类名访问3.类变量存储在方法区中4.生命周期伴随类的一生。随类的加载而加载随类的卸载而销毁运行结果如下上面的代码我们是已经给班级赋值了如果不赋值会是怎样呢我们看代码剩下的不改变运行一下这里称为了null至于为什么咱们可以看看上一篇文章就懂啦我们也可以在类外赋值如何赋值呢看代码3、static修饰成员方法成员方法同样也是使用类名进行访问的在JAVA中被static修饰的成员方法称为静态成员方法是类的方法不是某个对象所特有的。静态成员一般是通过静态方法来访问的。静态方法特性1.不属于某个具体的对象是类方法2.可以通过对象调用也可以通过类名调用更推荐使用类名调用3.不能在静态方法中访问任何非静态成员变量4.静态方法中不能调用任何非静态方法因为非静态方法有this参数在静态方法调用时候无法传递this引用。我们用代码说明一下上面的特性3和4这就是本部分的内容啦但是还没有结束咱们的思维导图还没有整理完哦。4、static成员变量初始化1就地初始化就地初始化就是在定义时就直接给出初始值2静态代码块初始化还记得这张图吗就让我们继续学习吧三、代码块1、代码块概念以及分类使用{}定义的一段代码称为代码块根据代码块定义的位置以及关键字又可分为以下四种1.普通代码块2.构造块3.静态块4.同步代码块2、普通代码块定义在方法中的代码块运行结果如下3、构造代码块定义在类中的代码块也叫实例代码块。构造代码块一般用于初始化实例成员变量。4、静态代码块使用static定义的代码块称为静态代码块一般用于初始化静态成员变量。拓展在这里我们拓展一个点我们先看代码public class Student { public String name; public int age; public static String classes; public Student(){ System.out.println(不带参数的构造方法); } public Student(String name, int age) { System.out.println(带两个参数的构造方法); this.name name; this.age age; } { System.out.println(这是实例代码块/构造块); } // 类加载的时候就会执行 static { System.out.println(这是静态代码块); } public void show(){ System.out.println(this.name 今年 this.age 岁了); } public static void main(String[] args) { Student student new Student(); } }我们运行一下看结果我们的静态代码块在类加载的时候就会执行了我们把main方法改成下面这样并且运行试试这就证明了我们上面的答案。这个时候我们再看下面的代码我们发现再次实例化的时候静态代码块就没有再执行了。这就是因为静态的只会执行一次注意:1.静态代码块不管生成多少个对象其只会执行一次2.静态成员变量是类的属性因此是在JVM加载嘞时开辟空间并且初始化的3.如果一个类中包含多个静态代码块在编译代码时编译器会按照定义的先后次序依次执行4.实例代码块只有在创建对象时才会执行四、内部类当一个事物的内部还有一个部分需要一个完整的结构进行描述而这个内部的完整结构又只为外部事物提供服务那么这个内部的完整结构最好使用内部类。在JAVA中可以将一个类定义在另一个类或者一个方法的内部前者称为内部类后者称为外部类内部类也是封装的一种体现。1、内部类的分类实例内部类静态内部类局部内部类匿名内部类2、实例内部类class Outer{ public int data1; int data2; public static int data3; public void test(){ System.out.println(Outer -- test()); } // 实例内部类 -- 未被static修饰 class Inner{ public int data4; int data5; public void func(){ System.out.println(Inner -- func()); } } } public class Test { }我们已经写好了上面的代码我们就慢慢来理解实例内部类吧如何获取内部类的对象我们可以把内部类看做一个实例成员使用外部类的对象来调用使用上面的两种方法都是可以的。注意1.外部类中的任何成员变量都可以在内部类方法中直接访问2.实例内部类所处的位置与外部类成员位置相同因此也受public,private等访问限定符的约束3.在实例内部类方法中访问同名的成员时优先访问自己的如果要访问外部类同名的成员必须外部类名称.this.同名成员来访问4.实例内部类对象必须在先有外部类对象的前提下才能创建5.实例内部类的非静态方法中包含了一个指向外部类对象的引用6.外部类中不能直接访问实例内部类中的成员如果要访问必须先要创建内部类的对象3、静态内部类class Outer{ public int data1 1; int data2 2; public static int data3 3; public void test(){ System.out.println(Outer--test()); } static class Inner{ public int data4 4; int data5 5; public static int data6 6; public void func(){ System.out.println(Inner--func()); } } } public class Test { public static void main(String[] args) { } }如何获取静态内部类对象注意1.在静态内部类中只能访问外部类中的静态成员当然如果我们非要访问也是有办法的2.创建静态内部类对象时不需要先创建外部类对象。4、局部内部类定义在外部类的方法体或者{}中该中内部类只能在其定义的位置使用使用很少public class Test { public void func(){ // 局部内部类 class Inner{ } } public static void main(String[] args) { } }注意1.局部内部类只能在所定义的方法体内部使用2.不能被public,static等修饰3.编译器也有自己独立的字节码文件命名格式外部类名字$数字内部类名字.class4.几乎不会使用5、匿名内部类class Person{ public String name; public int age; } public class Test { public static void main(String[] args) { // 匿名对象 只能使用一次 new Person(); System.out.println(new Person().name); System.out.println(new Person().age); // 匿名内部类 new Person(){ }; } }五、对象的打印class Person{ public String name; public int age; public Person(String name, int age) { this.name name; this.age age; } public void print(){ System.out.println(this.name 今年 this.age 岁了); } } public class Test { public static void main(String[] args) { Person person new Person(Tom,12); person.print(); } }运行结果如下我们可以看到我们每次打印的时候需要调用print方法当字段很多的时候我们写print方法的时候会显得函麻烦这时候我们就需要更简单的方法了。在我们JAVA中就有这样的方法我们先看下面的代码我们看到红色方框中的是一堆看不懂的东西它当然是有意义的我们这里不说他是什么意思我们想要把它变成打印里面的对象该怎么办呢这时候就需要用到我们所说的toString方法了看代码class Person{ public String name; public int age; public Person(String name, int age) { this.name name; this.age age; } public void print(){ System.out.println(this.name 今年 this.age 岁了); } Override public String toString() { return Person{ name name \ , age age }; } } public class Test { public static void main(String[] args) { Person person new Person(Tom,12); person.print(); System.out.println(person); } }运行结果如下我们同样是有快捷键来生成toString方法的,我们看下面的步骤1.右键 -- Generate2.找到toString()点击并选择就可以可以生成啦或者使用Alt Insert 剩下的步骤是完全一样的。我们JAVASE之类和对象部分就全部学习完啦但是我们还需要继续努力继续加油