面向对象的三大特征:
封装、继承、多态
一.封装:属性私有化,对外提供统一访问的get/set方法。完全封装。基本类型只能按值传递,而每个基本类型对应的封装类是按引用传递的。封装类的出现,是为了更方便的使用一些基本类型不具备的方法,比如valueOf(),toString()等等。还有你如果想传递一个int对象的引用,而不是值,那只能用封装类。
public class Pet { int age;// 属性私有 封装的要求 String name; // alt + shift + s public Pet(){ this(20,"张飞"); } public Pet(int age,String name){ this.age = age; this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void pritn(){ System.out.println(this); } }
二.继承:
Student(name,age,sid);
Teacher(name,age,tid);
Super(name,age);
继承的好处:
1. 代码的复用。
2. 为了以后多态的使用。
继承来的东西:
1. )一般的属性和方法被继承。
2. )构造方法不被继承。
3. )私有的方法不被继承。
4. )私有的属性被隐藏,可以通过继承来的公有方法访问。
什么时候建立父子类关系:
任何A出现的地方,换做B之后仍然成立,或者说:
B is a A : 如果符合这个公式,就可以建立父子类关系。
父类:
public abstract class Super { static{ System.out.println("父类静态语句块"); } public Super(){ System.out.println("父类构造方法"); } public abstract void test(); }
子类:
public class Sub extends Super{ static{ System.out.println("子类静态语句块"); } public Sub(){ super(); System.out.println("子类构造方法"); } public void test(){ System.out.println("实现"); } }
*.对于构造方法来说:
构造方法的第一行不是super(..)就是this(..)
如果一个构造方法第一行不是this(..)或super(..),则默认是对父类无参构造的调用super();
不可能所有的构造都是this(..),至少有一个是super(..);
在子类中使用和父类中同样名字的属性没有意义,对实际开发没有任何好处,所以应该避免。
如果子类中有和父类名字相同的方法
1. 如果参数不同:构成了重载。
2. 如果参数相同:构成了重写。
重写:覆盖 覆写。
1. 发生在父子类中。
2. 同名同参同返回。
3. 子类方法的修饰符不能比父类方法的修饰符更封闭。(要么相同,要么更开放)
private—默认—protected—public。
4. 子类方法抛出的异常不能比父类方法抛出的异常更宽泛。
重载:
1. 发生同一类中
2. 同名不同参。参数个数不同、参数顺序不同、参数类型不同均构成重载。
3. 返回值类型没有要求。
如果一个类没有指定继承其他父类,则它的父类是Object。
this指本类对象。
super用法:指父类对象
三.多态:一个对象,多种状态。父类引用指向子类的对象
多态两点基本定理:
1. 发生多态时,只能调用父类的方法,不能调用子类的方法。
2. 发生多态时,如果子类中重写了父类的方法,再调用这个方法,调用的是子类重写之后的方法。
3. 想使用子类中独有的方法,需要使用强制类型转换
4. 注意:强制类型转换没有新建对象,只是换了一个引用。
对于静态方法来说,有重写,重写也应该是静态的。静态方法是跟类一致的,没有多态。
多态经常用传递的参数的类型和返回类型
public class Test { public static void main(String[] args) { Super s = new Sub();// 多态形式。 // s.test(); /* 静态>一般 父类>子类 * 父类静态语句块 子类静态语句块 父类构造方法 子类构造方法 */ } }