Java学习lesson 07

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习lesson 07相关的知识,希望对你有一定的参考价值。

代码块

   * 使用{} 括起来的代码,称为代码块


   * 局部代码块

      限定了变量的生命周期,变量在局部代码块中定义的,那么出来局部代码块之后,就访问不       到了。在局部代码块中定义的变量,在出了代码块之后,内存就会释放掉。

     作用: 主要就是节约内存.


      局部代码块中定义的变量,虽然说作用域是局部的,但是如果存在外部嵌套的代码块,且在       局部代码块定义之前就定义了某个变量,

      那么在我们局部的代码块中就不可以定义相同名称的变量。

      但是如果在局部代码块执行之后,去定义一个和局部代码块中相同名称的变量,是可以的。       因为局部代码块中的变量已经失去了作用域范围。


   * 构造代码块

     * 类中方法外出现,每次调用构造方法的时候,都会优先先调用构造代码块。

     * 每创建一个对象,都会调用一次我们的构造代码块.


     * 作用:

       如果存在很多重载的构造方法,而且每个里面需要执行 相同的逻辑,那么就可以考虑将这        些代码提取到构造代码块中来执行。

       让代码结构更简练。增强了维护性.(使用的场景并不多见)



   * 静态代码块

     类中方法外出现,但是用static 来进行修饰。

     * 特点:随着类加载的时候执行。


     * 用处:

      适用于整个软件的生命周期中,只需要执行一次的业务逻辑代码。

      比如我们之后数据库的操作.

   * 同步代码块(多线程涉及)

继承

* 子类继承父类,继承父类的成员变量和成员方法。但是他们各自拥有的各自的成员变量,所以他们的  值,并不会继承。

* 对于父类中的私有成员变量和私有方法,子类是无法继承的。


   * 继承优点:

          提高了代码的复用性

          提高了代码的维护性


   * 继承缺点:

        类的耦合性增强了。

   * 开发的原则:

         高内聚,低耦合.

         * 耦合: 类和类之间的关系

         * 内聚: 自己独立完成某件事情的能力.


* 只支持单继承,但是可以支持多层继承

 继承是相互叠加的,子类继承的时候,会递归似的寻找父类中是否还存在继承,会继承整个层级直到  最根部类的属性和方法。


* 对于构造方法是无法继承的。

  但是有办法可以调用父类的构造方法。


   * 继承关系中访问成员变量:

      * 不同名的成员变量

        子类可以直接访问和使用父类继承的非私有的成员变量


      * 同名的成员变量

        * 优先原则: 如果子类中定义了和父类中相同名字的成员变量,会优先访问子类的该变量

                如果想要依然访问到父类中的同名变量,我们需要加上super关键字来获                 取.


      this: 当前对象的引用;可以访问到子类中的变量,也可以访问到父类中的变量

      super: 父类对象的引用;访问父类中的变量


   * 继承关系中访问成员方法:

      * 不同名的方法

        子类可以直接调用到父类的方法


      * 同名的方法

        当父类和子类出现同名方法的时候(同名方法: 指的返回值类型(父子类关系是可以的),         方法名称以及方法接收的形参列表要一模一样);会有优先原则的处理,就是会调用子类         的该方法。

public class ExtDemo {
	public static void main(String[] args){
		Father father=new Father();
		Son son=new Son();
		father.name="小头爸爸";
                father.setSex("男");
		father.age=29;
		father.speak();
		son.name="大头儿子";
                //son.setSex("男");
		son.age=7;
		son.speak();
	}

}
class Father{
	String name;
	private String sex;
	int age;
	void setSex(String sex){
		this.sex=sex;     
	}
	String getSex(){
	    return sex;
	}    
	void speak(){
		System.out.println(name+":"+sex+"  "+age+"岁");
	}
}

class Son extends Father{
	String name;//name是与父类同名的成员变量;age与父类不同名的成员变量;
                    //sex是private修饰的不可以直接继承
	void speak(){
		System.out.println(name+":" +age+"岁");

	}
}


son.setSex("男");(错误)

技术分享


技术分享



方法的重写

   * 存在于继承关系中,子类中定义的方法和父类中的方法完全一样的时候(返回值类型父子类关系      是可以的),我们在通过子类对象来访问该方法的时候,就会调用到子类的方法。


   * 方法重写注意事项:

     子类不能重写父类的私有方法.

     子类重写父类方法的时候,提供的访问权限不能更低.

     子类覆盖父类方法,如果父类是静态方法的话,子类也必须是静态方法才可以成功覆盖,也      就是重写。


   * 方法重载:

     同一个类中,如果我们有多个相同方法名的方法,但是他们的形参列表是不同的,那么这种方      式我们就称为方法的重载。在调用的时候,jvm能够通过不同的形参来区分到我们到底调用的      是哪个方法。


   * 关于方法重写和方法重载的返回值约束:

     方法重载: 仅返回值不同是不能重载的。必须参数列表不同。

     方法重写: 返回值类型(父子类关系是可以的) 要求返回值类型也要相同的.

练习:

正方形,长方形

public class SquareDemo {
	public static void main(String[] args){
		Square square=new Square();
		square.a=3;
		square.write();
		Rectangle rectangle=new Rectangle();
		rectangle.a=3;
		rectangle.h=5;
		rectangle.write();
	}
}
class Square{
	 int a;
	 int c;
     int s;
	int getC(){
		c=(4*a);
		return c;
	}
	int getS(){
		s=(a*a);
		return s;
	}
	void write(){
	    getC();
	    getS();
		System.out.println("正方形的周长是:"+c);
		System.out.println("正方形的面积是:"+s);
	}
}
class Rectangle extends Square{
	int h;
	//方法重写
	int getC(){
		c=(2*(a+h));
		return c;
	}
	int getS(){
		s=(a*h);
		return s;
	}
	void write(){
	    getC();
	    getS();
		System.out.println("长方形的周长是:"+c);
		System.out.println("长方形的面积是:"+s);
	}
}


技术分享

   * 继承中构造方法的调用

   * 创建子类对象的时候,一定会优先去创建父类的对象。 因为要创建父类对象,所以就需要去调      用到父类的构造方法.

   * 对于我们所有的类的构造方法的第一行,第一行在我们没有自己添加this(...)或者            super(...)的情况下都会去帮我们默认的添加

   *  super()

      如果父类中不存在默认的构造,子类依然要创建对象,那么子类就需要显示的指明调用的是       哪一个父类对象,才能保证父类对象创建的成功。



      一定要保证父类对象的创建成功.

      构造方法的第一行,如果我们添加了自己调用的this(...),或者super(...), 系统就不会为       我们默认的添加super().

      我们的this(...)或者super(...) 必须放到第一行。二者只能有其一。


final关键字


a.final修饰类

final如果修饰一个类,该类不能被继承.


b.final修饰类的成员变量

该成员变量的值不可修改。

问题: 那么什么时候初始化这个值?


在对象创建之前都可以.

a.构造代码块中可以进行初始化

b.构造方法中可以进行初始化

c.定义成员变量的时候,可以直接进行初始化.


注意一点: 这三种方式同时只能用一种。


在大多数的场景下,我们的final成员变量都会配合public static 一起使用.


//常量类, 变量命名都要大写,而且单词之间要用_分割开.

class A{

   public static final double PI = 3.14;

   public static final double RATE = 2.86;

}


A.PI

A.RATE


以上是关于Java学习lesson 07的主要内容,如果未能解决你的问题,请参考以下文章

java学习lesson 03

Java学习lesson 06

Java学习lesson 10

java学习lesson 01

Java学习lesson 02

Java学习lesson 11