方法
方法递归
执行方法时调用本方法
sum(5)=1+2+3+4+5
=5+4+3+2+1
5+sum(4)
4+sum(3)
3+sum(2)
2+sum(1)=1
StackOverflowError—栈溢出错误(递归次数过多)
package cn.tedu.method;
public class MethodDemo1 {
public static void main(String[] args) {
System.out.println(sum(1000000));
}
//定义递归求和的方法
public static int sum(int m){
//递归结束条件
if(m==1){
return 1;
}
return m+sum(m-1);//5+sum(4)
// 4+sum(3)
// 3+sum(2)
// 2+sum(1)
// sum(1)=1
}
}
面向对象
1、概念
面向对象的本质是一种编程范式(一种思考方式)
面向过程:关注的是代码实现的过程
面向对象:把代码实现的细节整合到对象中,找到对象就能拥有这个对象的功能
面向对象基于面向过程、面向对象由于面向过程?如果场景比较简单优先推荐
面向过程,如果场景很复杂优先推荐面向对象
2、对象和类之间的关系
对一类对象进行抽取。把共有的特征信息抽取成了属性,把共有的行为信息抽取成了
方法,把这一类对象抽取成了类。类是对对象的概况,对象是对类的具体实现。
3、构造方法
1.构建对象
2.与类同名,没有返回值类型
3,有参构造用于属性初始化,支持构造方法重载
3,当类中没有定义任何形式的构造方法JVM就会在底层默认天健无参构造,
如果类中已经定义构造方法那么底层局不会定义无参构造方法
4,类中至少含有一个构造方法
Java所有的非静态属性和方法都要由对象调用
4.this
a. 关键字、代表当前类的对象
b、可以代表当前类还没有产生的对象、代表当前类刚创建的对象
代表当前类正在使用的对象,this是一个灵活的指代(虚拟的指代)
可以采标当前类正在活动的对象
c、this语句—在同一个类中的构造方法里调用别的构造方法–首行
package cn.tedu.object;
public class ThisDemo {
public static void main(String[] args) {
//创建对象
Student s1=new Student();
//this可以代表当前类刚创建对象
System.out.println(“s1:”+s1);
//创建对象
Student s2=new Student(“tom”);
//this是一个灵活的指代
System.out.println(“s2:”+s2);
//this指代成当前类正在使用的对象
s1.study();
}
}
//代表学生的类
class Student{
//属性
String name;
int age;
char gender;
//无参构造
public Student(){
System.out.println("this:"+this);
}
//有参构造
public Student(int age){
this();
}
public Student(String name){
//调用别的构造方法
//Student();调用不到
//this语句---调用别的构造方法 要在首行
this(1);
this.name=name;
System.out.println("this:"+this);
}
//方法
public void study(){
//this可以代表当前类好没有创建对象
System.out.println(this.name+"在学习...");
//
System.out.println("this:"+this);
}
}
5、构造代码块
a、在方法外类内{}
b、属性初始化
c.优先于所有的构造方法先执行
package cn.tedu.object;
public class ObjectDemo2 {
public static void main(String[] args) {
//
Baby b=new Baby();
//
System.out.println(b.name+","+b.age);
}
}
//代表婴儿的类–创建对象就是真实的婴儿
//要求:不管怎么出生,婴儿的名字都叫莉莉,年龄是1岁
class Baby{
//属性
String name;
int age;
char gender;
//构造代码块
//优先于所有的构造方法先执行
//属性初始化
{
this.name="莉莉";
this.age=1;
}
//无参构造---婴儿没有名字没有年龄
public Baby(){
/*this.name="莉莉";
this.age=1;*/
}
//有参构造---婴儿出生时有名字
public Baby(String name){
//this.name=name;
/* this.name="莉莉";
this.age=1;*/
}
//婴儿出生时有名字也有年龄
public Baby(String name,int age){
/* this.name=name;
this.age=age;*/
/* this.name="莉莉";
this.age=1;*/
}
//方法
public void cry(){
System.out.println(name+"在嗷嗷的哭...");
}
}
6、局部代码块
a、在方法内{}
b、控制变量的生命周期,控制内从利用率
package cn.tedu.object;
public class ObjectDemo3 {
public static void main(String[] args) {
int x=1;
//局部(方法)代码块,控制变量的生命周期
{
int y=2;
System.out.println(x+y);
}
//1000行代码没有使用上面定义变量
}
}
7、成员变量与局部变量的区别
1.位置
成员变量;方法外类内
局部变量;方法内
2.使用范围
成员变量;整个类
局部变量:整个方法
3.内存存储位置
成员变量:堆
局部变量:栈
4.生命周期
成员变量:随着类创建对象出现,随着对象被回收而消失
局部变量:当方法被调用时才出现,随着方法执行结束而消失
面向对象的特征
封装、继承、多态(抽象)
1、封装
体现形式—方法,属性私有化并且提供公共的访问方式来进行正常取值和赋值,
提高代码数据安全性。
package cn.tedu.fengzhuang;
public class FZDemo {
public static void main(String[] args) {
//创建代表人的类的对象
Person p=new Person();
//给对象属性赋值
//p.name=“豆豆”;
//调用方法间接给私有化属性进行赋值
p.setAge(-10);
//p.gender=‘男’;
//调用方法间接给私有化属性进行取值
//System.out.println(p.name+","+p.getAge()+","+p.gender);
}
}
//代表人的类
class Person{
//属性
private String name;
//私有化属性,只能在本类中直接使用
private int age;
private char gender;
//Alt+Insert---Generate---Getter and Setter
//java自动提供
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 char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
/* //定义方法间接的给私有化属性进行赋值
public void setAge(int age){
if(age<0){
System.out.println(“数据有误!!!”);
}else {
this.age=age;
}
}
//定义方法间接的给私有化属性进行取值
public int getAge(){
return age;
}*/
/*//有参构造
public Person(int age){
if(age<0){
System.out.println("数据有误!!!");
}else {
this.age=age;
}
}*/
}