Java方法及构造方法
*************************构造函数(构造方法、构造器)Constructor************
一.why 为什么用
Student s1 = new Student();
s1.sno = 1;//破坏程序的封装性
s1.name = "aaa";
s1.age = 20;
//推荐
s1.setSno(1);
s1.setName("aaa");
s1.setAge(20);
假设对象有10个属性,为了创建这个对象并且为该对象的10个属性赋值,需要调用10次
setters()方法,显然是比较麻烦!有没有一种方式,可以一句话就能创建对象 同时为
该对象的所有属性赋值?
有的.使用构造函数
二.what
构造函数 是一个特殊的函数...
作用: 是用来给对象的属性进行初始化的...
构造函数也叫做构造方法、构造器... 英文叫做Constructor...
三.how
public class Student{
public Student(){
}
}
特点:
1. 与类同名
2. 没有返回值(连void也不要写)
演示代码:
package com.chapter6.演示构造函数;
public class Student {
private int sno;
private String name;
private int age;
public Student(int sno,String name){
System.out.println("使用两个参数的构造函数创建对象int sno,String name");
this.sno = sno;
this.name = name;
}
//构造函数
//特点:
//1.与类同名
//2.没有返回值(连void也不需要写)
public Student(int sno,String name,int age){
System.out.println("使用三个参数的构造函数来创建对象 int sno,String name,int age");
this.sno = sno;
this.name = name;
this.age = age;
}
public void study(){
System.out.println("我在学习");
}
public static void main(String[] args) {
//Student s1 = new Student(1,"aaa",20);
Student s1 = new Student(1,"bbb");
}
}
*************************构造函数不写返回值的实质**********************
其实构造函数是有返回值的,返回值是刚刚创建出来的对象的引用...
public Student Student(int sno,String name){
System.out.println("使用两个参数的构造函数创建对象int sno,String name");
this.sno = sno;
this.name = name;
return new Student(1,"aaa",20);
}
或者
public void Student(int sno,String name){
System.out.println("使用两个参数的构造函数创建对象int sno,String name");
this.sno = sno;
this.name = name;
}
以上两种都不是构造函数,它是一个普通的方法,只不过碰巧和构造函数同名罢了...
构造函数不写返回值,是java设计人员的一个规定, 编译器也是根据这个规定来找到哪个方法是构造函数的.....
而不是说构造函数真的没有返回值
*************************默认的构造函数**********************
Student s1 = new Student(1,"aaa",20);//底层调用了构造函数 来创建对象
Student s1 = new Student();//之前我们没有学构造函数的时候 也可以创建对象
为什么呢? 原因是虽然我们没有写构造函数,编译器会自动帮我们提供一个不带参数的
构造函数,这个不带参数的构造函数,叫做默认的构造函数,也叫做缺省的构造函数
一.what 什么是默认的构造函数
不带参数的构造函数, 也叫做缺省的构造函数、无参的构造函数...
public class Student{
//默认的构造函数
public Student(){
//super();
}
}
注意: 一旦程序员写上一个带参数的构造函数,编译器就不会帮你提供那个默认的构造函数了
程序员要养成习惯,一旦写了带参数的构造函数,自己要主动把不带参数的默认的构造函数也加上.
*************************对象的初始化块************************************
一.why
问题:既然初始化块和构造函数功能是完全一样的,这样既然有了构造函数,为什么还需要初始化块??
初始化块是多余的吗???
不是!
当多个构造函数中,如果出现相同的代码,可以把这些相同的代码提取出来,抽取到对象初始化块中...
由于对象初始化块 是优先于构造函数执行的,这样就解决了代码冗余问题....
二.what
作用: 和构造函数一样, 是用来给对象的属性进行初始化...
public class Student{
//1.属性
//4.对象初始化块
{
}
//3.构造函数
//2.方法
}
演示代码:
package com.chapter6.对象的初始化块;
public class Student {
private int sno;
private String name;
private int age;
private int grade;//年级
//对象初始化块
{
System.out.println("对象初始化块执行");
this.grade = 1;
}
public Student(){
System.out.println("默认的构造函数执行");
}
public Student(int sno,String name){
System.out.println("两个参数的构造函数执行int sno,String name");
this.sno = sno;
this.name = name;
}
public Student(int sno,String name,int age){
System.out.println("三个参数的构造函数执行int sno,String name,int age");
this.age = age;
this.sno = sno;
this.name = name;
}
public static void main(String[] args) {
Student s1 = new Student(1,"aaa",20);
}
}
*******************************对象初始化过程(或 使用new创建对象 底层到底做了什么)******************
Student s1 = new Student(1,"aaa",20);//对象初始化
一.给对象的实例变量分配空间、默认初始化
二.声明时初始化、对象初始化块初始化(按照写代码的顺序 从上到下执行)
三.构造函数初始化
执行完以上三步以后,对象被创建完毕,返回刚刚创建的对象的地址
实例变量是隶属于对象的,每个对象有自己的一份实例变量
*******************************this指针********************************
this 指向的是自己 翻译成中文 "我"
一.构造函数中
指向的是 正在初始化的对象
二.用在方法中
指向的是 正在调用该方法的对象
s1.study();//在study()中的this 指向的是s1
三.使用this可以来调用其他的构造函数
public Student(int sno,String name,int age){
this(sno,name);//调用其他的构造函数 int String 这句话必须要写到当前构造函数的第一句 否则编译报错
System.out.println("使用三个参数的构造函数int sno,String name,int age");
this.age = age;
}
*******************************重载(Overload)********************************
一.what 什么是重载
方法的名称相同,参数列表不同的方法之间叫做重载....
参数列表不同体现在三个方面:
1. 个数不同
2. 类型不同
3. 顺序不同
编译器决定到底调用哪个方法,首先是通过方法名判断,如果introduce有多个重载的方法,编译器通过参数的类型、个数、顺序
来判断到底调用哪一个,如果碰到两个相同类型的方法(例如参数都是int类型,编译器就糊涂了,有句话叫 不要让计算机糊涂 让计算机糊涂就是你错了)
面试题: 方法的名称相同,参数列表也完全相同,只有返回值不同的方法之间 叫不叫重载???
不叫重载. 编译报错 . 重复的方法 Duplicate Method 编译器认为它是一个重复的方法..所以不叫重载...
重载: 也叫做静态联编、静态绑定、前期绑定..
联编(binding绑定): 给定一个方法名, 通过该方法名 决定 到底执行 哪一块代码的过程,叫做联编...
静态联编: 在 编译的 时候 决定到底执行哪一块代码...
演示代码:
package com.chapter6.演示重载;
/**
* 作者: zhangzy 公司: 蓝桥软件学院 时间: 2017年7月3日 上午11:15:30 功能: 演示重载
* 方法的名称相同,参数列表不同的方法之间叫做重载.... 参数列表不同体现在三个方面:1. 个数不同 2. 类型不同 3. 顺序不同.
*/
public class Student {
private int sno;
private String name;
private int age;
/*public int introduce(int sno) {
System.out.println("我是学生,我的学号是:" + sno);
return 1;
}
public long introduce(int age){
System.out.println("我是学生,我的年龄是:" + age);
return 1;
}*/
public void introduce(String name) {
System.out.println("我是学生,我的名字是:" + name);
}
public void introduce(int sno, String name) {
System.out.println("我是学生,我的学号是:" + sno + ",姓名是:" + name);
}
public void introduce(String name, int sno) {
System.out.println("我是学生,我的姓名是:" + name + ",学号是:" + sno);
}
public static void main(String[] args) {
Student s1 = new Student();
s1.introduce(1);
}
}
********************************构造函数也是可以重载的*****************************
**************************static 静态的************************************
一.修饰方法
1. 静态方法
类名.方法名();
二.修饰成员变量
1. 静态变量(类变量)
如何访问静态变量 :
类名.属性名
隶属于类的,类的所有对象 共享一份 静态变量....
需求: 统计使用Student类总共创建了多少个对象
演示代码:
package com.chapter6.演示static;
/**
* 作者: zhangzy
* 公司: 蓝桥软件学院
* 时间: 2017年7月3日 下午2:11:12
* 功能: 演示static
* 需求: 统计使用Student类创建了多少个对象
*/
public class Student {
private int sno;
private String name;
private int age;
private static int sum;
//静态初始化块
//作用: 给类的静态属性初始化的
static{
System.out.println("静态初始化块执行");
sum = 10;
}
public Student(){
sum++;
}
public Student(int sno,String name,int age){
sum++;
this.sno = sno;
this.name = name;
this.age = age;
}
public static void study(){
System.out.println("我在学习");
}
public static void main(String[] args) {
Student s1 = new Student(1,"aaa",20);//1.类初始化 2.对象初始化
Student s2 = new Student(2,"bbb",25);//只执行对象初始化
s1.sum = 50;
System.out.println(s1.sum);//50
System.out.println(s2.sum);//50
System.out.println(Student.sum);//推荐
//System.out.println("一共创建了" + Student.sum + "个对象");
}
}
*****************************类的初始化过程****************************
对象初始化时机: new 对象的时候
类的初始化时机: 第一次使用类的时候
1.使用该类来创建对象的时候
Student s1 = new Student();
2.调用类的静态方法
Student.study();
3.访问类的静态属性
Student.sum
类初始化过程
1. 类加载
把类的二进制文件(.class)读到方法区
2.给类静态变量分配空间、默认初始化
3.声明时初始化、静态初始化块初始化(从上到下的顺序)
静态初始化块
作用: 给类的属性(静态变量)赋值
static {
}
**************************实例变量和静态变量的区别*****************************
一.实例变量
隶属于对象的,每个对象都有自己的一份实例变量,实例变量是分配在堆里的
二.静态变量
隶属于类的,类的所有对象 共享一份 静态变量,静态变量是在静态区的...
三.局部变量
在栈里
***************************************************************
类初始化 优先于 对象初始化
转载于:https://www.cnblogs.com/MrTanJunCai/p/9906774.html
Java方法及构造方法相关推荐
- Java方法与构造方法练习
方法与构造方法练习 [练习题]1.构造方法与重载 定义一个牛肉面的类(Noodle),它的属性有, 牛肉面宽度 width 尺寸:size (大碗还是小碗) 大碗8元,小碗6元 是否加肉:beef : ...
- JAVA中的方法和构造方法有什么区别
JAVA中的方法和构造方法有什么区别 1.方法有返回类型,方法名小写,不能和类名相同:构造方法没有返回类型,void也不行,名与类名相同. 2.构造方法是初始化对象的重要途径,所以就算你给一个类没有定 ...
- 【反射机制】Java中的反射机制,使用反射机制创建对象、访问属性、方法、构造方法等
这篇文章主要是整理了Java中的反射机制,包括:反射机制概念.反射机制访问构造方法.反射机制访问普通方法.反射机制访问属性,反射机制访问修饰符. 目录 一.反射机制概念 二.反射机制使用 (1)加载C ...
- java重载方法与构造方法 区别
java构造方法与重载方法 1.什么是构造方法和重载方法呢? 通俗来讲构造方法就是与类名相同的方法,而重载方法则是一个类中有多个相同方法名的方法 构造方法特点: 1.不需要void关键字修饰2.不需要 ...
- java this关键字表示当前对象,可以访问属性、方法、构造方法
this关键字的三种访问方式:属性.方法.构造方法 1.访问属性 为了命名的规范,利用this关键字区分了属性与局部变量 public class Persion {String name;char ...
- 【Android FFMPEG 开发】C++ 回调 Java 方法 模板 ( JavaVM *vm | JNIEnv *env | jobject instance | 引用类型 | 模板代码示例 )
文章目录 I . Native 调用 Java 方法 II . JNIEnv *env 与 jobject instance III . JavaVM *vm IV . 局部引用 与 全局引用 分析 ...
- 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )
文章目录 I . 调用 Java 方法流程 II . 获取 jclass 对象 ( GetObjectClass ) III . 获取 jclass 对象 ( FindClass ) IV . JNI ...
- java中的构造方法,this、super的用法
1.构造方法 定义:与类同名没有返回值的方法称为构造方法: public class test1 { private String name; private int age; public test ...
- java方法带参数返回值_Java方法中的参数太多,第6部分:方法返回
java方法带参数返回值 在当前的系列文章中,我正在致力于减少调用Java方法和构造函数所需的参数数量,到目前为止,我一直专注于直接影响参数本身的方法( 自定义类型 , 参数对象 , 构建器模式 , ...
最新文章
- 【Angular4】英雄指南demo
- SSC:基于点云语义上下文的大规模激光SLAM的位置识别方法
- OpenStack部署
- VBA学习笔记(9)--生成点拨(1)
- 释疑のABAP输入框字符自动变成大写问题
- AMBA、AHB、APB、AXI总线
- 微型计算机电源的选购应注意哪些问题,购买小功率ups电源的注意事项
- 微信小程序--家庭记账本开发--01
- 解决opensips NAT 问题和ACK不能正常转发问题
- CentOS下编译安装Gcc-4.9
- 多个 Linux 发行版考虑移除 Chromium 软件包
- HTML的a标签href设为零操作的原因和方式
- 敏捷开发的相关学习文档路径
- 旧的起点(开园说明)
- HIVE存储(五)HIVE文件的性能测试
- 【算法】路径规划中的Dijkstra(狄克斯特拉)与A星算法
- linux如何查看内存?
- 未来人类笔记本 T5 67SH2 扩展内存条
- AM3352 bootloader引导程序开发
- IT行业主要职业有什么?
热门文章
- linux7编译mysql5.7安装,CentOS 7.4 使用源码包编译安装MySQL 5.7.20
- 在设计四人抢答器中灯全亮_数字电子技术课程设计报告(四人抢答器).doc
- centos桌面系统怎么退回终端系统_【社群话题分享】Linux 各大发行版你怎么选?...
- ntp协议中 服务器失效怎么办,排除网络时间协议(NTP)故障
- python 列表操作详解,Python列表解析操作实例总结
- Flask cookie API(response.set_cookie,request.cookies)
- http.server模块
- layui 读取本地excel内容_Python操作Excel基础(1)
- 信息安全完全参考手册之本书框架(目录)
- Linux学习总结(74)——wget 命令详解