类和对象 继承 重写 重载 java代码生成顺序
类和对象
- 类 : 是一个模板,它描述一类对象的行为和状态
- 对象 : 是类的一个实例,有状态和行为
- 面向对象的三大特征
- 封装,继承,多态
构造函数 :对对象中的属性初始化操作,或者是准备资源
- 系统会自动给每一个类添加一个无参构造方法
- 如果自定义了构造方法,系统默认构造犯法就不存在了
static
- 一个类中静态方法不能直接调用非静态方法
- 因为java中类对象先被加载,这时对象还未被加载
- 继承
- 子类继承父类,子类就拥有父类中定义的可继承的属性和方法
- 子类继承父类,单继承(只能有一个父亲)
- 可以多重继承(爷孙)
- 在子类的构造方法中
- 第一行代码默认调用父类的无参构造方法
- super()必须放在第一行
- 假如父类没有无参的构造方法,就会报错
- 方法重写
- 子类重写父类的方法
- 方法名不变
- 参数列表必须保持不变
- 子类中重写的方法的访问权限可以更高(开放),不能更低(闭塞)
- 方法重载
- 方法名一样,参数列表不一样
结构:
- Obj1.java
1 public static void main(String[] args) { 2 3 Person person = new Person(); 4 person.setName("zhangsan"); 5 person.setAge(22); 6 person.setSex("male"); 7 System.out.println(person.getName()); 8 person.speak(); 9 }
- Obj2.java
1 public static void main(String[] args) { 2 Son son = new Son(); 3 son.name = "zhangsan"; 4 son.code(); 5 Partent partent = new Son(); 6 //Son s = (Son)new Partent(); 7 //Son s = (Son)partent; 8 partent.code(); 9 }
- Partent.java
1 public class Partent extends Person{ 2 3 public Partent() { 4 // TODO Auto-generated constructor stub 5 System.out.println("调用Partent的构造方法"); 6 } 7 8 public void code() { 9 System.out.println("I am coding"); 10 } 11 }
- Person.java
1 package com.obj; 2 3 public class Person { 4 String name; 5 private int age; 6 private String sex; 7 8 public Person() { 9 this.name = "wangwu"; 10 this.age = 22; 11 this.sex = "male"; 12 } 13 14 public Person(String name , int age , String sex) { 15 this.name = name; 16 this.sex = sex; 17 this.age = age; 18 } 19 public void speak() { 20 System.out.println(name + " speak"); 21 } 22 public String getName() { 23 return this.name; 24 } 25 public int getAge() { 26 return age; 27 } 28 public String getSex() { 29 return sex; 30 } 31 public void setName(String name) { 32 this.name = name; 33 } 34 public void setAge(int age) { 35 this.age = age; 36 } 37 public void setSex(String sex) { 38 this.sex = sex; 39 } 40 }
- Son.java
1 package com.obj; 2 3 public class Son extends Partent{ 4 //子类继承父类,子类就拥有父类中定义的 5 //可继承的属性和方法 6 //子类继承父类,单继承(只能有一个父亲) 7 //可以多重继承(爷孙) 8 9 public Son() { 10 super(); 11 //在子类的构造方法中 12 //第一行代码默认调用父类的无参构造方法 13 //super()必须放在第一行 14 //假如父类没有无参的构造方法,就会报错 15 System.out.println("调用Son的构造方法"); 16 } 17 18 public void play() { 19 System.out.println("I am playing..."); 20 } 21 22 //方法重写 23 //子类重写父类的方法 24 //方法名不变 25 //参数列表必须保持不变 26 //子类中重写的方法的访问权限可以更高(开放),不能更低(闭塞) 27 public void code() { 28 System.out.println("I want to earn money"); 29 } 30 31 32 //方法重载 33 //方法名一样,参数列表不一样 34 public void code(String code) { 35 System.out.println("I am print "+code); 36 } 37 public void code(String code , int a) { 38 System.out.println("I am print "+code); 39 } 40 public int code(int code) { 41 System.out.println("I am print "+code); 42 return 0; 43 } 44 }
- java代码生成顺序
- 先加载静态代码
- 先加载父类再加载子类
- 代码块 > 构造
结构:
- O.java
1 package com.obj1; 2 3 public class O { 4 public static void main(String[] args) { 5 S s = new S(); 6 S ss = new S(); 7 //打印结果是: 8 //1->4->2->3->5->6(->2->3->5->6) 9 //1---执行父类静态代码块 10 //2---执行子类静态代码块 11 //3---父类的普通代码块 12 //4---父类的构造 13 //5---子类的普通代码块 14 //6---子类的构造 15 //*******************// 16 //7---父类普通代码块 17 //8---父类的构造 18 //9---子类普通代码 19 //10--子类构造 20 //总结: 21 //1先加载静态代码 22 //2先加载父类再加载子类 23 //3代码块 > 构造 24 } 25 }
- P.java
1 package com.obj1; 2 3 public class P { 4 static { 5 System.out.println("1---父类静态代码块---1"); 6 } 7 public P(){ 8 System.out.println("3---父类构造----3"); 9 } 10 { 11 System.out.println("2---父类普通代码----2"); 12 } 13 14 }
- S.java
1 package com.obj1; 2 3 public class S extends P{ 4 static { 5 System.out.println("4---子类静态代码----4"); 6 } 7 { 8 System.out.println("5---子类普通代码块----5"); 9 } 10 public S(){ 11 System.out.println("6---子类构造----6"); 12 } 13 }