Java OOP 概括

Java OOP


OOP三大特性:继承、封装、多态


Java-类的格式:

    class Student{
        属性声明方法
        private String name;
        //构造方法
        public Student(String name){
            this.name=name;
        }
        //普通方法
        public void study(){
            System.out.println("我去上学了!");
        }
    }

访问修饰符:public,protected,默认,private (表示的范围依次递减)
public: 随意访问;
protected:最极限,不同包的子类可以访问到;
private:只有该类中能访问;
默认:包访问限制,只有该包内能访问;
与C++不同,Java每个单独的方法或者属性都要单独声明他的访问修饰符;

对象声明
Student a=new Student(); //只有这一种方式声明对象;


super和this关键字的使用

super:
用于子类方法中,产生指向父类对象,之后可以通过super来访问父类方法属性;
特别的,在构造方法中注意:
当父类中没有构造函数,写不写super()都可以;
当父类中有构造函数,必须要写一个对应的super();
因为子类会继承父类,所以用super()构造了一个父类对象后,子类会继承父类的值,所以子类中的属性和父类一致。

this:
指向当前对象的一个引用;
在构造函数中,可以用this()来调用其他构造函数;

    public Student(){
        this("zhangsan","Java");
    }
    public Student(String name){
        this(name,"Java");
    }
    #以上两个构造函数都调用了第三个构造函数来实例化
    public Student(String name,String km){
        this.name=name;
        this.km=km;
    }

多态:

继承、方法重载、方法重写、向上转型

方法重载:

public void compare(int a,int b);
public void compare(float a,float b);
方法重载的意义在于 操作相同但参数不同时,我们需要重新再写一个函数;
overload(重载)
  1、参数类型、个数、顺序至少有一个不相同。
  2、存在于父类和子类、同类中。
3、函数名一样
4、可以有不同的返回类型和访问修饰符;

方法重写:

    class A{
        public int fun1(int a,int b){
            return a+b;
        }
    }
    class B extends A{
        public int fun1(int a,int b){
            return a-b;
        }
    }

override(重写)
   1、方法名、参数、返回值相同。
   2、子类方法不能缩小父类方法的访问权限。
   3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
   4、存在于父类和子类之间。
   5、方法被定义为final和private不能被重写。

向上转型:

    public class A {
        public void fun1() {
            System.out.println("A fun1");
            fun2();
        }
        public void fun2() {
            System.out.println("A fun2");
        }
    }
    #B继承A
    public class B extends A{
        public void fun1(String s) {
            System.out.println("B fun1");
            fun2();
       }
        public void fun2() {
            System.out.println("B fun2");
        }
        public void fun3(){}
    }
    主函数:
    public class Main {
        public static void main(String args[]) {
            A b=new B();
            b.fun1();
            b.fun3();  //编译报错;
        }
    }

调用结果:
A fun1
B fun2

使用向上转型有几个注意点:
编译时 会根据声明的类型来寻找属性和方法,如上代码,b的申明类型是A,但它在A中找不到fun3,报错;
但是运行时,调用函数一定是先调用子类的,再调用父类的。
new其实就是在运行时动态分配空间,所以编译时看等号左边,运行时看等号右边。

猜你喜欢

转载自blog.csdn.net/gease_gg/article/details/80640474