包:类过多,用包来进行分类管理。
为什么需要使用包?
(1)分门别类的进行管理。(2)提升程序的安全性能。
java中声明包:
package testextends2;
使用package进行声明
声明包是确定class的位置,而不是.java源文件的位置!
声明包的要求:
(1)包名小写(2)使用域名倒置(3)声明包的时候必须只能声明一次
面向对象的三个特征:
(1)封装-》提升代码的安全性(2)继承:提示代码的复用性(3)多态:提升程序的拓展性
封装:
1)public:公众的,任何地方都可以访问到(整个项目)
2)protect:子类及自己可以访问到。
3)package:包内即可访问到
4)private: 只能本类才能访问到。
如何使用封装来保证属性的安全性?
1:首先使用private修饰类中的成员变量(属性)
2:在赋值取值使用get和set方法
3:在赋值方法中进行合理的验证。
package com.bjsxt.day2;
public class Student{
//(1)属性私有化
private String name;
private int age;
private String gender;
//(2)提供公有的取值,赋值方法
public void setAge(int age){
//(3)在赋值的方法中对值进行合理性验证
if(age<18||age>30){
System.out.println("对不起,学生的年龄要在18到30之间");
this.age=18;//给属性设置成默认值
}else
this.age=age;//将局部变量的值赋给成员变量
}
public int getAge(){
return age;
}
public void setGender(String gender){
if(!"男".equals(gender) &&!"女".equals(gender)){
System.out.println("对不起,性别有误");
this.gender="男";
}else
this.gender=gender;
}
public String getGender(){
return gender;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
//构造方法
public Student(){
}
public Student(String name,int age,String gender){
this.name=name;
//this.age=age;
//this.gender=gender;
this.setAge(age); //调用本类的成员方法
this.setGender(gender);
}
public void show(){
System.out.println(name+"\t"+age+"\t"+gender);
}
}
测试:
package com.bjsxt.day2;
public class TestStudent{
public static void main(String [] args){
Student stu=new Student();
stu.setAge(9); //对象名.方法名
System.out.println(stu.getAge());
stu.setGender("人妖");
System.out.println(stu.getGender());
Student stu2=new Student("张三",12,"人妖");
stu2.show();
}
}
结果如图所示:
JavaBean是一个特殊的类:
1:首先类需要public修饰
2:使用get和set方法
3:属性是private
4:提供一个无参的构造方法
继承:
继承是N多个类的抽象,从N多个类抽象总结出来的属性和方法。也就是父类。
继承的代码实现:
package com.bjsxt.extends1;
public class Person {//父类
private String name;
private int age;
private String gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public Person() {
}
public void introduce(){
System.out.println("姓名:"+name+"\t年龄:"+this.getAge()+"\t性别:"+this.gender);
}
}
子类继承父类,拥有父类的属性和方法
package com.bjsxt.extends1;
public class Student extends Person {//Student类是Person类的扩展
private String stuNo;
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
public Student(String name, int age, String gender, String stuNo) {
super(name, age, gender);//调用父类的带三个参数的构造方法s
this.stuNo = stuNo;
}
public Student() {
}
}
实现:
package com.bjsxt.extends1;
public class Test {
public static void main(String[] args) {
//(1)创建Student类的对象
Student stu=new Student("张三",20,"男","sxt1001");
//创建Teacher类的对象
Teacher tea=new Teacher("李四",30,"男",6);
//来个自我介绍
stu.introduce(); //父类的方法,子类可以继承
tea.introduce();
}
}
一个类只能继承一个父类
子类可以继承父类的非private的属性和非private的方法,不能继承构造方法,可以调用父类的构造方法。
super关键字的作用:
a) super关键字可以调用父类的非private的方法和非private的属性。
b)调用父类的构造方法 ,但是必须要在子类的构造方法的第一句。
c)区分父类和子类同名的属性,比如super.name和this.name,super代表着父类的,this代表着子类的。
继承关系下调用子类对象的执行顺序
调用顺序就是:儿子调用老子,老子调用爷爷辈,直到(Object)
执行顺序就是先是最大的object的无参构造方法,然后是爷爷的参数,然后是爷爷的构造方法,自己的参数,自己的构造方法
方法重载:
1)本类中
2)方法名称相同
3)参数不同(类型,个数,顺序)
4)与访问权限和访问类型值无关
方法重写:
父类的方法不能满足子类的需求
1)发生在子类
2)方法名,参数与父类方法完全相同
3)返回值<=父类的类型 这里的返回值必须要与父类的返回值有一定的关系
4)访问权限必须要>=父类的返回值类型