封装
1,将属性定义为私有的(private) 不能通过 对象名.属性 来直接访问,但是可以通过方法来间接的访问,
2,封装的意义:公有属性可以被随意修改,并且不能被程序察觉。封装后,别人通过方法来访问属性时,我们可以添加限制,访问可以被程序察觉。
下面我们用封装定义一个手机类(这种类一般我们称为 javabean)
1 public class Phone { 2 private String type; 3 private int price; 4 private String color; 5 6 public String getType(){ 7 return type; 8 } 9 public void setType(String type){ 10 this.type=type; 11 } 12 public int getPrice() { 13 return price; 14 } 15 public void setPrice(int price) { 16 this.price = price; 17 } 18 public String getColor() { 19 return color; 20 } 21 public void setColor(String color) { 22 this.color = color; 23 } 24 25 }
注意
1,类中属性和方法的定义顺序没有先后之分
2,当参数与属性重名时,计算机会优先考虑参数(这本身是错误的,不要这样做)
继承
继承:子类继承父类的几乎所有内容(属性跟方法) 关键字 extends
1,那么什么不能被继承呢? private(私有属性)和构造方法不能被继承
2,所有类都是object的子类
3,在java中只能单继承
重写:当子类继承过来的方法不满意,重新覆盖这个方法。
1,当重写了父类的方法,调用的是子类重写过的方法,不会调用父类的那个方法。
1 public class Person { 2 3 public void eat(){ 4 System.out.println("我是父类的方法吃..."); 5 } 6 }
1 public class Student extends Person { 2 //重写 方法名与父类相同 会覆盖父类的方法 3 @Override 4 public void eat() { 5 System.out.println("我是子类中重写的父类方法吃..."); 6 } 7 }
1 public class Text { 2 //我是测试类 3 public static void main(String[] args) { 4 Student s=new Student(); 5 s.eat(); 6 } 7 } 8 //控制台输出结果为: 9 //我是子类中重写的父类方法吃...
2,super 可以在子类中调用父类的方法
1 public class Student extends Person { 2 //重写 方法名与父类相同 会覆盖父类的方法 3 @Override 4 public void eat() { 5 //调用父类中的eat() 6 super.eat() 7 System.out.println("我是子类中重写的父类方法吃..."); 8 } 9 } 10 //若再进行测试,控制台输出结果为: 11 //我是父类的方法吃... 12 //我是子类中重写的父类方法吃...
重载:方法名与父类相同,参数列表不同 ,是根据参数列表来匹配执行哪个方法
1 public class Student extends Person { 2 //重载 方法名与父类相同,参数列表不同 3 public void eat(String s) { 4 System.out.println("我是子类中重载的父类方法吃..."); 5 } 6 } 7 8 9 public class Text { 10 //我是测试类 11 public static void main(String[] args) { 12 Student s=new Student(); 13 //参数对应就会调用相应的方法 14 s.eat("sss"); 15 } 16 } 17 //结果为:我是子类中重载的父类方法吃...
要点:当创建子类对象的时候,会先初始化父类的对象。如果没有显示调用父类的构造方法,默认调用父类的无参的构造方法。
构造方法重载
1 public Student(String sex){ 2 System.out.println("------>sex"); 3 //如果没有显示调用父类的构造方法,默认调用父类的无参的构造方法。 4 this.sex = sex ; 5 } 6 7 public Student(String sex,int age){ 8 this(sex); // this() 表示的是本类其他的构造方法,根据参数寻找是哪个构造方法。当表示其他构造方法的时候必须必须放在第一行。 9 this.age = age ; 10 System.out.println("------>sex age "); 11 } 12 13 14 public Student(){ 15 super("sssss");// 显示调用父类的构造方法,不需要方法名。当super父类构造方法的时候,必须放在第一行。 16 System.out.println("-----Student的构造方法------"); 17 }