1. 面向对象的初步认识面向对象是解决问题的一种思想主要依靠对象之间的交互完成一件事情2. 类的定义和使用类是用来对一个实体对象进行描述的。在Java中定义类需要使用class关键字classClassName{field;//字段属性或者 成员变量method;//行为 或者 成员方法}【注意】一般一个文件中只定义一个类main方法所在的类一般要使用public修饰public修饰的类必须要和文件名相同3. 类的实例化定义了一个类就相当于在计算机中定义了一种新的类型。用类类型创建对象的过程成为类的实例化。【注意】new关键字用于创建一个对象的实例使用.来访问对象中的属性方法同一个类可以创建多个实例对象4. this引用4.1 为什么要有this引用publicclassDate{publicintyear;publicintmonth;publicintday;publicvoidsetDay(inty,intm,intd){yeary;monthm;dayd;}publicvoidprintDate(){System.out.println(year/month/day);}publicstaticvoidmain(String[]args){// 构造三个日期类型的对象 d1 d2 d3Dated1newDate();Dated2newDate();Dated3newDate();// 对 d1d2d3 的日期设置d1.setDay(2020,9,15);d2.setDay(2020,9,16);d3.setDay(2020,9,17);// 打印日期中的内容d1.printDate();d2.printDate();d3.printDate();}}以上代码定义了一个日期类随后main方法中创建了三个对象并通过Date类中的成员方法对对象进行设置和打印。但是细思之下有两个疑问1.形参名不小心与成员变量名相同publicvoidsetDay(intyear,intmonth,intday){yearyear;monthmonth;dayday;}那函数体中到底是谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?2.三个对象都在调用setDate和printDate函数但是这两个函数中没有任何有关对象的说明setDate和printDate函数如何知道打印的是那个对象的数据呢?4.2 什么是this引用this引用指向当前对象成员方法运行时调用改成员方法的对象在成员方法中所有成员变量的操作都是通过该引用去访问publicclassDate{publicintyear;publicintmonth;publicintday;publicvoidsetDay(intyear,intmonth,intday){this.yearyear;this.monthmonth;this.dayday;}publicvoidprintDate(){System.out.println(this.year/this.month/this.day);}}【注意】this引用的是调用成员方法的对象publicstaticvoidmain(String[]args){DatednewDate();d.setDay(2020,9,15);d.printDate();}4.3 this引用的特性this的类型对应类类型引用即哪个对象调用就是哪个对象的引用类型this只能在“成员方法”中使用在“成员方法”中this只能引用当前对象不能再引用其他对象this是“成员方法”第一个隐藏的参数编译器会自动传递在成员方法执行时编译器会负责将调用成员方法对象的引用传递给该成员方法this负责来接收5. 对象的构造5.1 构造方法5.1.1 概念构造方法是一个特殊的成员方法名字必须与类名相同在创建对象时由编译器自动调用并且在整个对象的生命周期内只调用一次。publicclassDate{publicintyear;publicintmonth;publicintday;// 构造方法// 名字与类名相同没有返回值类型设置为 void 也不行// 一般情况下使用 public 修饰// 在创建对象时由编译器自动调用并且在对象的生命周期内只调用一次publicDate(intyear,intmonth,intday){this.yearyear;this.monthmonth;this.dayday;System.out.println(Date(int,int,int)方法被调用了);}publicvoidprintDate(){System.out.println(year-month-day);}publicstaticvoidmain(String[]args){// 此处创建了一个 Date 类型的对象并没有显式调用构造方法DatednewDate(2021,6,9);// 输出 Date(int,int,int)方法被调用了d.printDate();// 2021-6-9}}【注意】构造方法的作用就是对对象中的成员进行初始化并不负责给对象开辟空间5.2.2 特性名字必须与类名相同没有返回值创建对象时由编译器自动调用并且在对象的生命周期内只调用一次构造方法可以重载publicclassDate{publicintyear;publicintmonth;publicintday;// 无参构造方法publicDate(){this.year1900;this.month1;this.day1;}// 带有三个参数的构造方法publicDate(intyear,intmonth,intday){this.yearyear;this.monthmonth;this.dayday;}publicvoidprintDate(){System.out.println(year-month-day);}publicstaticvoidmain(String[]args){DatednewDate();d.printDate();}}如果用户没有定义构造方法编译器会生成一份默认的构造方法生成的默认构造方法一定是无参的publicclassDate{publicintyear;publicintmonth;publicintday;// 无参构造方法publicDate(){this.year1900;this.month1;this.day1;}// 带有三个参数的构造方法publicDate(intyear,intmonth,intday){this.yearyear;this.monthmonth;this.dayday;}publicvoidprintDate(){System.out.println(year-month-day);}publicstaticvoidmain(String[]args){DatednewDate();d.printDate();}}publicclassDate{publicintyear;publicintmonth;publicintday;publicvoidprintDate(){System.out.println(year-month-day);}publicstaticvoidmain(String[]args){DatednewDate();d.printDate();}}【注意】用户一旦定义了构造方法编译器则不再生成6. 构造方法中可以通过this调用其他构造方法来简化代码publicclassDate{publicintyear;publicintmonth;publicintday;//无参构造方法--内部给各个成员赋初始值该部分功能与三个参数的构造方法重复//此处可以在无参构造方法中通过this调用三个参数的构造方法//但是this(1900,1,1)必须是构造方法的第一条语句publicDate{this(1900,1,1);}//带有三个参数的构造方法publicDate(intyear,intmonth,intday){this.yearyear;this.monthmonth;this.dayday;}}【注意】this(...)必须是构造方法的第一条语句不能形成环6.封装面向对象的三大特征封装、继承、多态6.1封装的概念封装将数据和操作数据的方法进行有机结合隐藏对象的属性和实现细节进队外公开接口和对象进行交互6.2 访问限定符访问权限用来控制方法活字段能否直接在类外使用【说明】default什么都不写时的默认权限访问权限除了可以限定类中成员的可见性也可以控制类的可见性publicclassComputer{privateStringcpu;// cpuprivateStringmemory;// 内存publicStringscreen;// 屏幕Stringbrand;// 品牌---default属性publicComputer(Stringbrand,Stringcpu,Stringmemory,Stringscreen){this.brandbrand;this.cpucpu;this.memorymemory;this.screenscreen;}publicvoidBoot(){System.out.println(开机~~~);}publicvoidPowerOff(){System.out.println(关机~~~);}publicvoidSurflnternet(){System.out.println(上网~~~);}}publicclassTestComputer{publicstaticvoidmain(String[]args){ComputerpnewComputer(HW,i7,8G,13*14);System.out.println(p.brand);// default属性: 只能被本包中类访问System.out.println(p.screen);// public属性: 可以任何其他类访问//System.out.println(p.cpu); // private属性: 只能在Computer类中访问,不能被其他类访问}}【注意】一般情况下成员变量设置为private成员方法设置为public7. static成员7.1 static修饰成员变量在Java中被static修饰的成员称之为静态成员也可以称为类成员【静态成员变量的特性】不属于某个具体的对象是类的属性是所有对象所共享的既可以通过对象访问也可以通过类名访问类变量存储在方法区当中生命周期伴随类的一生随类的加载而加载随类的卸载而卸载7.2 static修饰成员方法在Java中被static修饰的成员方法成为静态方法是类的方法不是某个对象所持有的。静态成员一般通过静态方法来访问publicclassStudent{//...privatestaticStringclassRoom2043;//...privatestaticStringgetClassRoom(){returnclassRoom;}}publicclassTestStudent{publicstaticvoidmain(String[]args){System.out.println(Student.getClassRoom());}}//输出2043【静态方法特性】不属于某个具体的对象是类方法可以通过对象调用也可以通过类名.方法名(...)方式调用推荐使用后者不能在静态方法中访问任何非静态成员变量publicstaticStringgetClassRoom(){System.out.println(this);returnclassRoom;}// 编译失败Error:(35, 28) java: 无法从静态上下文中引用非静态变量 thispublicstaticStringgetClassRoom(){age1;returnclassRoom;}// 编译失败Error:(35, 9) java: 无法从静态上下文中引用非静态变量 age静态方法中不能调用任何非静态方法因为非静态方法由this参数在静态方法中调用不能传递this引用publicstaticStringgetClassRoom(){doClass();returnclassRoom;}// 编译报错Error:(35, 9) java: 无法从静态上下文中引用非静态方法 doClass()