java入门3

6 篇文章 0 订阅

代码块概述

代码块是类的5大成分之一(成员变量,构造器,方法,代码块,内部类),定义在类中方法外。
在JAVA类下,使用{}括起来的代码被称为代码块

静态代码块

格式:static{}
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发,只执行一次
使用场景:在类加载的时候做一些静态数据初始化的操作,以便后续使用。

import java.util.ArrayList;

public class staticcode {

    /**
     * 静态代码块,static修饰,属于类,与类一起有限加载一次自动触发执行
     * 可用于初始化静态资源
     */
    public static String s;
    public static ArrayList<Integer> list=new ArrayList<>();
    static {
        System.out.println("=====静态代码块被触发======");
        s="someday";
        list.add(1);
        list.add(3);
    }

    public static void main(String[] args) {
        System.out.println("=====main执行======");
        System.out.println(s);
        System.out.println(list);

    }
}

//输出结果
//=====静态代码块被触发======
//=====main执行======
//someday
//[1, 3]

实例代码块(了解,用的少)

格式:{}
特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在构造器执行前执行。
使用场景:初始化实例资源

public class staticcode2 {
    private String name;
    public staticcode2(){
        System.out.println("无参构造器被执行");
    }
    /**
     * 实例代码块,无static修饰,属于对象。每次构建对象时,都会触发一次执行
     */
    {
        name="tony";
        System.out.println("实例代码块被执行");
    }

    public static void main(String[] args) {
        staticcode2 s1=new staticcode2();
        System.out.println(s1.name);

        staticcode2 s2=new staticcode2();
        System.out.println(s2.name);
    }
}

设计模式

开发中经常遇到一些问题,一个问题通常有n种解法,但其中肯定有一种解法时最优的,这个最优的解法被人总结出来称为设计模式。
设计模型有20多种,对应20多种软件开发中会遇到的问题。
学习设计模式主要是学2点:
1.这种模式用来解决什么问题。
2,遇到这种问题,该模型是怎么写的,他是如何解决这个问题。

单例模式

保证系统中,应用该模式的这个类永远只有一个实例,即一个类永远只能创建一个对象。

饿汉单例设计模式

在用类获取对象的时候,对象已经提前为你创建好了
设计步骤:
定义一个类,把构造器私有。
定义一个静态变量存储一个对象。

/**
 * 使用饿汉单例实现单例类
 */
public class SingleInstance {
    /**
     * 饿汉单例是在获取对象前,对象已经提前准备好了一个。
     * 这个对象只能是一个,所以定义静态成员变量。
     */
    public static SingleInstance instance=new SingleInstance();

    /**
     * 必须把构造器私有化
     */
    private SingleInstance(){

    }
}
public class singletest {
    public static void main(String[] args) {
        SingleInstance s1= SingleInstance.instance;
        SingleInstance s2= SingleInstance.instance;
        System.out.println(s1==s2);

    }
}

懒汉单例设计模式

在真正需要该对象的时候,才去创建一个对象(延迟加载对象)
设计步骤:
定义一个类,把构造器私有。
定义一个静态变量存储一个对象。
创建一个返回单例对象的方法。


public class SingleInstance1 {
    private SingleInstance1(){

    }
    private static SingleInstance1 instance1;

    public static SingleInstance1 getInstance(){
        if (instance1==null){
            //为null的时候,为第一次创建
            instance1=new SingleInstance1();
        }
        return instance1;
        
    }
}
public class singletest1 {
    public static void main(String[] args) {
        SingleInstance1 s1=SingleInstance1.getInstance();
        SingleInstance1 s2=SingleInstance1.getInstance();
        System.out.println(s1==s2);

    }
}

面向对象三大特征之二:继承

Java中提供的关键词extends,用这个关键字,可以让一个类和另一个类建立起父子关系。
提高代码复用性,减少代码冗余,增强类的功能扩展型,


public class Student extends People{}

Student称为子类(派生类),People称为父类(基类或超类)。
Java中子类更强大。
作用:当子类继承父类后,就可以直接使用父类公共的属性和方法了。

public class People {
    /**
     * 父类
     */
    public void run(){
        System.out.println("renhuipao");
    }
}
public class Student extends People{
    /**
     * 子类
     */

}
public class test {
    public static void main(String[] args) {
        Student s=new Student();
        s.run();
    }
}

Demo

public class People {
    /**
     * 父类
     */
    private String name;
    private int age;

    public void queryCourse(){
        System.out.println(name+"在查看课表~~");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

public class Student extends People{
    /**
     * 子类
     */
    public void writerInfo(){
        System.out.println(this.getName()+"写下了");
    }

}
public class test {
    public static void main(String[] args) {
        Student s=new Student();
        s.setName("tom");
        s.setAge(18);
        s.queryCourse();
        s.writerInfo();

    }
}

继承的特点:
1.子类可以继承父类的属性和行为,但是子类不能继承父类的构造器。
2.Java是单继承模型:一个类只能继承一个直接父类。
3.Java不支持多继承、但是支持多层继承。
比如A不能同时继承B和C,但A可以继承B,同时B可以继承C。
4.Java中所有的类都是Object类的子类。

在子类方法中访问成员(成员变量、成员方法)满足:就近原则
先子类局部范围查找
然后子类成员范围查找
然后父类成员范围查找,如果父类还没有找到则报错。

如果子父类中出现了重名的成员,会优先使用子类的,此时如果一定要在子类中使用父类怎么办?
可以通过super关键字,指定访问父类成员

public class Demo {

    public static void main(String[] args) {
        dog d=new dog();
        d.showname();

    }
}

class Animal{
    public String name="动物";

}
class dog extends Animal{
    public static String name="狗";
    public void showname(){
        String name="哈士奇";
        System.out.println(name);
        System.out.println(this.name);
        System.out.println(super.name);
    }
}

//输出结果
哈士奇
狗
动物

方法重写

在继承体系中,子类出现了和父类中一摸一样的方法声明,我们就称子类这个方法是重写的方法

应用场景
当子类需要父类的功能,但父类的该功能不完全满足自己的需求时。
子类可以重写父类中的方法。
在这里插入图片描述

public class test {
    public static void main(String[] args) {
        newphone p=new newphone();
        p.call();
        p.message();

    }
}

/**
 * 旧手机
 */
class oldphone{
    public void call(){
        System.out.println("call");
    }
    public void message(){
        System.out.println("message");
    }

}

class newphone extends oldphone{
    @Override //添加override后,1.如果重写错误,编译会出错,比如将call写成call1会报错。  2.代码可读性高
    public void call(){
        super.call();
        System.out.println("facetime");
    }
    @Override
    public void message(){
        super.message();
        System.out.println("picture");
    }

}

在这里插入图片描述

子类继承父类后构造器的特点

子类中所有的构造器默认都会先访问父类中无参构造器,再执行自己。
原因:
子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。
子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化。
在这里插入图片描述

Demo

在这里插入图片描述

调用父类有参构造器
在这里插入图片描述

public class People {
    /**
     * 父类
     */
    private String name;
    private int age;
    public People(){

    }

    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

public class Student extends People {
    /**
     * 子类
     */
    public Student(){

    }
    public Student(String name,int age){


        super(name,age);
    }

}

public class test {
    public static void main(String[] args) {
        Student s=new Student("ds",33);
        System.out.println(s.getName());
        System.out.println(s.getAge());


    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值