普歌-逆越团队——java面向对象基础
面向对象
面向对象与面向过程
面向过程让计算机有步骤的顺序的做一件事情,是一种过程化的叙事思维。
这里举个例子会更容易理解,比如说“开门”。面向过程的方法内定义的是开门的具体步骤实现;面向对象是首先定义一个“Door”对象,然后抽象出门的属性和操作行为,属性包括门的颜色、尺寸、开启方式、防盗功能等;门这个对象必然也包括open()和close()两个必备行为。
类
接口与抽象类
- 接口可以多继承接口,抽象类只能被子类继承
- 接口和抽象类都不能实例化,如果要实例化,抽象类的变量通过指向实现它的子类,接口通过实现它的实现类对象。
- 抽象类可以有构造方法,接口中不能有构造方法。
- 接口只能做接口声明,抽象类可以做方法声明和方法实现
抽象类的实例化
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修饰) |
匿名内部类 | 当一个内部类需要继承或者实现,而且只使用一次的时候,可以考虑使用匿名内部类。调用的时候直接使用父类的无参构造,并重写父类方法 |
内部类的优点
- 内部类可以实现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();
}
}
- 内部类与外部类可以方便的访问彼此的私有域(包括私有方法、私有属性)。
- 内部类是另外一种封装,对外部的其他类隐藏。
访问权限控制
面向对象核心思想之一就是封装,只把有限的方法和成员公开给别人,如何实现封装呢?就要用到访问权限控制符
推荐:
- 如果不允许外部直接通过new创建对象,构造方法必须是private
- 工具类不允许有public或default构造方法
为什么工具类要将方法和变量设置为静态的:
因为,这些方法只是想调用一下,不需要牵扯工具类中的任何属性和变量,所以就没有必要实例化了(new)。既然不需要实例化了,那么就用静态就行了。 - 类非static成员变量并且与子类共享,protected
- 类非static成员变量如果仅在本类使用,private
- 类static成员变量如果仅在本类使用,private
- 若是static成员变量,必须考虑是否为final
- 类成员方法只供类内部调用,private
- 类成员方法只对继承类公开,那么限制为protected
this和super
共同点:
1.都是关键字,起指代作用。
2.在构造方法中必须出现在第一行。
方法
构造方法
- 构造方法名必须与类名相同。
- 构造方法没有返回值类型,即使是void也不能有。
- 构造方法不能被继承、不能被重写、不能直接调用。
- 类定义时提供了默认的无参构造方法。
- 构造方法可以私有
标准代码——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.生命周期
静态变量随着类的消失而消失
实例变量随着对象的消失而消失
图示
有不足之处欢迎大家指正,我会一直努力更新补充~