学习笔记:Java基础语法(下)

一、认识面向对象

(1)面向对象
	面向对象是基于面向过程的编程思想
	
(2)面向对象的思想特点
	A:是一种更符合我们思考习惯的思想
	B:把复杂的事情简单化
	C:让我们从执行者变成了指挥者
	
(3)类与对象
	A:现实世界的事物
		属性	事物的基本描述
		行为	事物的功能
	B:Java语言中最基本的单位是类。所以,我们要用类来体现事物
	C:类
		成员变量	事物属性
		成员方法	事物行为
	D:类:是一组相关的属性和行为的集合。是一个抽象的概念。
	  对象:是该类事物的具体存在,是一个具体的实例。(对象)
	  
	  举例:
		学生:类
		班长:对象
		
(4)类的定义及使用
	A:类的定义
		成员变量	定义格式和以前一样,就是位置不同,在类中,方法外。
		成员方法	定义格式和以前一样,就是去掉了static。
		
	B:使用类的内容
		a:创建对象? 格式
			类名 对象名 =  new 类名();
		b:如何使用成员变量和成员方法呢
			对象名.成员变量
			对象名.成员方法()

(5)Java程序的开发,设计和特征
	A:开发:就是不断的创建对象,通过对象调用功能
	B:设计:就是管理和维护对象间的关系
	C:特征
		a:封装
		b:继承
		c:多态

二、成员变量和局部变量的区别

(1)在类中的位置不同
	成员变量:类中方法外
	局部变量:方法定义中或者方法声明上
	
(2)在内存中的位置不同
	成员变量:在堆中
	局部变量:在栈中
	
(3)生命周期不同
	成员变量:随着对象的创建而存在,随着对象的消失而消失
	局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
	
(4)初始化值不同
	成员变量:有默认值
	局部变量:没有默认值,必须定义,赋值,然后才能使用

三、类作为形式参数

(1)如果你看到一个方法需要的参数是一个类名,就应该知道这里实际需要的是该类类型的一个具体的对象。

四、匿名对象

(1)没有名字的对象

(2)应用场景
	A:调用方法,仅仅只调用一次的时候。
	b:可以作为实际参数传递。

五、private关键字

(1)私有的意义,可以修饰成员变量和成员方法

(2)特点:
	被private修饰的后的成员只能在本类中被访问
	
(3)private的应用:
	以后再写一个类的时候:
		把所有的成员变量给private了
		提供对应的getXxx()/setXxx()方法

六、this、super关键字

(1)this:代表当前类的引用对象
   记住:哪个对象调用方法,该方法内部的this就代表那个对象
   
   super:super代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员)
	
	
(2)怎么用呢?
	A:调用成员变量
		this.成员变量 调用本类的成员变量
		super.成员变量 调用父类的成员变量
	B:调用构造方法
		this(...)	调用本类的构造方法
		super(...)	调用父类的构造方法
	C:调用成员方法
		this.成员方法 调用本类的成员方法
		super.成员方法 调用父类的成员方法

七、static关键字

(1)静态的意思。可以修饰成员变量和成员方法。

(2)静态的特点:
	A:随着类的加载而加载
	B:优先于对象存在
	C:被类的所有对象共享
		这其实也是我们判断该不该使用静态的依据。
	D:可以通过类名调用
		既可以通过对象名调用,也可以通过类名调用,建议通过类名调用。
		
(3)静态的内存图
	静态的内容在方法区的静态区
	
(4)静态的注意事项;
	A:在静态方法中没有this对象
	    如何理解呢?
		静态是随着类的加载而加载,this是随着对象的创建而存在。
		静态比对象先存在。
	B:静态只能访问静态
	
(5)静态变量和成员变量的区别
	A:所属不同
		静态变量:属于类,类变量
		成员变量:属于对象,对象变量,实例变量
	B:内存位置不同
		静态变量:方法区的静态区
		成员变量:堆内存
	C:生命周期不同
		静态变量:静态变量是随着类的加载而加载,随着类的消失而消失
		成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失
	D:调用不同
		静态变量:可以通过对象名调用,也可以通过类名调用
		成员变量:只能通过对象名调用
		
(6)main方法是静态的
	public:权限最大
	static:不用创建对象调用
	void:返回值给jvm没有意义
	main:就是一个常见的名称。
	String[] args:可以接收数据,提供程序的灵活性

八、final关键字

(1)是最终的意思,可以修饰类,方法,变量。
(2)特点:
	A:它修饰的类,不能被继承。
	B:它修饰的方法,不能被重写。
	C:它修饰的变量,是一个常量。
(3)面试相关:
	A:局部变量
		a:基本类型 值不能发生改变
		b:引用类型 地址值不能发生改变,但是对象的内容是可以改变的
	B:初始化时机
		a:只能初始化一次。
		b:常见的给值
			定义的时候。(推荐)
			构造方法中。

九、构造方法

(1)作用:用于对对象的数据进行初始化

(2)格式:
	A:方法名和类名相同
	B:没有返回值类型,连void都不能有
	C:没有返回值
	
	思考题:构造方法中可不可以有return语句呢?
    		可以。而是我们写成这个样子就OK了:return;
    		其实,在任何的void类型的方法的最后你都可以写上:return;
	
(3)构造方法的注意事项
	A:如果我们没写构造方法,系统将提供一个默认的无参构造方法
	B:如果我们给出了构造方法,系统将不再提供默认构造方法
		如果这个时候,我们要使用无参构造方法,就必须自己给出。
		推荐:永远手动自己给出无参构造方法。
		
(4)给成员变量赋值的方式
	A:setXxx()
	B:带参构造方法
	
(5)标准案例
	class Student {
		private String name;
		private int age;
		
		public Student(){}
		
		public Student(String name,int age) {
			this.name = name;
			this.age = age;
		}
		
		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;
		}
	}
	
	测试:
	class StudentDemo {
		public static void main(String[] args) {
			//方式1
			Student s1 = new Student();
			s1.setName("林青霞");
			s1.setAge(27);
			System.out.println(s1.getName()+"---"+s1.getAge());
			
			//方式2
			Student s2 = new Student("刘意",30);
			System.out.println(s2.getName()+"---"+s2.getAge());
		}
	}
	
	思考:
	上面代码中的:Student s = new Student();做了哪些事情?
	
	(1)把Student.class文件加载到内存
	
	(2)在栈内存为s开辟空间
	
	(3)在堆内存为学生对象申请空间
	
	(4)给学生的成员变量进行默认初始化。null,0
	
	(5)给学生的成员变量进行显示初始化。林青霞,27
	
	(6)通过构造方法给成员变量进行初始化。刘意,30
	
	(7)对象构造完毕,把地址赋值给s变量

十、代码块

(1)用{}括起来的代码。

(2)分类:
	A:局部代码块 : 局部位置
		用于限定变量的生命周期,及早释放,提高内存利用率。
		
	B:构造代码块 : 在类中的成员位置
		把多个构造方法中相同的代码可以放到这里,每个构造方法执行前,首先执行构造代码块。每次调用构造方法都执行
		
	C:静态代码块 : 在类中的成员位置,用static修饰
		对类的数据进行初始化,仅仅只执行一次。
		
(3)静态代码块,构造代码块,构造方法的顺序问题?
	静态代码块 > 构造代码块 > 构造方法

十一、main方法的格式讲解

public static void main(String[] args) {...}
	
public:公共的,访问权限是最大的。由于main方法是被jvm调用,所以权限要够大。

static:静态的,不需要创建对象,通过类名就可以。方便jvm的调用。

void:因为我们曾经说过,方法的返回值是返回给调用者,而main方法是被jvm调用。
     你返回内容给jvm没有意义。

main:是一个常见的方法入口。我见过的语言都是以main作为入口。

String[] args:这是一个字符串数组。值去哪里了?
    		这个东西到底有什么用啊?怎么给值啊?
    		这个东西早期是为了接收键盘录入的数据的。
		
		使用格式是:
			java 类名 字符串 字符串……
		例如:
		    类名是 MainDemo
		    
		    class MainDemo {
            	public static void main(String[] args) {
            		//接收数据后
            		System.out.println(args.length); 
            		//System.out.println(args[0]); 
            		for(int x=0; x<args.length; x++) {
            			System.out.println(args[x]);
            		}
            	}
            }
		    
		    命令行编译:
		    javac MainDemo.java
		    java MainDemo Hello World
		    
		    输出结果:
		    2
		    Hello
		    World

十一、面向对象三大特征之封装

(1)封装:隐藏实现细节,提供公共的访问方式

(2)好处:
	A:隐藏实现细节,提供公共的访问方式
	B:提高代码的复用性
	C:提高代码的安全性
	
(3)设计原则
	把不想让外界知道的实现细节给隐藏起来,提供公共的访问方式
	
(4)private是封装的一种体现。
	封装:类,方法,private修饰成员变量

十二、面向对象三大特征之继承

(1)把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系,
   这多个类就具备了这些内容。这个关系叫继承。
   
(2)Java中如何表示继承呢?格式是什么呢?
	A:用关键字extends表示
	B:格式:
		class 子类名 extends 父类名 {}
		
(3)继承的好处:
	A:提高了代码的复用性
	B:提高了代码的维护性
	C:让类与类产生了一个关系,是多态的前提
	
(4)继承的弊端:
	A:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。
		原则:低耦合,高内聚。
		耦合:类与类的关系
		内聚:自己完成某件事情的能力
	B:打破了封装性
	
(5)Java中继承的特点
	A:Java中类只支持单继承
	B:Java中可以多层(重)继承(继承体系)
	
(6)继承的注意事项:
	A:子类不能继承父类的私有成员
	B:子类不能继承父类的构造方法,但是可以通过super去访问
	C:不要为了部分功能而去继承
	
(7)什么时候使用继承呢?
	A:继承体现的是:is a的关系。
	B:采用假设法
	
(8)Java继承中的成员关系
	A:成员变量
		a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单
		b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢?
			子类的方法访问变量的查找顺序:
				在子类方法的局部范围找,有就使用。
				在子类的成员范围找,有就使用。
				在父类的成员范围找,有就使用。
				找不到,就报错。
				
	B:构造方法
		a:子类的构造方法默认会去访问父类的无参构造方法
			是为了子类访问父类数据的初始化
			注意:子类每一个构造方法的第一条语句默认都是:super();
			
		b:父类中如果没有无参构造方法,怎么办?
			子类通过super去明确调用带参构造
			子类通过this调用本身的其他构造,但是一定会有一个去访问了父类的构造
			让父类提供无参构造
			
	C:成员方法
		a:子类的成员方法和父类中的成员方法名称不一样,这个太简单
		b:子类的成员方法和父类中的成员方法名称一样,这个怎么访问呢?
			通过子类对象访问一个方法的查找顺序:
				在子类中找,有就使用
				在父类中找,有就使用
				找不到,就报错
				
(9)两个面试题:
	A:Override和Overload的区别?Overload是否可以改变返回值类型?
	B:this和super的区别和各自的作用?
	
(10)数据初始化的面试题
	A:一个类的初始化过程
	B:子父类的构造执行过程
	C:分层初始化
	
(11)案例:
	A:学生和老师案例
		继承前
		继承后
	B:猫狗案例的分析和实现

十三、面向对象三大特征之多态

(1)同一个对象在不同时刻体现出来的不同状态。
(2)多态的前提:
	A:有继承或者实现关系。
	B:有方法重写。
	C:有父类或者父接口引用指向子类对象。
	
	多态的分类:
		a:具体类多态
			class Fu {}
			class Zi extends Fu {}
			
			Fu f = new Zi();
		b:抽象类多态
			abstract class Fu {}
			class Zi extends Fu {}
			
			Fu f = new Zi();
		c:接口多态
			interface Fu {}
			class Zi implements Fu {}
			
			Fu f = new Zi();
(3)多态中的成员访问特点
	A:成员变量
		编译看左边,运行看左边
	B:构造方法
		子类的构造都会默认访问父类构造
	C:成员方法
		编译看左边,运行看右边
	D:静态方法
		编译看左边,运行看左边
		
	为什么?
		因为成员方法有重写。
(4)多态的好处:
	A:提高代码的维护性(继承体现)
	B:提高代码的扩展性(多态体现)
(5)多态的弊端:
	父不能使用子的特有功能。
	
	现象:
		子可以当作父使用,父不能当作子使用。
(6)多态中的转型
	A:向上转型
		从子到父
	B:向下转型
		从父到子
(7)孔子装爹的案例帮助大家理解多态
(8)多态的练习
	A:猫狗案例
	B:老师和学生案例

十四、抽象类(掌握)

(1)把多个共性的东西提取到一个类中,这是继承的做法。
   但是呢,这多个共性的东西,在有些时候,方法声明一样,但是方法体。
   也就是说,方法声明一样,但是每个具体的对象在具体实现的时候内容不一样。
   所以,我们在定义这些共性的方法的时候,就不能给出具体的方法体。
   而一个没有具体的方法体的方法是抽象的方法。
   在一个类中如果有抽象方法,该类必须定义为抽象类。
(2)抽象类的特点
	A:抽象类和抽象方法必须用关键字abstract修饰
	B:抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
	C:抽象类不能实例化
	D:抽象类的子类
		a:是一个抽象类。
		b:是一个具体类。这个类必须重写抽象类中的所有抽象方法。
(3)抽象类的成员特点:
	A:成员变量
		有变量,有常量
	B:构造方法
		有构造方法
	C:成员方法
		有抽象,有非抽象
(4)抽象类的练习
	A:猫狗案例练习
	B:老师案例练习
	C:学生案例练习
	D:员工案例练习
(5)抽象类的几个小问题
	A:抽象类有构造方法,不能实例化,那么构造方法有什么用?
		用于子类访问父类数据的初始化
	B:一个类如果没有抽象方法,却定义为了抽象类,有什么用?
		为了不让创建对象
	C:abstract不能和哪些关键字共存
		a:final	冲突
		b:private 冲突
		c:static 无意义

十五、接口(掌握)

(1)回顾猫狗案例,它们仅仅提供一些基本功能。
   比如:猫钻火圈,狗跳高等功能,不是动物本身就具备的,
   是在后面的培养中训练出来的,这种额外的功能,java提供了接口表示。
(2)接口的特点:
	A:接口用关键字interface修饰
		interface 接口名 {}
	B:类实现接口用implements修饰
		class 类名 implements 接口名 {}
	C:接口不能实例化
	D:接口的实现类
		a:是一个抽象类。
		b:是一个具体类,这个类必须重写接口中的所有抽象方法。
(3)接口的成员特点:
	A:成员变量
		只能是常量
		默认修饰符:public static final
	B:构造方法
		没有构造方法
	C:成员方法
		只能是抽象的
		默认修饰符:public abstract
(4)类与类,类与接口,接口与接口
	A:类与类
		继承关系,只能单继承,可以多层继承
	B:类与接口
		实现关系,可以单实现,也可以多实现。
		还可以在继承一个类的同时,实现多个接口
	C:接口与接口
		继承关系,可以单继承,也可以多继承
(5)抽象类和接口的区别(自己补齐)?
	A:成员区别
		抽象类:
		接口:
	B:关系区别:
		类与类:
		类与接口:
		接口与接口:
	C:设计理念不同
		抽象类:is a,抽象类中定义的是共性功能。
		接口:like a,接口中定义的是扩展功能。
(6)练习:
	A:猫狗案例,加入跳高功能
	B:老师和学生案例,加入抽烟功能0	

十六、形式参数和返回值的问题(理解)

(1)形式参数:
	类名:需要该类的对象
	抽象类名:需要该类的子类对象
	接口名:需要该接口的实现类对象
(2)返回值类型:
	类名:返回的是该类的对象
	抽象类名:返回的是该类的子类对象
	接口名:返回的是该接口的实现类的对象
(3)链式编程
	对象.方法1().方法2().......方法n();
	
	这种用法:其实在方法1()调用完毕后,应该一个对象;
		      方法2()调用完毕后,应该返回一个对象。
			  方法n()调用完毕后,可能是对象,也可以不是对象。

十七、包(理解)

(1)其实就是文件夹
(2)作用:
	A:区分同名的类
	B:对类进行分类管理
		a:按照功能分
		b:按照模块分
(3)包的定义(掌握)
	package 包名;
	
	多级包用.分开。
(4)注意事项:(掌握)
	A:package语句必须在文件中的第一条有效语句
	B:在一个java文件中,只能有一个package
	C:如果没有package,默认就是无包名
(5)带包的编译和运行
	A:手动式
	B:自动式(掌握)
		javac -d . HelloWorld.java

十八、导包(掌握)

(1)我们多次使用一个带包的类,非常的麻烦,这个时候,Java就提供了一个关键字import。
(2)格式:
	import 包名...类名;
	另一种:
		import 包名...*;(不建议)
(3)package,import,class的顺序
	package > import > class

十九、权限修饰符(掌握)

(1)权限修饰符
			   本类	  同一个包下	不同包下的子类	不同包下的无关类
	private		Y
	默认		    Y		Y
	protected	Y		Y			Y
	public		Y		Y			Y				Y
(2)这四种权限修饰符在任意时刻只能出现一种。
	public class Demo {}		

二十、常见的修饰符(理解)

(1)分类:
	权限修饰符:private,默认,protected,public
	状态修饰符:static,final
	抽象修饰符:abstract
(2)常见的类及其组成的修饰
	类:
		默认,public,final,abstract
		
		常用的:public
	
	成员变量:
		private,默认,protected,public,static,final
		
		常用的:private
		
	构造方法:
		private,默认,protected,public
		
		常用的:public
	
	成员方法:
		private,默认,protected,public,static,final,abstract
		
		常用的:public
(3)另外比较常见的:
	public static final int X = 10;
	public static void show() {}
	public final void show() {}
	public abstract void show();

二十一、内部类(理解)

(1)把类定义在另一个类的内部,该类就被称为内部类。
	举例:把类B定义在类A中,类B就被称为内部类。
(2)内部类的访问规则
	A:可以直接访问外部类的成员,包括私有
	B:外部类要想访问内部类成员,必须创建对象
(3)内部类的分类
	A:成员内部类
	B:局部内部类
(4)成员内部类
	A:private 为了数据的安全性
	B:static 为了访问的方便性
	
	成员内部类不是静态的:
		外部类名.内部类名 对象名 = new 外部类名.new 内部类名();
	成员内部类是静态的:
		外部类名.内部类名 对象名 = new 外部类名.内部类名();
(5)成员内部类的面试题(填空)
	30,20,10
	
	class Outer {
		public int num = 10;
		
		class Inner {
			public int num = 20;
			
			public viod show() {
				int num  = 30;
				
				System.out.println(num);
				System.out.println(this.num);
				System.out.println(Outer.this.num);
			}
		}
	}
(6)局部内部类
	A:局部内部类访问局部变量必须加final修饰。
	B:为什么呢?
		因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。
		所以,堆内存还是用该变量,而改变量已经没有了。
		为了让该值还存在,就加final修饰。
		通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。
(7)匿名内部类(掌握)
	A:是局部内部类的简化形式
	B:前提
		存在一个类或者接口
	C:格式:
		new 类名或者接口名() {
			重写方法;
		}
	D:本质:
		其实是继承该类或者实现接口的子类匿名对象
(8)匿名内部类在开发中的使用
	我们在开发的时候,会看到抽象类,或者接口作为参数。
	而这个时候,我们知道实际需要的是一个子类对象。
	如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式简化。
	
	interface Person {
		public abstract void study();
	}
	
	class PersonDemo {
		public void method(Person p) {
			p.study();
		}
	}
	
	class PersonTest {
		public static void main(String[] args) {
			PersonDemo pd = new PersonDemo();
			pd.method(new Person() {
				public void study() {
					System.out.println("好好学习,天天向上");
				}
			});
		}
	}
	
(9)匿名内部类的面试题(补齐代码)
	interface Inter {
		void show();
	}
	
	class Outer {
		//补齐代码
		public static Inter method() {
			return new Inter() {
				public void show() {
					System.out.println("HelloWorld");
				}	
			};
		}
	}
	
	class OuterDemo {
		public static void main(String[] args) {
			Outer.method().show(); //"HelloWorld"
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值