Java细节问题归纳与总结(一)

 

一、this、static关键字

this关键字:表示当前实例化的对象本身,表示当前对象。

              出现在普通方法中,谁调用该方法,this就表示谁

              出现在构造方法中,this表示构建出来的对象

this关键字的用法:

                this.属性名:用来区分成员变量和局部变量

                this.方法名():可以省略this

                this(): 只能出现在构造方法的第一行

**************************************************************************************************************

static关键字:方便在没有创建对象的情况下进行调用(方法/变量)。

* static关键字:归属问题
 *         被static修饰的成员变量归属于类,没有修饰归属于对象
 *         被static修饰的方法归属于类,没有修饰的归属于对象
 *         1.修饰成员变量:静态变量,归类所有
 *         2.修饰方法:静态方法,归类所有,可以通过类名.静态方法名()调用,同类可以省略类名.
 *         3.修饰代码块:静态代码块,用于类的初始化操作,静态变量初化后,main方法执行前被JVM主动调用(允许用户在类加载时做一些初始化动作)

   补充:static代码块

  • static代码块随着类的加载而加载,并且只初始化执行一次;

  • 静态初始化块中不能直接访问非static成员;

  • 静态初始化块可以置于类中的任何地方,类中可以有多个静态初始化块,多个静态代码块会按照书写顺序加载。

    语法:static { 初始化语句 }

        static代码块:

class Teacher {
	// 定义一个静态代码块
	static {
		System.out.println("静态代码块初始化。。。");
	}
	
	// 定义一个静态变量
	static String schoolName="武汉厚浦";
	String username;
	int age;
	// 定义一个静态方法
	public static void sleep() {
		System.out.println("你该休息休息了");
	}
}

public class StaticDemoTest3 {
	public static void main(String[] args) {
		// 创建多个对象并执行相关方法
		Teacher t1= new Teacher();
		t1.sleep();
		
		Teacher t2= new Teacher();
		t2.sleep();
	}
}

运行结果:

 面试问题:

1.在静态方法中能直接调用实例方法吗?不能
2.在main方法中能使用this关键字吗?
    不能,因为main方法是静态方法,归类所有,不需要new对象就能调用,而this表示当前对象,必须有对象才有this.

3.在静态方法中能直接访问实例变量吗?
    不能
4.在实例方法中能直接调用静态方法吗?
    可以
5.在实例方法中能直接访问静态成员变量吗?
    可以

代码块的执行顺序(易错):

 例一:

class CodeBlock {
    //静态代码块:类中方法外,加static修饰,用于给类进行初始化
    static{
        System.out.println("静态代码块");
    }
     
    //构造代码块:类中方法外,用{}括起,每次调用构造方法前执行,用于给对象进行初始化
    {
        System.out.println("构造代码块");
    }
     
    // 构造方法
    public CodeBlock(){
        System.out.println("无参构造");
    }
}
 
public class CodeBlockDemo {
    public static void main(String[] args) {
        {
            System.out.println("局部代码块");
        }
        CodeBlock t2 = new CodeBlock();
        CodeBlock t3 = new CodeBlock();
    }
}

 例二:

public class Father {

    static{
        System.out.println("father的静态代码块");
    }

    {
        System.out.println("father的构造代码块");
    }

    public Father(){
        System.out.println("father的构造方法");
    }
}

public class Son extends Father {

    static{
        System.out.println("son的静态代码块");
    }

    {
        System.out.println("son的构造代码块");
    }

    public Son(){
        System.out.println("son的构造方法");
    }
}

public class Test {

    public static void main(String[] args) {
        new Son();
    }
}

 

 二、单例模式

介绍:单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

代码实现:

1、懒汉式,线程不安全

package com.bailiban.singleton;

/**
 * 单例模式:懒汉式:什么时候使用,什么时候创建对象(时间换空间)
 */
public class Singleton {

    //构造方法私有化
    private Singleton() {
    }

    //静态的私有的实例变量
    private static Singleton singleton;

    //提供公共的静态的方法入口
    public static Singleton getInstance(){
        if (singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }

    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        Singleton instance1 = singleton.getInstance();

        System.out.println(instance == instance1);
    }
}

2、饿汉式

package com.bailiban.singleton;

/**
 * 饿汉式
 */
public class Singleton1 {

    private Singleton1(){

    }

    private static Singleton1 singleton1 = new Singleton1();

    public static Singleton1 getInstance(){
        return singleton1;
    }

    public static void main(String[] args) {
        Singleton1 instance = Singleton1.getInstance();
        Singleton1 instance1 = singleton1.getInstance();

        System.out.println(instance == instance1);
    }
}

三、java继承后各个成员的特点

  1. 成员变量

如果子类父类中出现不重名的成员变量,这时的访问是没有影响的

如果子类父类中出现重名的成员变量,这时的访问是有影响的

  1. 成员方法

如果子类父类中出现不重名的成员方法,这时的调用是没有影响的

如果子类父类中出现重名的成员方法,可分为方法重载和方法重写两种情况。其中,如果子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。

  1. 构造方法

构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的。

子类的初始化过程中,必须先执行父类的初始化动作。子类的构造方法中默认有一个 super() ,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。

 四、java 中的final关键字及用法

- final修饰类:表示最终类,也就是此类不能被继承;

- final修饰变量:表示常量,也就是一个变量的值始终如一,无法变更;

- final修饰方法:表示最终方法,也就是此方法不能被重写。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值