Java基础学习(三)—面向对象(上)
一、理解面向对象
面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节;这种思想是将数据作为第一位,而方法或者说是算法作为其次,这是对数据一种优化,操作起来更加的方便,简化了过程。
面向对象的三大特征: 封装性、继承性、多态性。
封装性: 隐藏了对象的属性和实现细节,仅对外提供公共的访问方式,提高了代码的复用性和安全性。
继承性: 两种事物之间存在一定的所属关系,那么继承的类可以从被继承的类中获得一些属性和方法,提高了代码的复用性。
多态性: 父类的引用指向了子类对象,提高了程序的扩展性。多态有一点不好之处就是父类的引用不能访问子类中的成员。
二、成员变量和局部变量的区别
1.在类中的位置不同
成员变量在类中的方法外定义的。
局部变量在方法内或者方法声明上定义的。
2.在内存中的位置不同
成员变量在堆内存中。
局部变量在栈内存中。
3.生命周期不同
成员变量随着对象的存在而存在,随着对象的消失而消失。
局部变量随着方法的调用而存在,随着方法的调用完毕而消失。
4.初始化值不同
成员变量有默认的初始化值。
局部变量没有默认的初始化值,必须先定义、赋值后才能使用。
三、匿名对象
定义: 没有名字的对象。
两种使用情况:
A: 对象调用方法仅仅一次的时候。
B: 作为实际参数传递。
好处: 匿名对象调用完毕就是垃圾,可以被垃圾回收器回收。
例子如下。
public class Test{
public static void main(String[] args){
//匿名对象调用方法
new Student().show();
//匿名对象作为实际参数传递
new StudentDemo().method(new Student());
}
}
class Student{
public void show(){
System.out.println("学生学习...");
}
}
class StudentDemo{
public void method(Student s){
s.show();
}
}
四、private关键字
(1)是一个权限修饰符。
(2)可以修饰成员变量和成员方法。
(3)被private修饰的成员只在本类中才能访问。
应用如下。
public class Test{
public static void main(String[] args){
Student s = new Student();
s.setName("Tom");
s.setAge(22);
System.out.println("name = " + s.getName());
System.out.println("age = " + s.getAge());
}
}
class Student{
private String name;
private int 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;
}
}
五、this关键字
Java关键字this只能用于方法体内。当一个对象创建后,Java虚拟机就会为这个对象分配一个引用自身的指针,这个指针名字就是this。因此this只能在非静态方法中使用,静态方法和静态的代码块中绝对不可以出现this。this只和特点对象关联,而不和类关联,同一个类的不同对象有不同的this。
this的使用有三种情况。
1.函数的局部变量和成员变量同名情况下,成员变量被屏蔽,此时要访问成员变量则需要使用this.成员变量名的方式来引用成员变量。
public class Test{
private int age = 10;
public Test(int age){
System.out.println("1---this.age = " + this.age);
this.age = age;
System.out.println("2---this.age = " + this.age);
}
public static void main(String[] args){
Test t = new Test(22);
System.out.println("age = " + t.age);
}
}
结果:
1---this.age = 10
2---this.age = 22
age = 22
2.在同一类中,可以用this调用其他构造方法。
class Student{
private String username;
private String password;
private int age;
public Student(String username,String password,int age){
super();
this.username = username;
this.password = password;
this.age = age;
}
public Student(String username,String password){
this(username,password,0);
}
public Student(String username){
this(username,"1234");
}
}
3.在方法中,需要引用该方法所属类的当前对象的时候,使用this。
六、构造方法
1.作用
给对象的数据进行初始化。
2.格式
(1)方法名与类名相同。
(2)没有返回值,连void都没有。
3.注意事项
(1)如果你不提供构造方法,系统会给出默认无参构造方法。
(2)如果你提供构造方法,系统将不再提供。
(3)构造方法也是可以重载的。
public class Test{
public static void main(String[] args){
Student s = new Student("Tom",22);
System.out.println("name = " + s.getName());
System.out.println("age = " + s.getAge());
}
}
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;
}
}
Student s = new Student();在内存中做了什么事情?
(1)加载Student.class文件进内存。
(2)在栈内存为s开辟空间。
(3)在堆内存为学生对象开辟空间。
(4)对学生对象的成员变量进行默认初始化。
(5)对学生对象的成员变量进行显示初始化。
(6)通过构造方法对学生对象的成员变量赋值。
(7)学生对象初始化完毕,把对象地址赋值给s变量。
七、static关键字
1.特点
(1)随着类的加载而加载。
(2)优先于对象存在。
(3)被类的所有对象共享。
(4)可以通过类名直接调用。
2.static方法
static方法一般称为静态方法。由于静态方法不依赖于任何对象就可以访问,因此在静态方法来说是没有this关键字的。而且在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法和非静态成员变量必须依赖具体的对象才能够被调用。但是注意,虽然在静态方法中不能访问非静态的成员变量和方法,但是在非静态成员方法中可以访问静态成员变量和方法的。
3.static变量
静态变量和成员变量的区别?
(1)所属不同
静态变量属于类。
成员变量属于对象。
(2)内存中的位置不同
静态变量存储在方法区的静态区。
成员变量存储在堆内存中。
(3)出现时间不同
静态变量随着类的加载而加载,随着类的消失而消失。
成员变量随着对象的创建而存在,随着对象的消失而消失。
(4)调用不同
静态变量可以通过类名调用,也可以通过对象调用。
成员变量只能通过对象调用。
八、代码块
在Java中使用"{ }"括起来的代码被称为代码块。根据其位置和声明不同,可分为局部代码块,构造代码块,静态代码块,同步代码块。
1.局部代码块
在方法中出现,限定变量的生命周期,及早释放,提供内存利用率。
2.构造代码块
在类中方法外出现,多个构造方法中相同的代码存放在一起,每次调用构造都执行,并且优先于构造方法执行。
3.静态代码块
在类中的方法外出现,并加上static修饰,用于给类进行初始化,在加载的时候就执行,并且只执行一次。
/*
* 代码块
* (1)用{}括起来的代码。
* (2)分类:
* A:局部代码块
* 用于限定变量的生命周期,及早释放,提高内存利用率。
* B:构造代码块
* 把多个构造方法中相同的代码可以放到这里,每个构造方法执行前,首先执行构造代码块。
* C:静态代码块
* 对类的数据进行初始化,仅仅只执行一次。
* (3)静态代码块,构造代码块,构造方法的顺序问题?
* 静态代码块 > 构造代码块 > 构造方法
*/
public class CodeBlock{ //静态代码块
static{
int a = 30;
System.out.println(a);
} //构造代码块
{
int a = 20;
System.out.println(a);
} public CodeBlock(){ System.out.println("CodeBlock......"); } public static void main(String[] args){ CodeBlock cb = new CodeBlock();
CodeBlock cb2 = new CodeBlock(); //局部代码块
{
int x = 10;
System.out.println(x);
} }
}
结果:
30
20
CodeBlock......
20
CodeBlock......
10
Java基础学习(三)—面向对象(上)的更多相关文章
- java基础学习05(面向对象基础01)
面向对象基础01 1.理解面向对象的概念 2.掌握类与对象的概念3.掌握类的封装性4.掌握类构造方法的使用 实现的目标 1.类与对象的关系.定义.使用 2.对象的创建格式,可以创建多个对象3.对象的内 ...
- java基础学习总结——面向对象1
目录 一.面向过程的思想和面向对象的思想 二.简单理解面向对象 三.面向对象的设计思想 四.对象和类的概念 五.如何抽象出一个类? 六.类(对象)之间的关系 七.Java与面向对象 八.为什么使用面向 ...
- java基础学习总结——面向对象2
一.JAVA类的定义
- java基础学习05(面向对象基础02)
面向对象基础02 实现的目标 1.String类的使用2.掌握this关键字的使用3.掌握static关键字的使用4.了解内部类 String类 实例化String对象一个字符串就是一个String类 ...
- java基础学习05(面向对象基础01--类实例分析)
面向对象基础01(类实例分析) 实现的目标 1.如何分析一个类(类的基本分析思路) 分析的思路 1.根据要求写出类所包含的属性2.所有的属性都必须进行封装(private)3.封装之后的属性通过set ...
- Java基础语法04面向对象上-类-属性-方法-可变参数-重载-递归-对象数组
类 面向对象是一种思想,一般指将事务的属性与方法抽出总结为模板(类/class),处理事务时通过类创建/new出对象由对象的功能/方法去完成所要计算处理的事情. 面向过程:POP:以过程,步骤为主,考 ...
- Java基础学习之面向对象(4)
目录 1.面向对象概述 1.1.类与对象的关系 1.2.类的具体描述 2.面向对象的三大特性 2.1.继承 2.2.多态 2.3.封装 1.面向对象概述 1.1.类与对象的关系 有对象吗,没有的话我给 ...
- 转载-java基础学习汇总
共2页: 1 2 下一页 Java制作证书的工具keytool用法总结 孤傲苍狼 2014-06-24 11:03 阅读:25751 评论:3 Java基础学习总结——Java对象的序列化和 ...
- JAVA基础学习-集合三-Map、HashMap,TreeMap与常用API
森林森 一份耕耘,一份收获 博客园 首页 新随笔 联系 管理 订阅 随笔- 397 文章- 0 评论- 78 JAVA基础学习day16--集合三-Map.HashMap,TreeMap与常用A ...
随机推荐
- 简述.jpg .Gif .png-8 .png-24的区别
最近有很多朋友在开发过程中有时候会遇到图片加载不清晰,透明度失真,或者对图片进行操作之后造成图片损耗的现象,在这里给大家简单介绍一下常用的几种图片格式之间的区别 Gif格式特点: 1.透明性,Gif是 ...
- ldd获得可执行程序的所有库并输出到指定目录
#!/bin/bash ########################################################################## #ldd可以查看程序的库依 ...
- 《剑指offer》— JavaScript(21)栈的压入、弹出序列
栈的压入.弹出序列 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5, ...
- 每天一个Linux命令(08)--cp命令
cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数.但是如果是 ...
- Robot Framework中经常用的第三方库的安装方法
pip升级:python -m pip install --upgrade pip 一.安装robotframework-selenium2library,相当于python中的selenium ...
- CSS,注意点!!!!!!!
css 一.整体布局 1.创建一个html标签 2.创建三个div标签(分别是网页的头部,中间,和底部三部分) 3.一般都用class选择器 4.用css给body标签加个 margin:0(用于消除 ...
- 学习H5一周随笔
H5学习也已经进行了一个周了,除了学习过程中的乱哄哄的脑子,对H5初学者(我)常见的问题有了如下见解. 1.初学者在建立新的Html文件之后,有时候会把 <meta charset=" ...
- Spring注解问题,[action中注入service失败
pring-mvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- Android Crash 全局捕获
Android Crash 全局捕获 首先应该明白的一点是,Android在崩溃后会重新启动崩溃时的那个Activity,如果你的Activity在初始化的时候就直接崩溃,那么你将连续得到 Crash ...
- Python实现Windows定时关机
是最初的几个爬虫,让我认识了Python这个新朋友,虽然才刚认识了几天,但感觉有种莫名的默契感.每当在别的地方找不到思路,总能在Python找到解决的办法.自动关机,在平时下载大文件,以及跑程序的时候 ...