java中万事万物皆对象 面向对象的三大特性: 封装、继承、多态
对象和类之间的关系
类是众多对象的一个抽象描述,类中定义了一类对象所具有的静态(属性)和动态属性(方法)
类可以看成一类对象的模板,对象可以看成类的具体实例
设计类时合适的方法应该出现在合适类中
面向对象的程序设计中实际上进行的是创建新的数据类型,但事实上所有的面向对象程序设计语言中都是使用class这个关键字来表示数据类型
打个比方:
所有的类描述了具有相同特性(属性)和行为(方法)的对象集合,而浮点数数字也是同样具有相同的特性和行为的集合,二者的差异在于,类是通过程序员定义来 处理问题,而不是用来表示机器中的存储单元的数据类型 所以类其实也是一个数据类型。
类和类之间的关系
关联关系、实现关系、聚合 、组合
Java用三个关键字在类的内部设定边界 public private protected 访问级别如下表格
| 类内部 | package内 | 子类 | 其他 |
public | 允许 | 允许 | 允许 | 允许 |
protected | 允许 | 允许 | 允许 | 不允许 |
default | 允许 | 允许 | 不允许 | 不允许 |
private | 允许 | 不允许 | 不允许 | 不允许 |
继承
类的继承知识点
(1)java不支持多重继承,也就是说子类至多只能有一个父类
(2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法
(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承
(4)子类中定义的成员方法,并且这个成员方法的名字,返回类型,及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。
多态
父类的引用类型指向子类的对象父类:
public class Person {
private String name="person";
int age;
String sex;
{
System.out.println("person 初始化快 name:"+name);
}
static{
System.out.println("person 静态初始化快");
}
public Person(int i) {
System.out.println("person++");
}
public void ShowName(){
System.out.println("person>>>"+name);
}
}
子类:
public class Teacher extends Person {
private String name = "teacher";
private static int age = 0;
{
System.out.println(name+">>>>teacher");
System.out.println("Teacher 初始化块");
}
static {
age = 1;
System.out.println("Teacher static初始化块");
}
public Teacher() {
// super(0);
this(1);
System.out.println("teacher");
}
public Teacher(int age) {
super(0);
this.age = super.age;
this.age = age;
System.out.println("teacher1");
}
private int dep;
public void setDep(int dep) {
this.dep = dep;
}
public int getDep() {
return dep;
}
// public void ShowName(){
// System.out.println("teacher'name is "+name);
// }
public static void main(String[] args) {
/**
* 1、父类的静态初始化快
* 2、初始化子类的静态初始化块
* 3、父类的初始化快
* 4、父类的构造器
* 5、子类的初始化块
* 6、子类的构造器
*
* 父类的方法 访问的是父类的属性 子类的方法 访问的是子类的属性
*/
Person p = new Teacher();
p.ShowName();
// p.
// p=new Person();
// p.ShowName();
// Teacher T = new Teacher();
// T.name="";
}
}
子类父类的初始化顺序:
* 1、父类的静态初始化快
* 2、初始化子类的静态初始化块
* 3、父类的初始化快
* 4、父类的构造器
* 5、子类的初始化块
* 6、子类的构造器
另外需要记住一点
父类的方法 访问的是父类的属性 子类的方法 访问的是子类的属性
上面的代码中 子类父类都有Name属性 和showName 方法 如果new Teacheer().showName(); 如果调用的是子类的ShowName 方面 打印的是 teacher 如果屏蔽掉子类中的showName 方法 打印出来的是person了
未完待续~~~