面向对象(一)(封装,继承,多态,继承与组合,初始化块)
2015-07-22 09:06
435 查看
1. 封装
封装(Encapsulation)是指把对象的状态信息隐藏在对象的内部,不允许程序直接访问对象的内部信息,要通过他提供的方法来对内部的信息进行访问和操作。
访问控制符解释:
private:当前类访问权限
default:包访问权限
protect:子类访问权限
public:公共访问权限
示例:
2. 继承
继承通过关键字extends来实现的,实现继承的类被称为子类,被继承的类称为父类,有的也称为基类,或者超类。
示例:
运行结果:
3.多态
Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时由声明该变量时使用的类型决定,运行时由实赋给该变量的对象决定。如果编译时和运行时的类型不一致,就是所谓的多态。
注意:利用关键字instanceof 可以判断类型,进行强转,避免发生类型转换错误。
示例:
运行结果:
4.继承与组合
组合是把旧的对象作为新类的成员变量组合进来,用来实现新的功能,用户看到新类的方法,但是看不到组合对象的方法。
把学生作为老师的成员属性。
示例:
运行结果:
5初始化块
执行顺序
静态初始化块→普通初始化块→构造函数
静态初始化块是类相关,只执行一次
普通初始化块,构造函数都是对象相关,每次创建新的对象都会执行
示例及运行结果:
封装(Encapsulation)是指把对象的状态信息隐藏在对象的内部,不允许程序直接访问对象的内部信息,要通过他提供的方法来对内部的信息进行访问和操作。
访问控制符解释:
private:当前类访问权限
default:包访问权限
protect:子类访问权限
public:公共访问权限
示例:
class Person{ private String name; private int 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 Person(String name, int age) { super(); this.name = name; this.age = age; } public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
2. 继承
继承通过关键字extends来实现的,实现继承的类被称为子类,被继承的类称为父类,有的也称为基类,或者超类。
示例:
public class Demo01 { public static void main(String[] args) { Student s1 = new Student("张一", 19, 89.3); Student s2 = new Student("李二", 18, 80); Student s3 = new Student("王三", 17, 99.3); System.out.println(s1); System.out.println(s2); System.out.println(s3); } } class Student extends Person{ private double grade;//学生除了人的共性属性外,还有特有属性,成绩 public Student(String name, int age, double grade) { super(name, age); this.grade = grade; } public double getGrade() { return grade; } public void setGrade(double grade) { this.grade = grade; } public String toString() {//子类重写toString()方法 return super.toString()+"Student [grade=" + grade + "]"; } } class Person{ private String name; private int age; public Person(){ //注意:一般把父类的无参构造函数写上,子类不用显示继承父类构造函数 } public Person(String name, int age) { super(); this.name = name; this.age = 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 String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
运行结果:
3.多态
Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时由声明该变量时使用的类型决定,运行时由实赋给该变量的对象决定。如果编译时和运行时的类型不一致,就是所谓的多态。
注意:利用关键字instanceof 可以判断类型,进行强转,避免发生类型转换错误。
示例:
public class Demo01 { public static void main(String[] args) { Person s1 = new Student("张一", 19, 89.3); Person t2 = new Teacher("郭天", 18, "一级教师"); System.out.println(s1); System.out.println(t2); if(t2 instanceof Teacher){//对象类型判断 Teacher teacher = (Teacher)t2;//强转为老师 teacher.job();//调用老师特有的方法 } } } class Teacher extends Person { private String classJob;// 职称 public Teacher(String name, int age, String classJob) { super(name, age); this.classJob = classJob; } public String getClassJob() { return classJob; } public void setClassJob(String classJob) { this.classJob = classJob; } public void job(){ System.out.println("每天的工作是上课。"); } public String toString() { return super.toString() + "Teacher [classJob=" + classJob + "]"; } } class Student extends Person { private double grade;// 学生除了人的共性属性外,还有特有属性,成绩 public Student(String name, int age, double grade) { super(name, age); this.grade = grade; } public double getGrade() { return grade; } public void setGrade(double grade) { this.grade = grade; } public String toString() {// 子类重写toString()方法 return super.toString() + "Student [grade=" + grade + "]"; } } class Person { private String name; private int age; public Person() { // 注意:一般把父类的无参构造函数写上,子类不用显示继承父类构造函数 } public Person(String name, int age) { super(); this.name = name; this.age = 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 String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
运行结果:
4.继承与组合
组合是把旧的对象作为新类的成员变量组合进来,用来实现新的功能,用户看到新类的方法,但是看不到组合对象的方法。
把学生作为老师的成员属性。
示例:
public class Demo01 { public static void main(String[] args) { Student student = null; Person s1 = new Student("张一", 19, 89.3); if(s1 instanceof Student){ student = (Student) s1; } Person t2 = new Teacher("郭天", 18, "一级教师",student); System.out.println(s1); System.out.println(t2); if(t2 instanceof Teacher){//对象类型判断 Teacher teacher = (Teacher)t2;//强转为老师 teacher.job();//调用老师特有的方法 } } } class Teacher extends Person { private String classJob;// 职称 private Student student;//把学生对象作为老师的成员变量 public Teacher(String name, int age, String classJob, Student student) { this(name, age,classJob); this.student = student; } public Teacher(String name, int age, String classJob) { super(name, age); this.classJob = classJob; } public String getClassJob() { return classJob; } public void setClassJob(String classJob) { this.classJob = classJob; } public void job(){ System.out.println("有学生:" + student.toString()); System.out.println("每天的工作是上课。"); } public String toString() { return super.toString() + "Teacher [classJob=" + classJob + "]"; } } class Student extends Person { private double grade;// 学生除了人的共性属性外,还有特有属性,成绩 public Student(String name, int age, double grade) { super(name, age); this.grade = grade; } public double getGrade() { return grade; } public void setGrade(double grade) { this.grade = grade; } public String toString() {// 子类重写toString()方法 return super.toString() + "Student [grade=" + grade + "]"; } } class Person { private String name; private int age; public Person() { // 注意:一般把父类的无参构造函数写上,子类不用显示继承父类构造函数 } public Person(String name, int age) { super(); this.name = name; this.age = 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 String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
运行结果:
5初始化块
执行顺序
静态初始化块→普通初始化块→构造函数
静态初始化块是类相关,只执行一次
普通初始化块,构造函数都是对象相关,每次创建新的对象都会执行
示例及运行结果:
相关文章推荐
- MySQL 查询某个列中相同值的数量统计
- php实现短信发送代码
- freemarker该阵列
- 什么是死锁,试举例说明?
- Android基础入门教程——3.1 基于监听的事件处理机制
- java之反射机制
- hibernate不支持插入操作
- Android基础入门教程——2.3.1 TextView(文本框)详解
- openGL 错误总结
- uva 784 Maze Exploration(简单dfs)
- PLsql登录显示no logon(没有登录)
- Struts2配置的Param如何调用?
- 如何刷新清除DNS解析缓存命令
- 探索C#之6.0语法糖剖析
- 上线数据导入的几个注意事项
- CSDN iOS安全攻防专栏
- 杭电oj 2206 IP的计算
- 关于项目对表单校验的需求
- POJ-1961-Period
- 再见,viewDidUnload方法