day19
面向对象的三大特性
三大特性
封装
继承
多态
封装
package com.saas; public class Student { String name; int age; double score; boolean sex; }package com.saas; public class TestEncapsulation { public static void main(String[] args) { Student s = new Student(); s.name = "bajie"; s.age = 2000; s.sex = true; s.score = -59; System.out.println(s.name); System.out.println(s.sex); System.out.println(s.age); System.out.println(s.score); } }最终的运行结果:
bajie true 2000 -59.0在对象的外部,为对象的属性赋值,可能会存在非法数据的录入
就目前的技术而言,并没有办法对于属性的赋值加以控制
上面的案例中成绩给的值是-59,而且最终也成功打印出来,但是大家这个是不合法的数据
封装就可以解决这样的问题
封装的现实生活中的案例比如“胶囊”, 比如发动机不允许随便的给用户暴露接口
概念:尽可能的隐藏对象的内部实现细节, 控制对象的修改以及访问权限
访问修饰符: private,私有的,意思是只有当前类可以访问的成员,仅本类可见
package com.saas; public class Student02 { private String name; private int age; private double score; private boolean sex; public void sayHi(){ System.out.println("name: \t" + name); System.out.println("age: \t" + age); System.out.println("sex: \t" + sex); System.out.println("score: \t" + score); } }package com.saas; public class TestEncapsulation02 { public static void main(String[] args) { Student02 s = new Student02(); s.name = "bajie"; // 此处会出现编译报错,因为name是Student02类中的私有成员,只有在Student02类的内部可以访问,在Student02类以外的其他类都无法访问Student类中的私有成员 s.age = 2000; s.sex = true; s.score = -59; System.out.println(s.name); System.out.println(s.sex); System.out.println(s.age); System.out.println(s.score); } }这个代码在编译时就出现了编译报错
因为name,age,sex,score在Student类中被定义为private私有的访问权限
private私有访问权限的意思是只有在当前类Student02类中可以被访问,
一旦跳出Student02类之后,其他类中是无法访问Student02类中的私有成员的
在此我们说编译错误其实是对于我们程序的一种保护
但是目前程序有一个问题,即使合法值也无法进行赋值操作
package com.saas; public class Student03 { private String name; private int age; private double score; private boolean sex; public void setScore(double score){ if(score > 100 || score < 0){ System.out.println("请输入合法的成绩值:(0-100)"); score = 0; } this.score = score; } public double getScore(){ return score; } public void sayHi(){ System.out.println("name: \t" + name); System.out.println("age: \t" + age); System.out.println("sex: \t" + sex); System.out.println("score: \t" + score); } }package com.saas; public class TestEncapsulation03 { public static void main(String[] args) { Student03 s = new Student03(); s.setScore(-99); System.out.println(s.getScore()); } }以上程序我们可以看出,虽然继续保持了属性的私有化,但是同时提供了一对儿public的set和get方法
setXxx方法可以实现给对应的属性赋值
getXxx方法可以实现获取对应的属性值
但是由于setXxx是一个方法,我们可以在方法内部加一些非法数据的判断 和处理,使得非法值无法实现赋值,并给与用于以有好的提示
对于成绩而言,合法值的取值范围是(0-100),正常范围内的值,可以直接赋值
而对于非法值赋值会有额外的错误提示并给与默认处理值,使得程序对于正确值和非法值都可以进行相应的处理
这个setXxx被称之为setter,getXxx方法被称之为getter
命名规则为setXxx()以及getXxx
对于boolean类型的getter而言,标准的写法应该是isXxx, sex是boolean类型的属性,所以其标准版的getter是isSex
最终封装的实现步骤:
先将属性私有化,使用private来修饰
再给该属性提供共有的setter和getter
在setter中可以使用判断来实现对于非法值恶意值的屏蔽与过滤
封装的好处:可以提高程序的安全性
缺点:大大增加了代码量
package com.saas; public class Teacher { private String name; private String major; private int age; private boolean sex; public boolean isSex() { return sex; } public void setSex(boolean sex) { this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } public int getAge() { return age; } public void setAge(int age) { if(age < 26){ System.out.println("年龄必须大于等于26岁"); age = 26; } this.age = age; } }package com.saas; public class TestEncapsulation04 { public static void main(String[] args) { Teacher t1 = new Teacher(); t1.setName("wukong"); t1.setAge(500); t1.setMajor("computer"); t1.setSex(true); System.out.println(t1.getName()); System.out.println(t1.getAge()); System.out.println(t1.getMajor()); System.out.println(t1.isSex()); System.out.println("========================"); Teacher t2 = new Teacher(); t2.setName("honghaier"); t2.setAge(12); t2.setMajor("shaohuo"); t2.setSex(true); System.out.println(t2.getName()); System.out.println(t2.getAge()); System.out.println(t2.getMajor()); System.out.println(t2.isSex()); } }当年龄小于26岁时,这是一个非法值,在setter方法内部,对于这些非法的值进行屏蔽与过滤
访问修饰符
public:公共的,在同一个项目中,都可以被访问的资源
protected:受保护的,在同包或者不同包的子类可以被访问
default:默认值,只在同包下的资源可以访问
private:私有的,只有自己能够访问的资源
继承
标签:Java,入门,age,System,public,println,sex,day19,out From: https://blog.csdn.net/zpz2001/article/details/136910955“子承父业”,老爸有的,子类可以无需做任何事情,可以得到父类的资源
生活中的继承,是施方的一种赠与,受方的一种获取,将一方所拥有的东西给予另一方,一般来说双方具备一种继承关系(直系,亲属)
程序中的继承, 是类与类之间的特征和行为赠与或者获得
一般来说两个类之间要具备一个“is a”的关系
现实生活中,很多类之间都存在继承关系,都满足“is a”的关系
狗是一种动物,狗是一种生物,狗是一种物质
package com.saas; public class Animal { String breed; int age; boolean sex; public void eat(){ System.out.println("eatting..."); } public void sleep(){ System.out.println("sleeping..."); System.out.println("zzzZZZ"); } }package com.saas; /** * Dog继承自Animal * 则在dog内部无需重复定义父类的成员而直接使用 */ public class Dog extends Animal { public void run(){ System.out.println("running..."); } }package com.saas; public class TestExtends01 { public static void main(String[] args) { Animal a = new Animal(); a.breed = "dog"; a.age = 5; a.sex = true; System.out.println("breed:\t" + a.breed); System.out.println("age:\t" + a.age); System.out.println("sex:\t" + a.sex); a.eat(); a.sleep(); System.out.println("====================="); Dog xiaohei = new Dog(); xiaohei.breed = "中华田园犬"; xiaohei.sex = false; xiaohei.age = 3; System.out.println("breed:\t" + xiaohei.breed); System.out.println("age:\t" + xiaohei.age); System.out.println("sex:\t" + (xiaohei.sex ? "公": "母")); xiaohei.eat(); xiaohei.sleep(); xiaohei.run(); } }语法:class子类extends 父类{} // 定义子类时,显式继承父类
应用:产生继承关系之后,子类可以使用父类中的属性和方法
好处: 既提高代码的可读性,又提高了代码的可扩展性
package com.saas.oo; public class Teacher { String name; int age; String major; public void introduce(){ System.out.println("name:\t" + name); System.out.println("age:\t" + age); System.out.println("major\t"+ major); } public void giveLesson(){ System.out.println("知识点回顾"); System.out.println("知识点讲解"); System.out.println("知识点总结"); } }package com.saas.oo; public class JavaTeacher extends Teacher{ @Override public void giveLesson() { System.out.println("打开idea"); super.giveLesson(); } } package com.saas.oo; public class TestExtends02 { public static void main(String[] args) { Teacher t1 = new Teacher(); t1.major = "computer"; t1.age = 20; t1.name = "zhangsan"; t1.introduce(); System.out.println("------------------"); t1.giveLesson(); System.out.println("-================="); JavaTeacher t2 = new JavaTeacher(); t2.major = "computer"; t2.age = 26; t2.name = "zhangsan"; t2.introduce(); System.out.println("------------------"); t2.giveLesson(); System.out.println("-================="); } }此案例中Teacher类中定义三个属性,两个方法,可以直接使用
JavaTeacher继承自Teacher类,所以Teacher类中无需做额外的定义,即可拿到JavaTeacher的这三个属性和这两个方法
Java中使用extends代表一种继承关系,class 子类 extends 父类
继承的好处:大大节省了代码量
继承的缺点:必须得有对应的继承关系