Java-封装、继承、多态

封装

面向对象中的封装:封装可以提高安全性,把属性和方法封装到一个类型,属性使用private修饰,提高属性的安全性。
封装使用方便,把属性使用private修饰,方法用public修饰,当访问私有的属性(private修饰属性),可以通过该类中公有的方法来访问(public修饰的方法)

public class Test1 {
    public static void main(String[] args) {
        User user=new User();
//        user.name="关羽";//错误
        user.setName("关羽");
    }
}
class User{
    //通过一个类,把属性和方法封装到了一起,属性使用private修饰,方法用public修饰,外界不能直接访问该属性,但可以通过公有方法来间接访问私有属性
    private String name;
    public void setName(String name){
        this.name=name;
    }
}

javaBean

是企业开发的一种约定俗成的习惯,不是具体的语法概念,用来保存数据。
javaBean要求:
1)    属性私有(使用private修饰属性)
2)    必须有public修饰的get/set方法来访问私有的属性
3)    构造方法必须有,而且要有一个空参的构造方法
目的:操作数据,使用方便

public class Test1 {
    public static void main(String[] args) {
        Person person=new Person();
        person.setName("刘诗诗");
        person.setAddress("中国");
        person.setAge(29);
        person.setPhone("12355566666");
        System.out.println(person.getName());
        System.out.println(person.getAddress());
        System.out.println(person.getAge());
        System.out.println(person.getPhone());
    }
}
class Person{
    private String cardNo;//私有的属性
    private String name;
    private String phone;
    private int age;
    private double salary;
    private String address;
    public Person(){}//空参的构造方法
    //针对私有属性,有get/set方法来访问
    public String getCardNo() {
        return cardNo;
    }
    public void setCardNo(String cardNo) {
        this.cardNo = cardNo;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
}

继承

1)复用:开发只需要定义独有的功能(属性和方法),再复用曾经写过的功能(属性和方法)
2)extends:继承的关键字
格式:class 子类 extends 父类
3)子类可以继承父类的方法和属性
4)继承本质:把父类的属性和方法代码拷贝到子类中,再写子类代码时候,可以减少代码量,只需要添加新的部分
5)java中的继承单继承:子类只能有一个直接的父类,但是层层继承

public class Test1 {
    public static void main(String[] args) {
        Student student=new Student();
        //name,age,sex这三个属性,Student这个类从父类Person2中继承过来
        student.name="刘英谦";
        student.age=18;
        student.sex="男";
        student.address="哈尔滨";
        student.score=100;
        student.speak();
        student.add(12, 23);
        
        Teacher teacher=new Teacher();
        teacher.name="孔祥燕";
        teacher.age=18;
        teacher.sex="女";
        teacher.salary=5000;
        teacher.speak();
        teacher.teach();
    }
}
//设计一个Person类,属性:姓名,性别,年龄
//暂时不要写任何的构造方法,方法:说话的行为
//设计一个Student类,属性:姓名,性别,年龄,分数,地址
//暂时不要写任何的构造方法,方法:说话的行为,加法运算
//设计一个Teacher类型,属性:姓名,性别,年龄,工资
//暂时不要写任何的构造方法,方法:说话的行为,讲课
class Person2{//父类
    String name;
    int age;
    String sex;
    void speak(){
        System.out.println("我是:"+name);
    }
}
class Student extends Person2{//子类
    int score;
    String address;
    void add(int num1,int num2){
        int sum=num1+num2;
        System.out.println(sum);
    }    
}
class Teacher extends Person2{//子类
    double salary;
    void teach(){
        System.out.println("讲课");
    }
}
public class Test1 {
    public static void main(String[] args) {
        Foo4 foo4=new Foo4();
        System.out.println("f1="+foo4.f1);
        System.out.println("f2="+foo4.f2);
        System.out.println("f3="+foo4.f3);
        System.out.println("f4="+foo4.f4);
    }
}
class Foo1{
    int f1=1;
}
class Foo2 extends Foo1{
    int f2=2;
}
class Foo3 extends Foo2{
    int f3=3;
}
class Foo4 extends Foo3{
    int f4=4;
}

继承中的构造方法的使用

1)子类不能继承父类的构造方法,子类会默认的调用父类的构造方法(父类中没有无参的构造)
2)父类中有无参的构造方法,子类可以任意设计自己构造方法

public class Test1 {
    //父类中有空参的构造方法,则子类可以任意的创建自己的构造方法
    public static void main(String[] args) {
        Emp2 emp=new Emp2("刘",23);
        emp.show();
        Emp2 emp1=new Emp2("王",37,30000.0);
        emp1.show();
        System.out.println(emp1.salary);
    }
}
class Emp1{
    String name;
    int age;
    //默认提供空参的构造方法
    void show(){
        System.out.println(name+","+age);
    }
}
class Emp2 extends Emp1{
    double salary;
    //父类有空参的构造方法,子类任意设计自己的构造方法
    Emp2(String name,int age,double salary){
        this.name=name;
        this.age=age;
        this.salary=salary;
    }
    Emp2(String name,int age){
        this.name=name;
        this.age=age;
    }
}

父类中没有空参的构造方法,则子类的构造方法必须要调用父类中带参数的构造方法
super:过去的,曾经的
super(参数):写在子类构造方法的第一行,调用父类中的构造方法

public class Test1 {
    public static void main(String[] args) {
        User2 user=new User2("张","123456",20);
        System.out.println(user.name);
        System.out.println(user.password);
        System.out.println(user.age);
    }
}
class User1{
    String name;
    String password;
    //父类中构造方法带参数
    User1(String name,String password){
        this.name=name;
        this.password=password;
    }
}
class User2 extends User1{
//父类中只有带参数的构造方法的时候,子类就会默认的去调用父类的构造方法
//利用super来调用父类的构造方法
//企业开发中,父类最好都写一个不带参数的构造方法,这样子类可以任意去创建自己的构造方法
    int age;
    User2(String name,String password,int age){
        super(name,password);//super(参数):根据参数去调用父类中的构造方法,而且super必须写在第一行
        this.age=age;
    }
}
public class Test1 {
    //企业开发一般建议,设计类的时候,都添加一个空参的构造方法,这样其他程序根据父类,可以任意的设计自己的子类的构造方法
    public static void main(String[] args) {
        Koo2 koo2=new Koo2("刘",23,"广州");
        System.out.println(koo2.name+","+koo2.age+","+koo2.address);
    }
}
class Koo1{
    String name;
    int age;
    Koo1(String name,int age){
        this.name=name;
        this.age=age;
    }
    //给父类添加一个空参的构造方法
    Koo1(){}    
}
class Koo2 extends Koo1{
    String address;
    Koo2(String name,int age,String address){
        this.name=name;
        this.age=age;
        this.address=address;
    }
}

多态

对象的多种形态
1.引用多态
父类的引用可以指向本类的对象
父类的引用可以指向子类的对象

2.方法多态
创建本类对象时,调用的方法为本类方法
创建子类对象时,调用的方法为子类重写的方法或者继承的方法

原文地址:https://www.cnblogs.com/lilyo/p/12792640.html