java:面向对象全代码理解版

java面向对象

1.类和对象的创建

类是一种抽象的数据类型,它是对某一事物的整体定义,对象是一个类的具体的实例。

如人是一个类,而男人女人是他的一个实例对象。

package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-13-20:26
 */
public class SubjectCreate {

    //属性
    String name;
    int age;

    //方法
    public void study(){
        System.out.println(this.name+"正在学习!");
    }
}
package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-13-20:26
 */
public class Application {
    public static void main(String[] args) {

        //主启动类
        //在此实例化一个类对象

        SubjectCreate create = new SubjectCreate();
        SubjectCreate create1 = new SubjectCreate();
        create.name="xiaoming";
        create.age=12;
        create1.name="xiaohong";
        create1.age=18;
        System.out.println(create.name);
        System.out.println(create.age);
        create.study();
        System.out.println(create1.name);
        System.out.println(create1.age);
        create1.study();
    }
}

构造器:每个类都有一个默认的构造器,没有返回值,方法名字和类名一样,在使用new关键字的时候必须有一个构造器,才能为该对象注入值。

重载构造器:可以自己定义一个有参构造器,通过该有参构造器在new的时候为对象传值,重写了有参之后就要自己定义无参构造了,否则就不能使用了。

//重载构造器
public SubjectCreate(String name,int age){
    this.name=name;
    this.age=age;
}
//有参构造器赋值
SubjectCreate create = new SubjectCreate("xiaoming",18);
SubjectCreate create1 = new SubjectCreate("xioahong",89);
create.study();
create1.study();

2.面向对象三大特性

封装:将类中的数据封装起来,只暴露一个接口给对象调用。即将属性私有化,提供set/get方法即可。

package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-13-20:59
 */
public class Enclosure {
    //私有属性
    private String name;
    private int age;
    //set方法
    public void setName(String name){
        this.name=name;
    }

    public void setAge(Integer age){
        this.age=age;
    }

    //get方法
    public String getName(){
        return this.name;
    }
    public int getAge(){
        return this.age;
    }
}
package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-13-20:26
 */
public class Application {
    public static void main(String[] args) {

        //主启动类
        //在此实例化一个类对象
        //对私有化属性调用公共方法设置和获取
        Enclosure enclosure = new Enclosure();
        enclosure.setName("tata");
        enclosure.setAge(12);
        System.out.println(enclosure.getName());
        System.out.println(enclosure.getAge());
    }
}

封装可以提高代码的安全性,保护数据。

统一接口

方便调用

继承:一个类通过extends关键字可以继承另一个类,子类就可以拥有父类的所有的属性和方法。

package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-13-21:11
 */
 //没有任何属性和方法的儿子定义了继承父类
public class ExtendsSon extends ExtendsFather {

}
package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-13-21:11
 */
//有属性和方法的父类
public class ExtendsFather {

    String name;
    String sex;

    public void study(){
        System.out.println("father正在学习");
    }
}
package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-13-20:26
 */
public class Application {
    public static void main(String[] args) {

        //主启动类
        //在此实例化一个类对象
       //实例化一个子类,打印出父类的方法
        ExtendsSon son = new ExtendsSon();
        son.study();
    }
}

super关键字与子类重写父类方法

super :为了区别当子类和父类有同名的属性或者方法时,区别到底子类调用的是自己还是父类。super.指向父类的方法或者属性。

super调用父类的构造方法,必须在构造方法的第一个

super必须只能出现在子类的方法中

super和this不能同时调用构造方法

package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-13-20:26
 */
public class Application {
    public static void main(String[] args) {

        //主启动类
        //在此实例化一个类对象
       //实例化一个子类,打印出父类的方法
        ExtendsSon son = new ExtendsSon();
        System.out.println(son.name);
        son.study();
    }
}
package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-13-21:11
 */

public class ExtendsSon extends ExtendsFather {
   String name="son";
    
//使用super关键字调用了父类中的方法
   public void study(){
       super.study();
    }
}

子类重写父类方法

非静态方法。

public修饰的

重写的方法是子类继承了父类的方法,对父类的方法进行重写。参数和方法名必须相同。

package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-14-7:49
 */
public class Son extends Father{
    //子类重写父类的test方法
    public  void test(){
        System.out.println("son==>test");
    }
}
package com.javase.Subject;

import com.sun.org.apache.xml.internal.res.XMLErrorResources_tr;

/**
 * @author panglili
 * @create 2022-07-14-7:49
 */
public class Father {
    //父类被子类重写的方法
    public  void test(){
        System.out.println("father==>test");
    }
}
package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-13-20:26
 */
public class Application {
    public static void main(String[] args) {

        //主启动类
        //在此实例化一个类对象
       //父类的引用指向子类
        Father father = new Son();
        Son son=new Son();
        son.test();
        father.test();
        //输出
//        son==>test
//        son==>test

    }
}

多态:父类的引用指向子类对象

多态必须是具有继承关系的

多态是方法的多态,属性没有多态

方法需要重写,父类就会调用到子类的重写方法

父类要调用子类中有的而自己没有的方法,就会强转为子类。

package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-13-20:26
 */
public class Application {
    public static void main(String[] args) {

        //主启动类
        //在此实例化一个类对象
       //父类的引用指向子类
        Father father = new Son();
        Son son=new Son();
        son.test();
        father.test();
        //强制类型转换
        ((Son) father).eat();
        //输出
//        son==>test
//        son==>test

    }
}

instanceof关键字:

因为父类转换为子类的时候是向下转型去调用子类方法,是具有父子关系的两个类之间,instanceof关键字就是判断这种父子关系的关键字。

package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-13-20:26
 */
public class Application {
    public static void main(String[] args) {

        //主启动类
        //在此实例化一个类对象
       //父类的引用指向子类
        //System.out.println(x instanceof y);
        //x和y有父子关系转换才能通过
        Father father = new Son();
        Father instance = new Instance();
        
        System.out.println(father instanceof Object);//true
        System.out.println(father instanceof Father);//true
        System.out.println(father instanceof Instance);//false
        System.out.println(instance instanceof Father);//true
        System.out.println(instance instanceof Son);//false



    }
}

5.static

静态的,跟类一起加载。

静态变量:可以直接用类名访问。

静态方法:只能调用静态的属性和方法,因为它先加载在内存中。

静态代码块:会先加载一些初始化作用的数据。

6.抽象类和接口

被abstract修饰的类就叫抽象类。不能被new出来,只能被子类继承。

被abstract修饰的方法就是抽象方法,抽象方法只有方法定义,没有实现,只能由继承它的子类实现,除非继承它的子类也是抽象的。

(1)抽象

package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-14-8:50
 */
public abstract class AbstractUse {
    //抽象类中的抽象方法,没有实现,只有定义
    public abstract void test();

    //抽象类中的普通方法,可以有实现
    public void test1(){
        System.out.println("普通方法");
    }
    }
package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-14-8:53
 */
public class AbstractSon extends AbstractUse {

    //实现了抽象父类,就必须重写抽象方法
    @Override
    public void test() {
        System.out.println("子类重写的抽象方法");
    }
}
package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-13-20:26
 */
public class Application {
    public static void main(String[] args) {

        //主启动类
        //在此实例化一个类对象

        //不能new抽象类,只能被继承
      //  AbstractUse use = new AbstractUse();

        AbstractSon son = new AbstractSon();
        //子类调用父类的普通方法和抽象方法
        son.test();
        son.test1();

    }
}

(2)接口

使用interface定义替换class类,就定义为一个接口。

接口里面只有抽象方法。

package com.javase.Subject;
/**
 * @author panglili
 * @create 2022-07-14-9:04
 */
public interface Interface {
     void add();
     void sub();
     int mul();
}
package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-14-9:05
 */
public class InterfaceImpl implements Interface {
    @Override
    public void add() {
        System.out.println("实现接口的方法add");
    }

    @Override
    public void sub() {
        System.out.println("实现接口的方法sub");
    }

    @Override
    public int mul() {
        System.out.println("实现接口的方法mul");
        return 0;
    }
}
package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-13-20:26
 */
public class Application {
    public static void main(String[] args) {

        //主启动类
        //在此实例化一个类对象

     //接口实现类实例化一个对象
        InterfaceImpl anInterface = new InterfaceImpl();
          anInterface.add();
          anInterface.mul();
          anInterface.sub();

    }
}

7.内部类

在类的内部在创建的类,可以直接获取类的私有属性。

package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-14-9:11
 */
public class InterClassUse {
    private static int age=10;
    public static void test(){
        System.out.println("这是一个外部类");
    }



    public class inter{
        public void test1(){
            System.out.println("这是一个内部类"+"外部类的值为"+age);
        }
    }


}
package com.javase.Subject;

/**
 * @author panglili
 * @create 2022-07-13-20:26
 */
public class Application {
    public static void main(String[] args) {

        //主启动类
        //在此实例化一个类对象

        //实例化一个内部类,必须先实例化它的外部类,由外部类实例化内部

        InterClassUse interClassUse = new InterClassUse();
        InterClassUse.inter inter = interClassUse.new inter();

        //内部类可以直接获取外部类的私有属性
        inter.test1();

    }
}
posted @ 2022-07-14 09:31  路漫漫qixiuyuanxi  阅读(201)  评论(0编辑  收藏  举报