java之面向对象
面向对象的三大特征:继承(Inheritence)、封装(Encapsulation)、多态(Polymorphism)
1、封装
封装:类中包含了数据(属性或者是成员变量)与方法,将数据与方法放在一个类中就构成了封装。
java封装的目的:提高代码的安全性,提高代码的复用性,便于维护。
如何实现封装?
// 创建一个学生类Student
class Student {
// 定义两个属性,一个name,一个age
private String name;
private int age;
public Student (){}
//对name,age进行封装
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
}
//在Test类中输出
public class Test{
public static void main(String []args){
Student student=new Student();
student.setName("新白者");
student.setAge(18);
System.out.println(student.getName());
System.out.println(student.getAge());
}
}
输出结果:
新白者
18
this变量—解决重名问题
当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量,如果需要访问 本类的成员变量,需要使用格式:this.成员变量
如:this.name=name;
修饰符public,private,protected的比较
public:用public修饰,这种情况下,类对所有类都可见,范围最大。如果一个类没有修饰符(默认),它只能在自己的package(包)中可见。
private:私有的,用private修饰,它只能在本类中使用,是一种封装的体现。
如:上面的程序中name,age用的是private修饰,那么name和age只能在Student中使用,在Test类用System.out.println(student.name);就会报错。只能是System.out.println(student.getName());就会输出名字。
protected:在同一个包中可以调用,在不同的包中可以继承那个类来使用protected修饰的属性。
2、继承
java是单继承的,意味着一个类只能从另一个类继承(被继承的类叫做父类(基类),继承的类叫做子类。)java中的继承使用extends关键字。
public class Son extends Father {
public Son() {
System.out.println("I am a Son");
}
public static void main(String[] args) {
Son son = new Son();
}
}
class Father {
public Father() {
System.out.println("I am a Father");
}
}
输出结果:
I am a father
I am a Son
main方法中执行语句Son son = new Son();时,在执行子类构造方法之前会先去执行父类的那个不带参数的构造方法。因为子类中的所有构造方法的第一行有默认的隐式super();语句它是来访问父类中的空参数构造方法,进行父类成员的初始化操作。
public class Son extends Father {
public Son() {
System.out.println("I am a Son");
}
public static void main(String[] args) {
Son son = new Son();
}
}
class Father {
public Father(int i){
System.out.println("Father");
}
public Father() {
System.out.println("I am a Father");
}
}
输出结果:
I am a father
I am a Son
super
super与this都能调用普通方法和构造函数。this是调用本类的构造方法,super关键字是调用父类的构造函数,super表示对父类对象的引用,super和this都必须要作为构造方法的第一条执行语句。并且两条语句不能同时存在。
public class Son extends Father {
public Son() {
super(4);
System.out.println("I am a Son");
}
public static void main(String[] args) {
Son son = new Son();
}
}
class Father {
public Father(int i){
System.out.println("Father");
}
public Father() {
System.out.println("I am a Father");
}
}
输出结果:
Father
I am a Son
子类可以继承父类的属性
public class Test{
public static void main(String[]args){
Son son=new Son();
System.out.println(son.name);
}
}
class Father{
String name="新白者";
}
class Son extends Father{
}
输出结果:
新白者
子类可以对父类的属性进行修改
public class Test{
public static void main(String[]args){
Son son=new Son();
System.out.println(son.name);
}
}
class Father{
String name="新白者";
}
class Son extends Father{
String name="小白";
}
输出结果:
小白
父类没有的属性,子类可以添加属性
public class Test{
public static void main(String[]args){
Son son=new Son();
System.out.println(son.name);
}
}
class Father{
}
class Son extends Father{
String name="小白";
}
输出结果:
小白
注意
构造方法不能被继承。
方法和属性可以被继承。
子类的构造方法隐式调用父类不带参数的构造方法。
当父类没有不带参数的构造方法时,子类需要使用super来显式地调用父类的构造方法,super指的是对父类的引用,super关键字必须是构造方法的第一行语句。