第6章 面向对象编程(下)

static关键字

static关键字的使用

1.static:静态的
2.static可以用来修饰:属性、方法、代码块、内部类
3.使用static修饰属性:静态变量(或类变量)
   3.1 属性,按是否使用static修饰,又分为:静态属性  vs 非静态属性(实例变量)                                        
      实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。                                                   
      静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。
   3.2 static修饰属性的其他说明:
         ① 静态变量随着类的加载而加载。可以通过"类.静态变量"的方式进行调用
         ② 静态变量的加载要早于对象的创建。
         ③ 由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中。
         ④          类变量      实例变量
         类          yes            no                                                               
         对象       yes          yes                                                              
   3.3 静态属性举例:System.out;、Math.PI; 

类变量与实例变量内存解析图:


4.使用static修饰方法:静态方法
        ① 随着类的加载而加载,可以通过"类.静态方法"的方式进行调用
        ②            静态方法    非静态方法
         类            yes             no
         对象        yes             yes
        ③ 静态方法中,只能调用静态的方法或属性。非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性
5. static注意点:
   5.1 在静态的方法内,不能使用this关键字、super关键字
   5.2 关于静态属性和静态方法的使用,大家都从生命周期的角度去理解。(静态属性和方法早于实例属性和方法的加载)
6. 开发中,如何确定一个属性是否要声明为static的?
        > 属性是可以被多个对象所共享的,不会随着对象的不同而不同的。考虑声明为static
        > 类中的常量也常常声明为static
   开发中,如何确定一个方法是否要声明为static的?
     > 操作静态属性的方法,通常设置为static的
     > 工具类中的方法,习惯上声明为static的。 比如:Math、Arrays、Collections

static应用之单例设计模式

单例设计模式:
1. 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例。
2. 如何实现?
     饿汉式  vs 懒汉式

饿汉式实现:

/*
 * 单例模式的饿汉式实现
 * 
 */
public class SingletonTest1 {
	public static void main(String[] args) {
//		不可通过new创建对象
//		Bank bank1 = new Bank();
//		Bank bank2 = new Bank();
		Bank bank1 = Bank.getInstance();
		Bank bank2 = Bank.getInstance();
		System.out.println(bank1 == bank2);//true
	}
}

//饿汉式
class Bank{
	//1.私有化类的构造器
	private Bank(){
	}
	//2.内部创建类的对象
	//4.要求此对象也必须声明为静态的
	private static Bank instance = new Bank();
	//3.提供公共的静态的方法,返回类的对象
	public static Bank getInstance(){
		return instance;
	}
}

懒汉式实现:

/*
 * 单例模式的懒汉式实现
 * 
 */
public class SingletonTest2 {
	public static void main(String[] args) {
		Order order1 = Order.getInstance();
		Order order2 = Order.getInstance();
		System.out.println(order1 == order2);// true

	}
}

class Order {
	// 1.私有化类的构造器
	private Order() {
	}
	// 2.声明当前类对象,没有初始化
	// 4.此对象也必须声明为static的
	private static Order instance = null;
	// 3.声明public、static的返回当前类对象的方法
	public static Order getInstance() {
//		调用方法时再创建对象
		if (instance == null) {
			instance = new Order();
		}
		return instance;
	}
}


3. 区分饿汉式 和 懒汉式:创建对象的时机
  饿汉式:声明时就创建。
      坏处:对象加载时间过长。
      好处:饿汉式是线程安全的 
  懒汉式:声明时为null,调用方法的时候再创建。
      好处:延迟对象的创建。
      目前的写法坏处:线程不安全。--->到多线程内容时,再修改。

关于main方法的理解

main()方法的使用说明:                            
1. main()方法作为程序的入口                        
2. main()方法也是一个普通的静态方法                    
3. main()方法可以作为我们与控制台交互的方式。(之前通过使用Scanner)

类的成员之四:代码块

类的成员之四:代码块(或初始化块)
1. 代码块的作用:用来初始化类、对象                                                             
2. 代码块如果有修饰的话,只能使用static. 
3. 分类:静态代码块  vs 非静态代码块
4. 静态代码块
       >内部可以有输出语句
       >随着的加载而执行,而且只执行一次
       >作用:初始化类的信息
       >如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行
       >静态代码块的执行要优先于非静态代码块的执行
       >静态代码块内只能调用静态的属性、静态的方法,不能调用非静态的结构
5. 非静态代码块
        >内部可以有输出语句
        >随着对象的创建而执行
        >创建一个对象,执行一次非静态代码块
        >作用:可以在创建对象时,对对象的属性等进行初始化
        >如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行
        >非静态代码块内可以调用静态的属性、静态的方法,或非静态的属性、非静态的方法

关于代码的执行顺序

理解代码的执行顺序

//理解代码的执行顺序
//总结:由父及子,静态先行
class Root{
	static{
		System.out.println("Root的静态初始化块");
	}
	{
		System.out.println("Root的普通初始化块");
	}
	public Root(){
		super();
		System.out.println("Root的无参数的构造器");
	}
}
class Mid extends Root{
	static{
		System.out.println("Mid的静态初始化块");
	}
	{
		System.out.println("Mid的普通初始化块");
	}
	public Mid(){
		super();
		System.out.println("Mid的无参数的构造器");
	}
	public Mid(String msg){
		//通过this调用同一类中重载的构造器
		this();
		System.out.println("Mid的带参数构造器,其参数值:"
			+ msg);
	}
}
class Leaf extends Mid{
	static{
		System.out.println("Leaf的静态初始化块");
	}
	{
		System.out.println("Leaf的普通初始化块");
	}	
	public Leaf(){
		//通过super调用父类中有一个字符串参数的构造器
		super("尚硅谷");
		System.out.println("Leaf的构造器");
	}
}
public class LeafTest{
	public static void main(String[] args){
		new Leaf(); 
		System.out.println();
		new Leaf();
	}
}

结果显示:由父及子,静态先行

对属性可以赋值的位置:
①默认初始化
②显式初始化/⑤在代码块中赋值(按代码顺序)
③构造器中初始化
④有了对象以后,可以通过"对象.属性"或"对象.方法"的方式,进行赋值

final关键字

final:最终的                                                                           
1. final可以用来修饰的结构:类、方法、变量
2. final 用来修饰一个类:此类不能被其他类所继承。比如:String类、System类、StringBuffer类
3. final 用来修饰方法:表明此方法不可以被重写。比如:Object类中getClass();
4. final 用来修饰变量:此时的"变量"就称为是一个常量
        4.1 final修饰属性:可以赋值的位置有:显式初始化、代码块中初始化、构造器中初始化(每个构造器中都需要编写赋值代码)
        4.2 final修饰局部变量:(包括形参和方法体类声明的变量)
          尤其是使用final修饰形参时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参。一旦赋值以后,就只能在方法体内使用此形参,但不能进行重新赋值。                                               
static final可以用来修饰属性和方法。用来修饰属性:全局常量。

抽象类与抽象方法

 abstract关键字的使用
 1.abstract:抽象的
 2.abstract可以用来修饰的结构:类、方法
 3.abstract修饰类:抽象类
      > 此类不能实例化
      > 抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)
      > 开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作
 4.abstract修饰方法:抽象方法
      > 抽象方法只有方法的声明,没有方法体
      > 包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法的。
      > 若子类重写了父类中的所有的抽象方法后,此子类方可实例化。若子类没有重写父类中的所有的抽象方法,则此子类任然是一个抽象类,需要使用abstract修饰。

abstract使用上的注意点:
1.abstract不能用来修饰:属性、构造器等结构
2.abstract不能用来修饰私有方法、静态方法、final的方法、final的类。

抽象类的匿名子类

/*
 * 抽象类的匿名子类
 * 
 */
public class PersonTest {
	public static void main(String[] args) {
		
		method(new Student());//匿名对象
		
		Worker worker = new Worker();
		method1(worker);//非匿名的类非匿名的对象
		
		method1(new Worker());//非匿名的类匿名的对象
		
		System.out.println("********************");
		//创建了一匿名子类的对象:p 多态将地址赋给父类对象
		Person p = new Person(){
			@Override
			public void eat() {
				System.out.println("吃东西");
			}
			@Override
			public void breath() {
				System.out.println("好好呼吸");
			}
		};
		method1(p);
		
		System.out.println("********************");
		//创建匿名子类的匿名对象
		method1(new Person(){
			@Override
			public void eat() {
				System.out.println("吃好吃东西");
			}

			@Override
			public void breath() {
				System.out.println("好好呼吸新鲜空气");
			}
		});
		//创建匿名子类的匿名对象end
	}
	
//	静态方法
	public static void method1(Person p){
		p.eat();
		p.breath();
	}
//	静态方法
	public static void method(Student s){
	}
}

//继承抽象类
class Worker extends Person{

	@Override
	public void eat() {
	}
	@Override
	public void breath() {
	}
}

abstract class Person{
	public Person(){
	}
	//抽象方法
	public abstract void eat();

}

多态的应用:模板方法设计模式

 

 

/*
 * 抽象类的应用:模板方法的设计模式
 * 
 */
public class TemplateTest {
	public static void main(String[] args) {
//		测试
		SubTemplate t = new SubTemplate();
		t.spendTime();
	}
}

abstract class Template{
	
	//计算某段代码执行所需要花费的时间
	public void spendTime(){
//		①
		long start = System.currentTimeMillis();
//		②
		this.code();//不确定的部分、易变的部分
//		③
		long end = System.currentTimeMillis();
		
		System.out.println("花费的时间为:" + (end - start));
		
	}
	
//	不确定的部分 向外暴露抽象方法 使子类具体实现
	public abstract void code();
	
	
}

class SubTemplate extends Template{
	@Override
	public void code() {
//		1000以内的质数
		for(int i = 2;i <= 1000;i++){
			boolean isFlag = true;
			for(int j = 2;j <= Math.sqrt(i);j++){
				
				if(i % j == 0){
					isFlag = false;
					break;
				}
			}
			if(isFlag){
				System.out.println(i);
			}
		}
//		1000以内的质数end

	}
//	code()end
}

接口

接口的使用
1.接口使用interface来定义
2.Java中,接口和类是并列的两个结构
3.如何定义接口:定义接口中的成员
        3.1 JDK7及以前:只能定义全局常量和抽象方法
            >全局常量:public static final的.书写时,可以省略
            >抽象方法:public abstract的,也可以省略
        3.2 JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法(略)
4. 接口中不能定义构造器的!意味着接口不可以实例化
5. Java开发中,接口通过让类去实现(implements)的方式来使用.
   如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化
   如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类
6. Java类可以实现多个接口 (弥补了Java单继承性的局限性)
  格式:class AA extends BB implements CC,DD,EE(如有继承先写继承后写实现)
7. 接口与接口之间可以继承,而且可以多继承
8. 接口的具体使用,体现多态性
9. 接口,实际上可以看做是一种规范
面试题
:抽象类与接口有哪些异同?

创建接口匿名实现类的对象

与抽象类类似

1.创建接口的非匿名实现类的非匿名对象

2. 创建接口的非匿名实现类的匿名对象

3. 创建接口的匿名实现类的非匿名对象

4. 创建接口的匿名实现类的匿名对象

/*
 * 接口的使用
 * 1.接口使用上也满足多态性
 * 2.接口,实际上就是定义了一种规范
 * 3.开发中,体会面向接口编程!
 */
public class USBTest {
	public static void main(String[] args) {
		
		Computer com = new Computer();
		//1.创建了接口的非匿名实现类的非匿名对象
		Flash flash = new Flash();
		com.transferData(flash);
		
		//2. 创建了接口的非匿名实现类的匿名对象
		com.transferData(new Printer());
		
		//3. 创建了接口的匿名实现类的非匿名对象
		USB phone = new USB(){
			@Override
			public void start() {
				System.out.println("手机开始工作");
			}
			@Override
			public void stop() {
				System.out.println("手机结束工作");
			}
		};
		com.transferData(phone);
		
		//4. 创建了接口的匿名实现类的匿名对象
		com.transferData(new USB(){
			@Override
			public void start() {
				System.out.println("mp3开始工作");
			}
			@Override
			public void stop() {
				System.out.println("mp3结束工作");
			}
		});
	}
}

class Computer{
	public void transferData(USB usb){//USB usb = new Flash();
		usb.start();
		System.out.println("具体传输数据的细节");
		usb.stop();
	}
}

interface USB{
	//常量:定义了长、宽、最大最小的传输速度等
	void start();
	void stop();
}

class Flash implements USB{
	@Override
	public void start() {
		System.out.println("U盘开启工作");
	}
	@Override
	public void stop() {
		System.out.println("U盘结束工作");
	}
}

class Printer implements USB{
	@Override
	public void start() {
		System.out.println("打印机开启工作");
	}
	@Override
	public void stop() {
		System.out.println("打印机结束工作");
	}
	
}

接口的应用:代理模式

/*
 * 接口的应用:代理模式
 * 
 */
public class NetWorkTest {
	public static void main(String[] args) {
		Server server = new Server();//创建被代理类
		
		ProxyServer proxyServer = new ProxyServer(server);//将被代理类传入代理类中
		proxyServer.browse();//代理类完成被代理类的工作
		
	}
}

//接口:定义了被代理类需要代理类完成的工作
interface NetWork{
	public void browse();
}

//被代理类
class Server implements NetWork{
	@Override
	public void browse() {
		System.out.println("真实的服务器访问网络");
	}
}

//代理类
class ProxyServer implements NetWork{
//	属性:被代理类
	private NetWork work;
//	构造方法:用于接收被代理类
	public ProxyServer(NetWork work){
		this.work = work;
	}
//	代理类的其他工作
	public void check(){
		System.out.println("联网之前的检查工作");
	}
	
	@Override
	public void browse() {
		check();
		work.browse();//实现完成被代理类的任务
	}
	
}

接口的应用:工厂模式

(目前简单了解)

工厂模式:实现了创建者与调用者的分离即 将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的 。

工厂模式的分类:
简单工厂模式: 用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有代码)
工厂方法模式: 用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂模式: 用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

核心本质:实例化对象,用工厂方法代替new 操作。将选择实现类、创建对象统一管理和控制。从而将调用者跟实现类解耦。

无工厂模式举例:

interface Car {
	void run();
}

class Audi implements Car {
	public void run() {
		System.out.println("奥迪在跑");
	}
}

class BYD implements Car {
	public void run() {
		System.out.println("比亚迪在跑");
	}
}

public class Client01 {
	public static void main(String[] args) {
		Car a = new Audi();
		Car b = new BYD();
		a.run();
		b.run();
	}
}

简单工厂模式举例:

interface Car {
	void run();
}

class Audi implements Car {
	public void run() {
		System.out.println("奥迪在跑");
	}
}

class BYD implements Car {
	public void run() {
		System.out.println("比亚迪在跑");
	}
}

//工厂类
class CarFactory {
//方式一
	public static Car getCar(String type) {
		if ("奥迪".equals(type)) {
			return new Audi();
		} else if ("比亚迪".equals(type)) {
			return new BYD();
		} else {
			return null;
		}
	}

//方式二
//	public static Car getAudi() {
//		return new Audi();
//	}
//
//	public static Car getByd() {
//		return new BYD();
//	}
}

public class Client01 {
	public static void main(String[] args) {
		Car a = CarFactory.getCar("奥迪");
		a.run();
		Car b = CarFactory.getCar("比亚迪");
		b.run();
	}
}

工厂方法模式举例:

interface Car {
	void run();
}

class Audi implements Car {
	public void run() {
		System.out.println("奥迪在跑");
	}
}

class BYD implements Car {
	public void run() {
		System.out.println("比亚迪在跑");
	}
}

//工厂接口
interface Factory {
	Car getCar();
}

//两个工厂类
class AudiFactory implements Factory {
	public Audi getCar() {
		return new Audi();
	}
}
class BydFactory implements Factory {
	public BYD getCar() {
		return new BYD();
	}
}

public class Client01 {
	public static void main(String[] args) {
		Car a = new AudiFactory().getCar();
		Car b = new BydFactory().getCar();
	}
}

接口两道笔试题

interface A {
//	全局常量
	int x = 0;
}
class B {
	int x = 1;
}

class C extends B implements A {
	public void pX() {
		// 编译不通过。因为x是不明确的
		// System.out.println(x);
		System.out.println(super.x);// 1
		System.out.println(A.x);// 0

	}

	public static void main(String[] args) {
		new C().pX();
	}
}

Java8中接口的新特性

JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法

知识点1:接口中定义的静态方法,只能通过接口来调用。
知识点2:通过实现类的对象,可以调用接口中的默认方法。如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写以后的方法。
知识点3:如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法。-->类优先原则
知识点4:如果实现类实现了多个接口(没有继承),而这多个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下,报错。-->接口冲突。这就需要我们必须在实现类中重写此方法
知识点5:如何在子类(或实现类)的方法中调用父类、接口中被重写的方法

    public void myMethod(){
        method3();//调用自己定义的重写的方法
        super.method3();//调用的是父类中声明的
        //调用接口中的默认方法
        CompareA.super.method3();
        CompareB.super.method3();
    }

/*
 * JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法
 */
public interface CompareA {
	
	//静态方法
	public static void method1(){
		System.out.println("CompareA:北京");
	}
	//默认方法
	public default void method2(){
		System.out.println("CompareA:上海");
	}
	
	default void method3(){
		System.out.println("CompareA:上海");
	}
}
public interface CompareB {
	
	default void method3(){
		System.out.println("CompareB:上海");
	}
	
}
public class SuperClass {
	
	public void method3(){
		System.out.println("SuperClass:北京");
	}
	
}
public class SubClassTest {
//	main测试方法
	public static void main(String[] args) {
		SubClass s = new SubClass();
		
//		s.method1();
//		SubClass.method1();
		//知识点1:接口中定义的静态方法,只能通过接口来调用。
		CompareA.method1();
		//知识点2:通过实现类的对象,可以调用接口中的默认方法。
		//如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写以后的方法
		s.method2();
		//知识点3:如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,
		//那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法。-->类优先原则
		//知识点4:如果实现类实现了多个接口(没有继承),而这多个接口中定义了同名同参数的默认方法,
		//那么在实现类没有重写此方法的情况下,报错。-->接口冲突。
		//这就需要我们必须在实现类中重写此方法
		s.method3();
		
	}
	
}

//继承和多实现
class SubClass extends SuperClass implements CompareA,CompareB{
	
	public void method2(){
		System.out.println("SubClass:上海");
	}
	
	public void method3(){
		System.out.println("SubClass:深圳");
	}
	
	//知识点5:如何在子类(或实现类)的方法中调用父类、接口中被重写的方法
	public void myMethod(){
		method3();//调用自己定义的重写的方法
		super.method3();//调用的是父类中声明的
		//调用接口中的默认方法
		CompareA.super.method3();
		CompareB.super.method3();
	}
}

类的内部成员之五:内部类

类的内部成员之五:内部类
1. Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类
2.内部类的分类:成员内部类(静态、非静态)  vs 局部内部类(方法内、代码块内、构造器内) 
3.成员内部类:
        一方面,作为外部类的成员:
            >可以调用外部类的结构(外部类名称.this.外部类结构)
            >可以被static修饰
            >可以被4种不同的权限修饰
        另一方面,作为一个类:
            > 可以在类中定义属性、方法、构造器等
            > 可以被final修饰,表示此类不能被继承。言外之意,不使用final,就可以被继承
            > 可以被abstract修饰
4.关注如下的3个问题
  4.1 如何实例化成员内部类的对象
  4.2 如何在成员内部类中区分调用外部类的结构
  4.3 开发中局部内部类的使用  见下面第二个代码段。

//内部类测试类
public class InnerClassTest {
	public static void main(String[] args) {
		
//		==4.1 如何实例化成员内部类的对象
		
		//创建Dog实例(静态的成员内部类): 
		Person.Dog dog = new Person.Dog();
		dog.show();
		
		//创建Bird实例(非静态的成员内部类):
//		Person.Bird bird = new Person.Bird();//错误的,非静态的成员只能通过对象来使用
		Person p = new Person();//获取外部类的实例
		Person.Bird bird = p.new Bird();//通过外部类的实例来new内部类的对象
		bird.sing();
		
		System.out.println();
		
		bird.display("黄鹂");//三个同名的name
		
	}
}

class Person{
//	=====类中普通成员
	String name = "小明";
	int age;
	public void eat(){
		System.out.println("人:吃饭");
	}
	
//	=====成员内部类
	//静态成员内部类
	static class Dog{
		String name;
		int age;
		public void show(){
			System.out.println("卡拉是条狗");
//			eat();
		}
		
	}
	//非静态成员内部类
	class Bird{
		String name = "杜鹃";
		public Bird(){}
		
//		4.2 如何在成员内部类中区分调用外部类的结构
		public void sing(){
			System.out.println("我是一只小小鸟");
			Person.this.eat();//调用外部类的非静态属性
			eat();//不同名的外部结构可以直接调用
			System.out.println(age);//不同名的外部结构可以直接调用
		}
//		区分调用三个同名的name
		public void display(String name){
			System.out.println(name);//方法的形参
			System.out.println(this.name);//内部类的属性
			System.out.println(Person.this.name);//外部类的属性
		}
//		4.2 如何在成员内部类中区分调用外部类的结构end
	}
	
//	=====局部内部类
	public void method(){
		//在方法内的局部内部类
		class AA{}
	}
	
	{
		//在代码块中的局部内部类
		class BB{}
	}
	
	public Person(){
		//在构造方法中的局部内部类
		class CC{}
	}
	
}

 局部内部类的使用:

/**
 * 
 * @Description 局部内部类的使用
 *
 */
public class InnerClassTest1 {

	public void method() {
		//方法内的局部内部类,开发中很少见
		class AA {}
	}

	// 返回一个实现了Comparable接口的类的对象
	public Comparable getComparable() {

		// 创建一个实现了Comparable接口的类:局部内部类
		// 方式一:非匿名类形式 返回非匿名类的匿名对象
//		class MyComparable implements Comparable{
//
//			@Override
//			public int compareTo(Object o) {
//				return 0;
//			}
//			
//		}
//		
//		return new MyComparable();

		// 方式二:匿名类形式  返回匿名类的匿名对象
		return new Comparable() {
			@Override
			public int compareTo(Object o) {
				return 0;
			}
		};
		//end 方式二:匿名类形式  返回匿名类的匿名对象

	}//getComparable方法结束

}

 局部内部类使用的一个注意点

public class InnerClassTest {
	
	/*
	 * 在局部内部类的方法中(比如:show)如果调用局部内部类所声明的方法(比如:method)中的局部变量(比如:num)的话,要求此局部变量声明为final的。
	 * 
	 * jdk 7及之前版本:要求此局部变量显式的声明为final的
	 * jdk 8及之后的版本:可以省略final的声明
	 * 
	 */
	public void method(){
		//局部变量
		int num = 10;//jdk 7及之前版本:要求此局部变量显式的声明为final的.jdk 8及之后的版本:可以省略final的声明
		
		class AA{
			public void show(){
//				num = 20;//不可重新赋值
				System.out.println(num);
			}
		}
		
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 第1《认识java语言》是介绍Java语言的起源、发展以及特点等基本知识。Java是一种跨平台的高级编程语言,被广泛应用于开发Web和移动应用程序等领域。它具有面向对象、可移植、健壮性好等特点。 第2Java语言基础》是介绍Java语言的基本语法、数据类型、运算符、控制流程等内容。学习这些基础知识对于理解和编写Java程序至关重要。 第3《面向对象程序设计之一》是介绍面向对象编程的原理和基本概念。学习面向对象的思想和方法可以提高程序的可扩展性和重用性。本内容包括类与对象、封装、继承、多态等知识点。 第4《面向对象程序设计之二》是进一步探讨面向对象编程的高级特性。学习抽象类、接口、内部类等内容可以让我们写出更加灵活和健壮的Java程序。 第5Java基础类库》是介绍Java标准库的常用类和接口。掌握这些类的使用方法可以大大简化程序开发,如字符串处理、集合框架、IO操作等。 第6《图形用户界面程序》是介绍使用Java编写图形用户界面(GUI)程序的方法。学习Swing和JavaFX等技术可以实现丰富、直观的用户界面。 第7《输入输出流》是介绍Java的输入输出操作。学习文件读写、网络通信等知识可以实现数据的持久化和交互。 第8《多线程并发编程》是介绍Java多线程编程的原理和方法。学习多线程操作可以充分利用多核处理器的优势,提高程序的并发性和响应性。 第9《网络编程》是介绍使用Java进行网络通信的方法。学习Socket编程、HTTP协议等内容可以开发出基于网络的应用程序。 第10《数据库编程》是介绍使用Java连接和操作数据库的方法。学习JDBC等技术可以实现与数据库的交互,进行数据持久化和查询。 通过学习这些节的内容,可以全面掌握Java语言的基础知识和常用技术,为进一步深入学习和应用Java打下良好的基础。 ### 回答2: 第1:认识Java语言 第1介绍了Java语言的基本概念和特点。Java是一种跨平台的编程语言,被广泛应用于Web开发、移动应用开发等领域。Java具有简单易学的特点,使用了面向对象的编程思想,具有良好的可扩展性和可维护性。 第2Java语言基础 第2主要介绍了Java语言的基本语法和常用的数据类型。包括变量、常量、运算符、流程控制语句等。同时还介绍了Java的数组、字符串和输入输出等相关知识。 第3:面向对象程序设计之一 第3介绍了面向对象程序设计的基本概念和常用的面向对象的特性。包括类、对象、继承、封装和多态等。同时还介绍了如何定义和使用类,以及如何实现各种面向对象的特性。 第4:面向对象程序设计之二 第4进一步深入介绍了面向对象程序设计的相关知识。包括接口、抽象类、继承和多态的高级应用,以及异常处理和内部类等。这些知识对于构建复杂的面向对象程序非常重要。 第5Java基础类库 第5介绍了Java基础类库常用的类和方法。包括字符串、日期、时间、集合、文件和输入输出等类库的使用。这些类库为我们提供了丰富的功能,在Java编程非常实用。 第6:图形用户界面程序 第6介绍了Java图形用户界面编程的相关知识。包括Swing和AWT等GUI库的使用,以及事件处理和布局管理器等。通过学习这些知识,我们可以编写出漂亮、交互性强的图形界面程序。 第7:输入输出流 第7介绍了Java输入输出流的使用。包括字节流和字符流的概念、File类的使用以及文件读写和网络通信等。这些知识对于实现数据的读写和传输非常重要。 第8:多线程并发编程 第8介绍了Java多线程并发编程的相关知识。包括线程、线程同步和线程通信的概念,以及锁和条件的使用。同时还介绍了线程池的概念和使用,以及如何处理并发编程的常见问题。 第9:网络编程 第9介绍了Java网络编程的基本知识。包括Socket编程、TCP和UDP协议,以及HTTP协议的使用。通过学习这些知识,我们可以编写出具有网络功能的Java应用程序。 第10:数据库编程 第10介绍了Java数据库编程的相关知识。包括连接数据库、执行SQL语句、事务处理和数据查询等。通过学习这些知识,我们可以使用Java操作各种类型的数据库。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值