(java)面向对象 ---- final、static、匿名对象、内部类、权限修饰符、代码块

(1)关键字final

     1)final 修饰类  :最终类   不能被继承    但是使用方式没有变化,可以创建对象,调用方法。

     2)final修饰方法    :父类中被final修饰的方法,在子类中不能被重写,但可以继承使用

     3)final修饰局部变量   : 

                                final  int  i = 11;// 被final修饰,一次赋值,终身不变

                                final修饰引用变量,变量保存内存地址,终身不变

    4)final修饰成员变量   : 

/*
 *final修饰成员变量 固定的不是内存的默认值,固定的是手动赋值
 *

 * 成员变量的两种赋值方式:
 * (1)定义的时候直接赋值   
 * (2)采用构造方法赋值  (成员变量需要在创建对象前赋值,构造方法是创建对象中的事情)
 * 
 * 被 final 修饰的成员变量,只能被赋值一次
 */
public class Person {
// 1.直接赋值
	final int i= 10; 
// 2.构造方法赋值
//	final int age; 
//	public Person(int age){
//		this.age = age;
//	}
}

(2)关键字static

/*
 *   定义Person类
 *   定义对象的特有数据,和对象的共享数据
 *   
 *   对象的特有数据(非静态数据)    调用者只能是  new 对象
 *   对象的共享数据(静态数据)  调用者可以是new 对象,也可以是类名
 */
public class Person {
	
	String name;
	static int i = 100;
	
}

public class Test {

	public static void main(String[] args) {
		
		Person p1 = new Person();
		Person p2 = new Person();
		
		p1.name = "luo";
		p2.name = "zhang";
		p1.i = p1.i - 20;
		
		System.out.println(p1.name);     // luo
		System.out.println(p1.i);        // 80
		System.out.println(Person.i);    // 静态变量直接使用    类名.  调用 
		
		System.out.println(p2.name);	 // zhang
		System.out.println(p2.i);        // 80

	}

}

【static的内存图】

static注意事项:

  成员变量属于对象的,静态变量属于自己的类的

1)静态不能调用非静态(因为生命周期,静态优先于非静态存储于内存中)

2)静态不能写this 、super

3)静态常量声明:public  static  final  String/int......变量名(大写)

4)static 修饰成员变量,成员方法

5)静态属于类,不属于对象(对象的多态性)

 

【匿名对象】

public static void main(String[] args) {
		
		// 有名字的对象,引用类型变量,可以反复使用
		Fu fu = new Fu();
		fu.fun1();
		
		// 1.匿名对象,没有引用类型变量,只能使用一次
		new Fu().fun1();
		
		// 2.匿名对象可以当做参数
		method(new Fu());
		
		// 3.Fu类型可以当做返回值类型
		Fu p = method();
		p.fun1();
	}
	// 方法返回值类型是Fu类型
	// 方法return 的是这个类型的对象
	public static Fu method(){
		return new Fu();
//		Fu p = new Fu();
//		return p;
	}
	
	public static void method(Fu fu){
		fu.fun1();
	}

【内部类的调用】

/*
 *  将内部类定义在了外部类的    【成员位置】
 *  外部类Outer  内部类Iner
 *  
 *  成员内类,可以使用成员修饰符 public static...
 *  也是个类 ,可以继承,实现接口
 */
public class Outer {
	int i = 1;
	private int a = 1;
	
	/*
	 *  定义内部类
	 *  调用规则:
	 *    内部类  可以使用  外部类  成员,包括私有
	 *    外部类  使用  内部类成员,必须建立内部类对象
	 */
	 class Iner{
		 int i = 2;
		 public void inner(){
			 int i = 3;
			 /* 
			  * 成员 内部类 的同名变量调用 
			  *  System.out.println("内部类"+ Outer.this.i); //打印的是   :内部类1  访问的是Outer类的成员变量
			  *  System.out.println("内部类"+ this.i);       //打印的是   :内部类2   访问的是Iner类的成员变量
			  */
			 System.out.println("内部类"+ i);               //打印的是   :内部类3
		 }	
	}
}

/*
 * 成员内部类测试
 */
public class Test {

	public static void main(String[] args) {
		/*
		 *  调用外部类中 内部类的 inner方法
		 *  格式:
		 *  外部类名.内部类名  变量 = new 外部类对象(). new 内部类对象();
		 *  变量.内部方法();
		 */
		Outer.Iner oi = new Outer().new Iner();
		oi.inner();
	}
}

【局部 内部类】

public class Outer {
	
	public  void  out(){
		// 局部 内部类
		class Iner{
			public void iner(){
				System.out.println("局部内部类 方法");
			}
		}
	    
		Iner in = new Iner();
		in.iner();
	}

}

public class Test {

	public static void main(String[] args) {
		// 调用局部内部类的方法
		new Outer().out(); // 打印结果:局部内部类 方法  
		
	}

}

【匿名内部类】

匿名内部类,简化问题:定义实现类,重写方法,建立实现对象,合为一步完成。

public interface Smoking {
	public abstract  void smoking();

}
/*
 *   接口 实现类
 *   public  class  XXX implements Smoking{
 *   	// 重写抽象方法
 *   	public void  smoking(){ 
 *      }
 *   }
 * 
 *  // 创建XXX对象
 *   XXX  s = new XXX();
 *   s.smoking();
 *  // 多态
 *   Smoking s1 = new XXX();
 *   s1.smoking();
 */

public class Test {
	/*
	 *  匿名内部类
	 *    定义实现类,重写方法,建立实现对象,合为一步完成。
	 *  格式:
	 *    new 接口或父类(){
	 *    	重写抽象方法
	 *    };
	 *   从new 到分号结束   这部分代码相当于  创建了实现接口类的对象
	 */
	public static void main(String[] args) {
		
		new Smoking(){
			public void smoking(){
				System.out.println("人在吸烟");
			}
		}.smoking();

        //		Smoking s = new Smoking(){
//			public void smoking(){
//				System.out.println("人在吸烟");
//			}
//		};
//		s.smoking();
    }
}

【权限修饰符】

 

注意:protected权限第三种使用方法:有A、B两个类分别在不同的包(package),B继承A,A中protected的方法,只能在B里面使用(B类对象不能调用)。

权限修饰符:公共访问public、受保护访问protected、默认访问default、私有访问private

静态修饰符static、最终修饰符final、抽象修饰符abstract

权限修饰符一般放于所有修饰符之前     abstract与private、static、final不能同时使用

【修饰类能够使用的修饰符】

修饰类只能使用public、protected、final、abstract    其中public使用最多

*   1.修饰类的修饰符
	 *    public class Demo1{} // 最常用的方式
	 *    class Demo2{}

	 *    public final class Demo3{}
	 *    public abstract class Demo4{}

【修饰成员变量能使用的修饰符】

public、protected、default、private、final、static     其中private使用最多

*   2.修饰成员变量
	 *   public int count1 = 100;
	 *   protected int count2 = 100;
	 *   int count3 = 100;
	 *   private int count4 = 100;   // 最常用的方式
	 *   
	 *   public final int count5 = 100;
	 *   public static int count6 = 100;

【修饰构造方法能够使用的修饰符】

public、protected、default、private   其中public使用最多

 3.修饰构造方法的修饰符
	 *   public Demo(){}// 最常用的方式
	 *   protect Demo(){}
	 *   Demo(){}
	 *   private Demo(){}

【修饰成员方法使用的修饰符】

public、protected、default、private、final、static、abstract     其中public使用最多

 *   4.修饰成员方法的修饰符
	 *   public void method1(){}  // 最常用的方式
	 *   protect void method2(){}
	 *   void method3(){}
	 *   private void method4(){}
	 *   
	 *   public final void method5(){}
	 *   public static void method6(){}     // 最常用的方式
	 *   public abstract void method7(){}    // 最常用的方式

总结

常用来修饰类、方法、变量的修饰符如下:

  1. public 权限修饰符,公共访问, 类,方法,成员变量
  2. protected 权限修饰符,受保护访问, 方法,成员变量
  3. 默认什么也不写 也是一种权限修饰符,默认访问, 类,方法,成员变量
  4. private 权限修饰符,私有访问, 方法,成员变量
  5. static 静态修饰符  方法,成员变量
  6. final 最终修饰符   类,方法,成员变量,局部变量
  7. abstract 抽象修饰符  类 ,方法

 


【代码块】

静态代码块,只执行一次

构造代码块,new一次,就执行一次,优先于构造方法

构造方法,new一次,就执行一次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 7-6 jmu-java-03面向对象基础-02-构造方法与初始化块是一门Java编程课程,主要讲解面向对象编程中的构造方法和初始化块的概念、使用方法和注意事项。通过学习这门课程,可以更好地理解Java中的面向对象编程思想,掌握构造方法和初始化块的使用技巧,提高Java编程能力。 ### 回答2: 面向对象编程中,我们经常需要创建多个对象,每个对象都有各自独有的属性和方法。在创建对象的过程中,我们需要对对象进行初始化,即设置对象的属性和调用对象的方法。在Java编程语言中,构造方法和初始化块是两种非常重要的初始化对象的方式。 构造方法是一种特殊的方法,可以在创建对象时调用,用于初始化对象的属性和执行一些必要的操作。构造方法和类名必须相同,并且没有返回值。在构造方法中,我们可以设置对象属性的默认值,传入参数初始化对象属性的值,或执行一些其他的操作。如果没有定义构造方法,Java会自动添加一个无参构造方法。 初始化块是在类加载时执行的一段代码块,可以用于初始化静态属性或实例属性。初始化块可以有多个,按照定义的顺序执行,并且可以包含任意合法的Java语句。静态初始化块只会在类加载时执行一次,而实例初始化块则在对象创建时每次都会执行一次。 构造方法和初始化块都是在对象创建时进行初始化的过程,但是两者还是存在一些区别。首先,构造方法只能用于初始化实例属性,而初始化块既可以初始化静态属性也可以初始化实例属性。其次,构造方法可以接受参数,根据传入的参数初始化实例属性的值,而初始化块不能接受参数。 在实际编程中,我们需要根据实际需求选择合适的初始化方式。如果只需要初始化实例属性,可以使用构造方法来进行初始化;如果还需要初始化静态属性,可以使用静态初始化块;如果需要在创建对象时执行一些复杂的操作,可以使用初始化块。通过灵活使用构造方法和初始化块,我们可以更好地进行对象初始化,提高程序的性能和可维护性。 ### 回答3: 在Java类中,构造方法和初始化块都是用来初始化对象的。它们可以执行变量初始化、方法调用和其他操作。本篇文章将主要介绍构造方法和初始化块的区别和作用。 构造方法 构造方法是一种特殊的方法,其作用是创建对象时初始化对象的状态。每个类都至少拥有一个构造方法,并且构造方法的名称必须与类名相同。构造方法没有返回类型,并且不能被声明为finalstatic或abstract。在Java中,构造方法有以下特点: 1. 构造方法没有返回类型 2. 构造方法的名称必须与类名完全相同 3. 构造方法可以重载,即同一个类中可以定义多个不同的构造方法,只需要使用不同的参数列表即可 4. 如果没有定义构造方法,则Java编译器会为类自动添加一个默认的构造方法 构造方法的作用主要有两个: 1. 初始化实例变量:构造方法可以在对象创建时给实例变量赋初值,为了方便,在Java中,经常将对象属性的初始化操作放到构造方法里实现。 2. 对象创建时执行的操作:构造方法可以执行一些对象创建时必要的操作,比如打开文件、建立网络连接等操作。 初始化块 初始化块是一个没有任何修饰符的代码块,它可以出现在类中的任何地方。初始化块在对象创建时执行,它可以用来对静态属性或实例属性进行初始化。初始化块的主要作用是为类实例的属性提供默认值。 在Java中,初始化块有以下特点: 1. 初始化块没有任何修饰符。 2. 初始化块不像方法一样需要被调用,它会在类被加载时自动执行。 3. 初始化块可以定义多个,且执行顺序按照定义的顺序执行。 4. 初始化块和构造方法的区别是:构造方法是为了初始化对象时的属性值,而初始化块是为了初始化对象创建时必要的操作。 总结 构造方法和初始化块都是用来初始化对象,在Java中,构造方法主要用来在对象创建时初始化实例变量或执行一些必要的操作,初始化块主要用来为类实例的属性提供默认值。它们的主要区别在于: 1. 构造方法是构造对象的,初始化块是初始化对象的。 2. 构造方法是有参数的,而初始化块是没有参数的。 3. 构造方法必须显式地被调用,而初始化块则是在类被加载时自动地执行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值