小白猿Day7(面向对象,构造方法)

本文详细介绍了Java中的构造函数,包括无参构造、含参构造和全参构造,强调构造函数在对象创建时的作用。同时,探讨了构造代码块和局部代码块的执行时机及作用。此外,讲解了`this`关键字在成员变量与局部变量冲突时的使用,以及`super`关键字在继承场景下如何调用父类构造函数和成员变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 构造函数:

格式:与本类类名同名,且没有返回值类型

作用:创建对象,创建一次,执行一次构造函数

分类:

1)无参构造:默认存在,如果添加了其他的构造,默认的构造函数会被覆盖

2)含参构造:对于参数没有任何要求,有参数就行

3)全餐构造:全参构造的参数必须于本类属性一致

全餐构造不仅可以创建对象,还可以给对象的所有属性赋值

public class TestConstructor {
    public static void main(String[] args) {
        //4.创建Person类的对象\
        /*1,每次new对象是,都会自动出发对应类中的构造方法*/
        /*2.每一个类中都默认存在一个没有参数的构造方法
        * 但是,如果你提供了其他的构造函数,默认的无参构造会被覆盖
        * 所以,我们要手动的提供无参构造,这样才能不传参数,也能创建对象*/
        Person p1=new Person();
        System.out.println(p1.name);
        System.out.println(p1.age);
        System.out.println(p1.address);
        p1.eat();
        /*4.每次创建对象,都会执行一个构造方法
        * 构造方法的作用:用来创建对象的 */
        Person P2= new Person(45);
        System.out.println(P2.name);
        Person P3=new Person("李逵",18,"柳树下");
        System.out.println(P3.name);
        System.out.println(P3.address);
        System.out.println(P3.age);;
    }
}
//1.创建Person类,描述人这一类事物
class Person{
//2.定义属性
    String name;//名字
    int age;//年龄
    String address;//地址
    /*3构造方法的格式:与本类类名同名,且没有返回值类型的方法*/
    //5.1创建无参构造
    public Person(){
        System.out.println("我是Person类的无参构造");
    }
  //  5.2创建本类的含参构造--含有参数的构造方法
    public Person(int n){
        System.out.println("我是Person类的含参构造"+n);
    }



    //5.3创建本类的全参构造--此构造函数的本参数与本类的属性一致
    //右键->Generate->Constructor->Shift全选所有属性->OK
    public Person(String name, int age, String address) {
        System.out.println("我是Person类的全参构造");
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public void eat(){
        System.out.println("端起了我的饭盆~");
    }
  //private Person(String name, int age, String address){
    //}
    


}

构造代码块: 

位置:类里方法外

执行时机:每次创建对象时的执行,并优先于构造方法的执行

作用:用于提取所有构造方法的共性功能

局部代码块:

位置:方法里

执行时机:调用本剧代码块所处的方法时执行

作用:用于控制变量的作用范围

执行顺序:构造代码块->构造方法->普通方法->局部代码块->分析

*1.当创建对象时,会触发结构函数

* 2.创建对象时,也会触发构造代码块,并且构造代码块优先于狗仔方法执行

* 3,我们厂家好对象后才能通过对象调用普通方法

* 4. 如果普通方法里面有局部代码快,才会触发对应的局部代码块 */

public class TestBlock {
    public static void main(String[] args) {

        pig  p=new pig("xiao",18);
        System.out.println(p.age);
        System.out.println(p.food);
        pig p2=new pig("佩奇");
        pig p3=new pig();
        p3.eat();
        p.eat();
        p2.eat();
    }
}
//1.创建一个小猪类用于测试
class pig{
    //2.定义属性
    String food;//食物
    int age;//年龄
    //7.创建本类的构造代码块
    {
/*构造代码快:{}
* 1.位置:类里的方法外
* 2.执行时机:每次创建对象时都会执行代码块,并且构造代码块有限于狗仔方法的执行
* 3.作用:用于提取所有的构造方法的共性功能 */
        System.out.println("野生黑猪");
        System.out.println("我是一个代码块");
    }

    //3.创建普通方法
    public void eat(){
        System.out.println("小猪爱吃菜叶子");
        //8.创建本类的局部代码块
        {
        /*局部代码块:{}
        * 1.位置:方法里
        * 2.执行时机:调用本局部代码块所处的方法是才会执行
        * 3.作用:用于控制变量的作用范围,变量的作用越小越好*/
            System.out.println("我是一个局部代码块");
            int i=100;
            System.out.println(i);//局部代码块中的局部变量i只能在代码块里使用
        }

}

    public pig(){

        System.out.println("我是Pig类的无参构造");
    }
    public pig(String  s){
        System.out.println("我是pig类的含餐构造"+s);
    }
    public pig(int n){
        System.out.println("我是pig类的含参构造"+n);
    }
    public pig(String food, int age) {
        System.out.println("今年"+age+"喜欢"+food);
        this.food = food;
        this.age = age;{

        }


    }
}

 This 的用法:

1、当成员变量于局部变量同名,用this方法

2、使用this 在构造方法的第一行调用构造方法的功能

this();--调用的是本类的无参构造

this(参数);--调用的是本类无参构造

(/*当成员变量于局部变量同名时,可以使用this指定本科的成员变量
* 如果不适用this指定,打印的就是进出的这个局部变量,就近原则*/)

super的用法:

1.当父类的成员变量与子类的变量t同名时,使用super指定父类的成员变量

 1)子类在创建对象时,默认会先调用父类的构造方法
* 2).原因时子类构造函数中的第一行默认存在super();-表示调用父类的无参构造*/

2.使用super 在子类构造方法的第一行调用父类构造方法的功能

super();--调用的是父类的无参构造

super(参数);--调用的是父类对参数的构造方法构造

eg:this

public class TestThis2 {
    public static void main(String[] args) {
        //3.1触发无参构造创建本类对象
       Dog d=new Dog();
         //3.1触发含参构造本类对象
       // Dog d1=new Dog("旺财");

}
}
//1.创建小狗类
class Dog{
    //2.1创建本类的无参构造
    public Dog(){
        /*在无参构造中,调用含参构造的功能
        * 注意:调用是单向的,不能来回双向调用,否则回死循环报错*/
        this("哈哈哈");
        System.out.println("我是无参构造");
    }
    //2.2创建一个本类含参构造string s
    public Dog(String s){
        /*在含参构造中,调用无参构造功能
        * 规定:this关键字,必须在构造函数的第一行*/

        System.out.println("我是含餐构造"+s);

    }
}

eg:super

package cn.tedu.oop2;
/*本类用于测试继承中构造方法的使用
* 1.子类在创建对象时,默认会先调用父类的构造方法
* 2.原因时子类构造函数中的第一行默认存在super();-表示调用父类的无参构造
* 3.当父类没有无参构造的时,可以通过super(参数) ,调用父类的其他含参构造
* 子类必须调用一个父类的构造函数,不管是无参还差含参,选一个即可
* 4.构造方法不可以被继承!因为语法的原因:要求构造方法的名字必须是本类类名
* 不能在子类中出现一个父类名字的构造方法*/
public class ExtendsDemo2 {
    public static void main(String[] args) {
          //Father2 f1=new Father2();
        //  Father2 f2=new Father2("哈哈哈2");
         // son2  s3=new son2();
          son2  s2=new son2();

    }
}
//1.创建父类
class Father2{
//    public Father2(){
//
//        System.out.println("我是父类的无参构造");
//    }
    public Father2(String s){
        System.out.println("我是父类的含参构造"+s);
    }
}
//2/创建子类
class son2 extends Father2{

    public son2(){
      super(" ");//默认存在调用父类的无参构造
        System.out.println("我是子类的无参构造");
    }
    public son2(String s1){
        this();
        System.out.println("我是子类的含参构造"+s1);
    }

}
public class TestExtends2 {
    public static void main(String[] args) {
        Father f=new Father();
        new son().study();
    }
}
//1.创建父类
class Father {
    //3.创建父类的成员变量
    int sum = 1;
    int count = 2;
}
//2.创建子类
class son extends Father {
    //4.创建一个普通的值
    int sum=10;
    //5.创建一个子类普通的方法
    public void study(){
        System.out.println("study().......");
        int sum=100;
        //6.1打印子类的局部变量sum
        System.out.println(sum);
        //6.1打印子类的成员变量sum
        System.out.println(this.sum);
        //6.1打印父类的成员变量count
        System.out.println(count);
        //6.1打印父类的成员变量sum
        System.out.println(super.sum);

    }

 继承

1、1概念

1.是从已有的类,衍生生成新的类,新的类能吸收已有的类数据属性和行为,并拓展新

的能力java

/*1.我们通过extends关键词建立子类与父类的继承关系  格式:子类 extends 父类
* 2.java只支持单继承,一个子类只能有一个父类,但是一个父类可以有多个子类*
//*3.继承相当于是子类将父类的功能复制一份,继承还具有传递行,
爷爷的功能会传给爸爸,爸爸的功能会传给孙子*/
/*4.子类可以拥有自己的独有的方法实现功能的拓展,青出于蓝而胜于蓝*//
* 5.子类继承了父类以后,可以使用父类的所有非私有资源
* 注意:这个私有资源由被Private修饰,所以没有访问权限*/
/*6.继承是is a的关系比如小猫是小动物,MiaoMiao是一只小猫*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值