ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

暑假Java知识点回顾:类与对象知识总结

暑假Java知识点回顾:类与对象知识总结 面向对象基础语法程序结构、打印语句、输入语句、数据类型与变量、运算符、条件判断语句、循环语句、数组。publicclassHelloWorld{publicstaticvoidmain(String[]args){// 打印语句System.out.println(Hello, World!);// 输入语句ScannerscannernewScanner(System.in);System.out.print(请输入姓名);Stringnamescanner.nextLine();// 数据类型与变量intage18;doublescore95.5;booleanisPasstrue;// 运算符intsumage2;booleanisAdultage18;// 条件判断语句if(isAdult){System.out.println(name 已成年);}else{System.out.println(name 未成年);}// 循环语句for(inti0;i3;i){System.out.println(第 (i1) 次循环);}// 数组int[]scores{90,85,95};System.out.println(第一个成绩scores[0]);}}类与对象类与对象的概念类的定义使用class关键字声明一个类类是对象的模板描述了对象共有的属性和行为属性定义在类中声明变量用于描述对象的状态例如学生的姓名、年龄等方法定义在类中声明方法用于描述对象的行为方法可以接收参数并返回结果例如public void study(String subject)类创建对象通过new 类名()的方式实例化对象例如Student stu new Student();对象名调用对象的属性通过对象名.属性名访问对象的属性例如stu.name对象名调用方法执行通过对象名.方法名()调用对象的方法例如stu.study(Java)#### 封装类的格式系统中使用的类都是有封装的。一个类包含哪些内容面向对象的成员属性使用对象变量名调用方法使用对象变量名调用构造方法格式没有返回值结构且方法名与类名相同的方法例如public 类名(){}调用时机在创建对象时自动调用即执行new 类名()时触发作用用于对象创建时的初始化包括属性的初始化和方法的初始化调用构造方法的重载一个类中可以定义多个同名但参数列表不同的构造方法以满足不同的创建需求构造代码块{}同样在对象创建时执行可用于执行一些初始化操作。每当通过new创建一个对象时构造代码块都会被调用一次。##### 静态资源static关键字修饰的成员属于类本身与具体的对象实例无关因此可以直接通过类名调用无需先创建对象。它的核心特性是唯一性无论创建多少个对象静态成员在内存中只有一份被所有对象共享。静态属性在内存中只存在一份所有对象共享同一份数据通过类名直接调用例如类名.属性名静态方法通过类名直接调用例如类名.方法名()由于静态方法不依赖对象因此不能直接使用本类中的实例属性或实例方法即对象成员部分静态代码块在类被加载时执行且只会执行唯一的一次常用于完成一些全局性的初始化操作例如加载配置文件、初始化数据库连接等所谓实例就是新对象必须要用new的初始化一下比如说publicclassDemo{// 静态变量属于类全局1份所有对象共享staticintstaticNum0;// 实例变量(没有static)属于每个对象每个对象各自一份intinstanceNum0;//静态代码块类加载执行只执行1次static{System.out.println(静态代码块执行);}//实例代码块无static每new对象就执行一次{System.out.println(实例代码块执行);}//静态方法publicstaticvoidstaticMethod(){System.out.println(这是static静态方法);// 可以访问静态变量System.out.println(staticNum);// 静态方法不能直接访问实例变量编译报错// System.out.println(instanceNum);}//普通实例方法无staticpublicvoidinstanceMethod(){System.out.println(这是普通实例方法);// 普通方法既可以访问静态也可以访问实例变量System.out.println(staticNum);System.out.println(instanceNum);}publicstaticvoidmain(String[]args){//1.静态直接用类名调用不需要new对象Demo.staticMethod();Demo.staticNum100;System.out.println(----------创建第一个对象----------);Demod1newDemo();d1.instanceNum10;staticNum;//静态变量共享System.out.println(----------创建第二个对象----------);Demod2newDemo();d2.instanceNum20;staticNum;//看结果System.out.println(d1实例变量d1.instanceNum);//10自己的System.out.println(d2实例变量d2.instanceNum);//20自己的System.out.println(静态staticNumDemo.staticNum);//2共享同一个//普通方法必须new对象才能调用d1.instanceMethod();}}逻辑是这样的当我们创建了一个新的对象new我们调用的静态变量自加一而实例中的变量直接创建和赋值运行结果如下静态代码块执行这是static静态方法100----------创建第一个对象----------实例代码块执行----------创建第二个对象----------实例代码块执行d1实例变量10d2实例变量20静态staticNum102这是普通实例方法10210核心差异总结静态static• 属于类类加载就产生只一份• 调用类名.变量 / 类名.方法()不用new对象• 静态方法不能直接访问普通实例变量/方法无static实例• 属于对象new创建对象之后才有每个对象独立一份• 调用对象.变量 / 对象.方法()必须new• 普通实例方法静态、实例的成员全都能访问访问权限修饰符public修饰类、属性、方法表示权限是公开的在项目中都可以调用private私有的只能修饰类中的成员权限是只能在本类中访问protected只能在同一个包下和子类中访问缺省不写类中缺省不写同一个包下接口中缺省不写默认public继承与多态继承的语法extends继承是面向对象的重要特性子类通过extends关键字继承父类的属性和方法实现代码复用。classAnimal{Stringname;publicvoideat(){System.out.println(name 正在吃东西);}}classDogextendsAnimal{publicvoidbark(){System.out.println(name 正在汪汪叫);}}方法重写Override子类可以重写父类的方法使用Override注解标记表示该方法是对父类方法的重写。classAnimal{publicvoidsound(){System.out.println(动物发出声音);}}classDogextendsAnimal{Overridepublicvoidsound(){System.out.println(狗在汪汪叫);}}当然我们也可以不写Override注解方法依然能够正常重写。不过这样做存在一些弊端缺少编译期检查如果方法签名写错例如参数类型、方法名拼写不一致编译器不会报错而是把它当作一个全新的方法导致重写静默失败运行时行为与预期不符。可读性下降阅读代码时无法直观地看出该方法是对父类方法的重写容易让其他开发者误以为这是一个新增方法增加理解成本。维护风险增加当父类方法被修改或删除时没有注解提示子类中的方法可能悄然失去重写关系留下难以排查的隐患。因此在重写父类方法时建议始终加上Override注解让编译器帮我们校验重写是否正确也让代码意图更加清晰。多态的实现多态是指同一个方法调用在不同对象上表现出不同的行为。核心是父类引用指向子类对象。AnimalanimalnewDog();// 父类引用指向子类对象animal.sound();// 实际调用的是 Dog 类重写后的方法继承与多态实战示例下面通过一个完整的 Java 示例演示继承的语法、方法重写以及多态的实现。// 父类动物classAnimal{protectedStringname;publicAnimal(Stringname){this.namename;}// 父类方法发出声音publicvoidsound(){System.out.println(name 发出声音);}// 父类方法吃东西publicvoideat(){System.out.println(name 正在吃东西);}}// 子类狗继承 AnimalclassDogextendsAnimal{publicDog(Stringname){super(name);}// 重写父类的 sound 方法Overridepublicvoidsound(){System.out.println(name 汪汪叫);}// 子类特有方法publicvoidguard(){System.out.println(name 正在看家);}}// 子类猫继承 AnimalclassCatextendsAnimal{publicCat(Stringname){super(name);}// 重写父类的 sound 方法Overridepublicvoidsound(){System.out.println(name 喵喵叫);}}publicclassTestPolymorphism{publicstaticvoidmain(String[]args){// 父类引用指向子类对象多态AnimaldognewDog(旺财);AnimalcatnewCat(咪咪);// 调用重写后的方法dog.sound();cat.sound();// 调用父类中未重写的方法dog.eat();cat.eat();// 子类特有方法需要通过子类类型调用DogrealDognewDog(大黄);realDog.guard();}}运行结果旺财 汪汪叫 咪咪 喵喵叫 旺财 正在吃东西 咪咪 正在吃东西 大黄 正在看家通过这个示例可以看到子类通过extends继承父类的属性和方法实现代码复用通过Override重写父类方法让不同子类表现出不同的行为多态让父类引用可以指向任意子类对象使代码更加灵活和可扩展。封装封使用受限制的权限修饰符修饰属性或者方法使得这个类的对象不能直接调用这个属性赋值不能直接调用方法执行。比如使用private装提供一套公开的访问方式给属性赋值setter 方法publicvoidset属性名(参数){this.属性名参数;}获取属性的值getter 方法public数据类型 get属性名(){return属性;}封装实战示例下面通过一个完整的 Java 示例演示private属性、setter/getter 方法、构造方法重载以及静态方法调用的实际使用场景。publicclassStudent{// private 属性外部不能直接访问privateStringname;privateintage;// 构造方法重载一无参构造publicStudent(){System.out.println(调用无参构造方法);}// 构造方法重载二带两个参数publicStudent(Stringname,intage){this.namename;this.ageage;System.out.println(调用带参构造方法);}// setter 方法给属性赋值publicvoidsetName(Stringname){this.namename;}publicvoidsetAge(intage){if(age0||age150){System.out.println(年龄不合法拒绝赋值);return;}this.ageage;}// getter 方法获取属性的值publicStringgetName(){returnname;}publicintgetAge(){returnage;}// 静态方法类名直接调用publicstaticvoidshowSchool(){System.out.println(学校某某大学);}// 普通方法展示学生信息publicvoidshowInfo(){System.out.println(姓名name年龄age);}publicstaticvoidmain(String[]args){// 通过无参构造创建对象再使用 setter 赋值Students1newStudent();s1.setName(张三);s1.setAge(20);s1.showInfo();// 通过带参构造创建对象直接初始化属性Students2newStudent(李四,22);s2.showInfo();// 非法年龄赋值会被拦截s2.setAge(200);// 静态方法通过类名直接调用Student.showSchool();}}运行结果调用无参构造方法 姓名张三年龄20 调用带参构造方法 姓名李四年龄22 年龄不合法拒绝赋值 学校某某大学通过这个示例可以看到外部无法直接访问private属性只能通过 setter/getter 方法读写从而在赋值时加入校验逻辑保证数据安全构造方法重载让对象创建更灵活静态方法则无需创建对象即可通过类名调用。总结代码格式更加规范可读性更好数据的安全性更好读写分离
返回列表