普歌-逆越团队--java面向对象基础

面向对象

面向对象与面向过程

面向过程让计算机有步骤的顺序的做一件事情,是一种过程化的叙事思维。
这里举个例子会更容易理解,比如说“开门”。面向过程的方法内定义的是开门的具体步骤实现;面向对象是首先定义一个“Door”对象,然后抽象出门的属性和操作行为,属性包括门的颜色、尺寸、开启方式、防盗功能等;门这个对象必然也包括open()和close()两个必备行为。

接口与抽象类

  1. 接口可以多继承接口,抽象类只能被子类继承
  2. 接口和抽象类都不能实例化,如果要实例化,抽象类的变量通过指向实现它的子类,接口通过实现它的实现类对象。
  3. 抽象类可以有构造方法,接口中不能有构造方法。
  4. 接口只能做接口声明,抽象类可以做方法声明和方法实现

抽象类的实例化

public class Son extends Father{
    public Son(int b) {
        super(b);
    }
    @Override   //子类重写抽象方法
    public void play() {
    }
}

abstract class Father {
    public Father(int b) {
        System.out.println(b);
    }
    public abstract void play();
}

public static void main(String[] args) {
       // Son s = new Son();抽象类不能直接实例化
        Father aa = new Son(123);
    }

接口中的方法定义:

  • 接口中可以定义静态方法的,静态方法必须要有实现。且这个静态方法只 能用public修饰。
  • 对于普通方法,修饰符为: public, abstract, default以及组合 public abstract
    对接口中的属性也有一点说明:
    在interface里面的变量都是public static final 的。所以你可以这样写:
    public static final int i=10;

    int i=10;(可以省略掉一部分)

    注意:在声明的时候要给变量赋予初值,不能是默认初值。

内部类

什么是内部类?
在Java中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类。内部类本身就是类的一个属性,与其他属性定义方式一致。
内部类的分类

静态内部类只能访问外部类的静态成员变量和方法
成员内部类可以访问外部类所有的属性和方法(但是外部类要访问成员内部类的属性和方法,必须要先实例化成员内部类)
局部内部类定义在方法或表达式内部(不能被public ,protected,private以及static修饰,可以被final修饰)
匿名内部类当一个内部类需要继承或者实现,而且只使用一次的时候,可以考虑使用匿名内部类。调用的时候直接使用父类的无参构造,并重写父类方法

内部类的优点

  1. 内部类可以实现java的单继承局限。
public class A {
    private int num = 100;
    public void play(){
        System.out.println("Happy!");
    }
}
public class B {
    public String name = "小李";
    public void play(){
        System.out.println("Interesting!");
    }
}
public class Outer {
    class a extends A {  //C中内部类a继承A类
        public void printA(){
            play();
        }
    }
    class b extends B { //C中内部类b继承B类
        public void printB(){
            play();
        }
    }
        public void print(){
            new a().printA();//匿名实例化a类对象并调用printA方法
            new b().printB();
    }
}
public class Test {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.print();
    }
}

  1. 内部类与外部类可以方便的访问彼此的私有域(包括私有方法、私有属性)。
  2. 内部类是另外一种封装,对外部的其他类隐藏。

访问权限控制

面向对象核心思想之一就是封装,只把有限的方法和成员公开给别人,如何实现封装呢?就要用到访问权限控制符
在这里插入图片描述

推荐:

  1. 如果不允许外部直接通过new创建对象,构造方法必须是private
  2. 工具类不允许有public或default构造方法
    为什么工具类要将方法和变量设置为静态的:
    因为,这些方法只是想调用一下,不需要牵扯工具类中的任何属性和变量,所以就没有必要实例化了(new)。既然不需要实例化了,那么就用静态就行了。
  3. 类非static成员变量并且与子类共享,protected
  4. 类非static成员变量如果仅在本类使用,private
  5. 类static成员变量如果仅在本类使用,private
  6. 若是static成员变量,必须考虑是否为final
  7. 类成员方法只供类内部调用,private
  8. 类成员方法只对继承类公开,那么限制为protected

this和super

在这里插入图片描述共同点:
1.都是关键字,起指代作用。
2.在构造方法中必须出现在第一行。

方法

构造方法

  1. 构造方法名必须与类名相同。
  2. 构造方法没有返回值类型,即使是void也不能有。
  3. 构造方法不能被继承、不能被重写、不能直接调用。
  4. 类定义时提供了默认的无参构造方法。
  5. 构造方法可以私有

标准代码——javabean
在这里插入图片描述

类内方法

1.实例方法(非静态方法)
可以调用静态变量和静态方法,当从外部创建对象后,“类名.静态方法”来调用。

public class T {
    public void A(){
        System.out.println("这是非静态方法");
    }
    public static void B(T s){
        System.out.println("这是静态方法");
        s.A();
    }
    public static void main(String[] args) {
        T obj = new T();
        B(obj);//在主函数中可以直接调用静态方法
    }
}

2.静态方法(类方法)

  • 静态方法中不能使用实例成员变量和实例方法
  • 静态方法不能使用super和this关键字,这两个关键字指代的都是需要被创建出来的对象。

3.静态代码块
静态代码块在类加载的时候就被调用,并且只执行一次。先于构造方法执行,不能存在任何方法体内。

数据类型

基本数据类型

在这里插入图片描述

包装类型

在java中很多情况都需要以对象的形式操作,包装类的存在解决了基本数据类型无法做到的事情:泛型类型参数、序列化、类型转换、高频区间数据缓存。

  • Java的基础数据类型的包装类:Integer,Long,Double,Float,Boolean,Byte,Short,Character。
  • Boolean:使用静态 final 定义,就会返回静态值
    Byte:缓存区 -128~127
    Short:缓存区 -128~127
    Character:缓存区 0~127
    Long:缓存区 -128~127
    Integer:缓存区 -128~127
    也就是说,在这个区间中,我们不需要new一个对象,直接赋值即可使用。
public class T {
    public static void main(String[] args) {
        Long a = 127L;     //Long缓存范围是0~127
        Long b = 127L;
        System.out.println(a==b);//true
//Integer是唯一可以修改缓存范围的包装类,注意:一旦你修改了缓存上限,都存到了常量池中,加大了内存的负担)
        Integer e = 1000;    //Integer缓存范围是-128~-127
        Integer f = 1000;
        System.out.println(e == f);
    }
}

自动装箱–基本数据类型–>包装类的过程–例如:Integer i = 5;
自动拆箱–包装类–>基本数据类型的过程–例如:Int a = new Integer(5);

字符串

字符串相关类型主要有三种:String、StringBuilder、StringBuffer

String创建对象的方式:
1.直接赋值,String 对象名=“字符串”

String name1="Tom";

2.new构造方法,String 对象名=new String(“字符串”);

String name1=new String("Tom");

new String("Tom ") 到底产生几个对象?

String对象复制操作后,除了在堆内存中创建,也会在常量池中进行缓存,如果下次缓存中已经存在,则直接返回相应引用给创建者。
也就是说准确答案是产生了一个或两个对象

StringBuilder和StringBuffer

首先要知道,StringBuffer和StringBuilder的实现内部是和String内部一样的,都是通过 char[]数组进行储存字符串的;不同的是String的char[]数组是通过final关键字修饰的是不可变的,而StringBuffer和StringBuilder的char[]数组是可变的。
在这里插入图片描述

相关问题补充

成员变量与局部变量的区别

1.作用域
成员变量:针对整个类有效。
局部变量:只在方法,语句体内有效。
2.存储位置
成员变量:随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中。
局部变量:当方法被调用,或者语句被执行时存在,存储在栈内存中。当方法被调用完,或语句结束后,就自动释放。
3.初始化
成员变量:有默认初始化。
局部变量:没有默认初始化,使用前必须赋值。

静态变量和实例变量

1.调用方式
静态变量可以直接通过类名调用,这个变量属于类
实例变量只能通过对象名调用,这个变量属于对象
2.存储位置
静态变量随着类的加载而存在于方法区中
成员变量随着对象的建立而存在于堆内存中
3.生命周期
静态变量随着类的消失而消失
实例变量随着对象的消失而消失

图示

在这里插入图片描述

有不足之处欢迎大家指正,我会一直努力更新补充~

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值