L4 面向对象

static

  • 一句话来描述就是:**方便在没有创建对象的情况下来进行调用方法/变量。**用:类名.方法/类名.变量来调用

  • static修饰方法

    static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,**在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是须依赖具体的对象才能够被调用。**但是在非静态成员方法中是可以访问静态成员方法/变量的。

  • static修饰成员变量

    static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

构造器(构造方法/函数)

  • 简介:一般用来初始化成员属性和成员方法的,即new对象产生后,就调用了对象的属性和方法。**构造函数是对象一建立就运行,给对象初始化,就包括属性,执行方法中的语句。而一般函数是对象调用才执行,用 “.方法名” 的方式,给对象添加功能。**一个类即使什么都不写,也会存在一个构造方法/函数。

  • 特点:

    1、函数名与类名相同

    2、没有返回值类型,不用写void(不同于void类型返回值,void是没有具体返回值类型;构造函数是连类型都没有)

  • 默认构造函数:

    当一个类中没有定义构造函数时,系统会给该类中加一个默认的无参构造函数,只是该函数是隐藏不见的。但是当在该类中自定义了构造函数,这个默认构造函数就没有了。(比如在类中定义一个有参构造,那么默认的无参构造函数就被抹除了,如果想保留这个无参构造,就必须显式地定义出来)

  • 一键生成构造函数:alt+insert 笔记本是alt+shift+0,然后选择constructor

    get和set:

    当要访问被private封装的属性时使用,可借此获取该类私有属性的数据。

public class demo01
{
    private int num;
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
}
public interface test02 {
    public static void main(String[] args) {
        demo01 s1= new demo01();
        //利用get和set来对s1这个对象的私有属性进行操作
        s1.setNum(1);
        int name=s1.getNum();
    }
}

继承

  • 所有类都默认继承object类(老祖)

  • ctrl+h快捷键。查看当前类的继承树

  • super和this

    this:指向对象本身的一个指针。

    super:指向自己父类对象的一个指针

    super和this的注意点:

    1,super调用父类的构造方法时,必须只能写在子类构造方法的第一行

    2,super必须只能出现在子类的方法或者构造方法中

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

    4,

    super(参数):调用父类中对应的构造函数

    this(参数):调用当前类对应的构造函数

    5,示例代码

  • //person类
    package L4;
    public class person {
        protected String name="person类";
        public void print(){
            System.out.println("person");
        }
    }
    
    //student类
    package L4;
    public class student extends person{
        protected String name="student类";
        public void print(){
            System.out.println("student");
        }
        public void test(String name){
            System.out.println(name);          //调用对象方法输入的参数
            System.out.println(this.name);     //student类
            System.out.println(super.name);    //person类
        }
    }
    
    //测试运行类
    package L4;
    public class test {
        public static void main(String[] args) {
            student s1=new student();
            s1.test("调用对象方法输入的参数");
        }
    }
    
    

权限控制符

修饰词本类同一个包的类继承类其他类
private×××
无(默认)××
protected×
public

多态

对于多态,可以总结以下几点:

  • 使用父类类型的引用指向子类的对象;

  • 该引用只能调用父类中定义的方法和变量;

  • 如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)

    这也是方法重写的关键之处

  • 变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会错。

  • 方法重写必须是非静态方法。因为静态方法在类一加载的时候就出来了。

  • 类修饰符是private、static、final的话不能重写。

  • 多态是方法的多态,跟属性无关

  • instance方法:用来判断继承关系

  • 示例代码:(父类引用指向子类

    package 方法重写;
    public class father {
        public void func1(){
        func2();
        }
        public void func2(){
            System.out.println("AAA");
        }
    }
    
    
    package 方法重写;
    public class child extends father{
        //此处重载了父类的func1方法
        public void func1(int i){
            System.out.println("BBB");
        }
        //此处重写了父类的func2方法
        //所以在父类调用func2方法时,
        //会调用子类这个重写过的func2方法
        public void func2(){
            System.out.println("CCC");
        }
    }
    
    package 方法重写;
    public class test {
        public static void main(String[] args) {
            //父类的引用指向子类,p的类型是father
            father p=new child();
            p.func2();
            p.func1();
        }
    }
    

abstract

  • 定义:

    1:用abstract修饰的类表示抽象类,抽象类位于继承树的抽象层,抽象类不能被实例化
    2:用abstract修饰的方法表示抽象方法,抽象方法没有方法体

  • 规则:

    1:抽象类可以没有抽象方法,但是有抽象方法的类必须定义为抽象类,如果一个子类继承一个抽象类,子类没有实现父类的所有抽 象方法,那么子类也要定义为抽象类,否则的话编译会出错的。
    2:抽象类没有构造方法,也没有抽象静态方法。但是可以有非抽象的构造方法
    3:抽象类不能被实例化,但是可以创建一个引用变量,类型是一个抽象类,并让它引用非抽象类的子类的一个实例
    4:不能用final 修饰符修饰

接口

  • 概念:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)

  • 通俗解释:接口可以理解为一种特殊的类,里面全部是由全局常量公共的抽象方法所组成。接口是解决Java无法使用多继承的一种手段,但是接口在实际中更多的作用是制定标准的。或者我们可以直接把接口理解为100%的抽象类,既接口中的方法必须全部是抽象方法。

  • 接口特点

    1,接口也能够拥有方法和属性,但是在接口中声明的方法默认是抽象的。(即只有方法标识符,而没有方法体)。

    2,接口指明了一个类必须要做什么和不能做什么,相当于类的蓝图。

    3,接口的作用就是告诉类,你要实现我这种接口代表的功能,你就必须实现某些方法,我才能承认你确实拥有该接口代表的某种能力。

    4,如果一个类实现了一个接口中要求的所有的方法,然而没有提供方法体而仅仅只有方法标识,那么这个类一定是一个抽象类。(必须记住:抽象方法只能存在于抽象类或者接口中,但抽象类中却能存在非抽象方法,即有方法体的方法。接口是百分之百的抽象类

    5,接口中的类默认为:public abstract

    接口中的属性默认为:public static final

  • 为什么使用接口:java不支持多继承,通过接口来弥补这个局限性

  • 接口的语法实现

    //接口声明,用interface
    package L4.接口学习;
    interface TimeService {
        final int a=10;
        void display();
    }
    
    //实现接口,用implements
    package L4.接口学习;
    public class UserServiceImpl implements TimeService{
        @Override
        public void display() {
            System.out.println("实现TimeService接口");
        }
    }
    
    

内部类

普通内部类

package L4.内部类;
//外部类
public class outer {
    private int id=100;
    public void out(){
        System.out.println("这是外部类的方法!");
    }
    //内部类
    class inner{
        public void in(){
            System.out.println("这是内部类的方法!");
        }
        //内部类可以获取外部类的私有属性、私有方法
        public void GetId(){
            System.out.println(id);
        }
    }
}


package L4.内部类;
public class Application {
    public static void main(String[] args) {
        //先实例化外部类对象p1
        outer p1=new outer();
        //然后通过这个外部类来实例化内部类对象p2
        outer.inner p2=p1.new inner();
        p2.in();
        p2.GetId();
    }
}

静态内部类

包装类

  • 概念:包装类(Wrapper Class),将八种基本数据类型封装在八个类中,让他们也拥有面向对象的特性。在这里插入图片描述

基本数据类型、包装类 的相互转换

import org.junit.Test;
public class WrapperTest {
    //包装类-->基本数据类型:调用包装类的xxxValue()
    @Test
    public void test02(){
        Integer i2=new Integer(100);
        int i02=i2.intValue();  //此时i01就是个int类型

        Float f1=new Float("12.3");
        float f01=f1.floatValue();

    }
    //基本数据类型-->包装类:调用包装类的构造器
    @Test
    public void test01(){
        int num1=10;
        Integer i1=new Integer(num1);
        System.out.println(i1.toString());

        Float f1=new Float("12.3");
        System.out.println(f1);

        Order o1=new Order();
        System.out.println(o1.ismale);   //false,默认值
        System.out.println(o1.isfamale); //null,因为isfamale是一个对象
    }
}
class Order{
    boolean ismale;
    Boolean isfamale;
}
//jdk5.0新特性,自动装箱拆箱:即可以系统可以直接将基本数据类型与包装类进行转换
import org.junit.Test;
public class WrapperTest {
    //包装类-->基本数据类型:拆箱
    @Test
    public void test02(){
        Integer i2=new Integer(100);
        int i02=i2;  //自动拆箱

        Float f1=new Float("12.3");
        float f01=f1;  //自动拆箱
    }
    //基本数据类型-->包装类:装箱
    @Test
    public void test01(){
        int num1=10;
        Integer i1=num1;  //自动装箱
        Integer i2=100;  //自动装箱
        System.out.println(i1.toString());

        boolean b1=true;
        Boolean b2=b1;   //自动装箱
    }
}

基本数据类型和包装类、String 的相互转换

    //基本数据类型和包装类--->String
    public void test03(){
        int num1=100;
        //方式一:连接运算
        String str1=num1+"";
        //方式二:调用string重载的valueof(xxx xxx)
        float f2=12.3f;
        String str01=String.valueOf(f2);
    }
    //String--->基本数据类型和包装类:调用包装类的parsexxx(String s)
    public void test04(){
        String str03="123";
        int in1=Integer.parseInt(str03);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值