Java面向对象 08 - 11
Java面向对象08 - 封装详解
- 程序设计追求,
高内聚,低耦合
, 高内聚就是类的内部数据操作细节自己完成,低耦合是仅暴露少量的方法给外部使用 - 封装 (数据的隐藏)
- 通常应该进制直接访问一个对象中的数据,应该通过操作接口来访问,这称为信息隐藏
- 属性私有,get/set
封装的意义
- 提高程序安全性
- 隐藏代码的实现细节
- 提高可维护性
- 统一借口
通常在set的时候我们可以写一些条件,来规范外部的输入
package Demo04;
//类
public class Student {
//属性私有
private String name; //名字
private int id; //id
private char sex; //性别
private int age; // 年龄
//提供一些可以操作这个属性的方法
//public的get、set方法
//get
public String getName(){
return this.name;
}
//set
public void setName(String name){
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age>120||age<0){
this.age = 3;
}
else{
this.age = age;
}
}
}
package Demo04;
public class Application {
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("赵晓艺");
System.out.println(s1.getName());
s1.setAge(999); //不合法
System.out.println(s1.getAge());
}
}
赵晓艺
3
Java面向对象09 - 什么是继承
- 所有类都继承了Object类(直接或者间接)
- super
- 方法重写
package Demo05;
public class Person {
public void say(){
System.out.println("说了一句话");
}
}
package Demo05;
public class Student extends Person{
}
package Demo05;
public class Teacher extends Person{
}
package Demo05;
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.say();
}
}
说了一句话
Java面向对象10 - Super详解
super注意点
- super调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或者构造方法中
- super 和 this不能同时调用构造方法
this VS super
- 代表的对象不同
- this 本身调用者这个对象
- super 代表父类对象的应用
- 前提
- this 没有继承也可以使用
- super 只能在继承条件才可以使用
- 构造方法
- this() 本类的构造
- super() 父类的构造
注意:在子类的构造函数中,如果没有明确的写,则会自动调用父类的构造方法,此时,如果父类写了一个有参构造,没有写无参构造,子类构造函数中又没有写有参调用super(), 那么会报错。因为父类不会再自动生成无参构造函数了,但子类因为没有明确写出则会自动调用父类的无参构造。
package Demo05;
public class Person {
protected String name = "zhaoxiaoyi";
public Person(){
System.out.println("Person无参执行了");
}
public void print(){
System.out.println("Person");
}
}
package Demo05;
public class Student extends Person{
private String name = "liangjunyi";
public Student(){
//调用父类的构造器,必须要在子类构造器的第一行
//父类没有写无参构造,那么子类也不能调用无参super()
super(); //可以不写,也会执行
System.out.println("Student无参执行了");
}
public void test(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
public void print(){
System.out.println("Student");
}
public void test2(){
print();
this.print();
super.print();
}
}
package Demo05;
public class Application {
public static void main(String[] args) {
Student student = new Student();
// student.test("梁骏毅");
student.test2();
}
}
Student
Student
Person
Java面向对象11 - 方法重写
- 重写都是方法,与属性无关
- 重写与静态方法无关,与非静态方法有关
- 需要有继承关系,子类重写父类的方法
- 方法名必须相同
- 参数列表必须相同
- 修饰符,范围可以扩大,但不能缩小,父类是private,重写可以是public,但是反之不行
- public>protected>default>private
package Demo06;
public class B {
public void test(){
System.out.println("B test");
}
}
package Demo06;
public class A extends B {
@Override
public void test() {
System.out.println("A test");
}
}
package Demo06;
public class Application {
//静态方法与非静态方法有区别
public static void main(String[] args) {
// 静态方法
// 方法的调用只和左边有关
A a = new A();
a.test();
//父类的引用指向了子类
//b指向了A
B b = new A();
b.test();
}
}
A test
A test