Java知识点总结【3】类和对象
目录
1.什么是面向过程,什么是面向对象
2.什么是类和对象
3.类的定义和使用
4.成员变量的初始化
5.toString
6.关于static
7.访问限定符
8.代码块
9.内部类
10.类和对象的内存布局
1.什么是面向过程,什么是面向对象
面向过程:要按照业务流程按部就班的来组织代码。
面向对象:要先把业务中的一些概念先提取出来,作为“对象”,然后把对象的每个属性和行为都安排好,然后再去组织业务流程。
2.什么是类和对象
Java中的内置类型不够用,所以根据自己的实际需要创建出一些类型,由自定义的类型创建出来的变量就是对象。类相当于图纸,对象是根据图纸盖出来的房子。
3.类的定义和使用
1)定义示例:
class Cat {public String name; //姓名public int age; //年龄public String gender; //性别public void eat(){System.out.println("小猫正在吃");}public void sleep(){System.out.println("小猫正在睡觉");}}
class为定义类的关键字,Cat为类的名字,{}中为类的主体。
其中name,age,gender称为成员属性/成员变量,这几个变量信息是对类的描述。
eat(),sleep()称为成员方法,主要说明类有什么功能
注意:
- 类名使用大驼峰
- 一个.java文件可以包含多个类
- 一个.java文件至少得有一个class是public修饰的
- 被public关键字修饰的类名,必须和.java文件的名字相同(大小写敏感)
2)类的实例化
实例化相当于根据图纸,建造出房子。使用new 关键字来创建对象。
Cat cat=new Cat();
cat.eat();
cat.sleep();
4.成员变量的初始化
1)默认初始化
注意分清什么是成员变量,什么是局部变量(类中的是成员变量,方法中的是局部变量)。局部变量如果不初始化,编译会报错。如果针对对象中的成员变量没有显示的进行初始化,此时存在一个默认值。
规则:
- 数字类型(包括整数和浮点数)默认初始化为0
- 布尔类型,默认初始化为false
- 引用类型(String,数组,类),默认初始化为null
- char类型,默认初始化为'\u000'
示例:
class Init{int a;long b;double c;String d;boolean e;}
public class Blog{public static void main(String[] args) {Init init=new Init();System.out.println(init.a);System.out.println(init.b);System.out.println(init.c);System.out.println(init.d);System.out.println(init.e);}}
2)就地初始化
这个不难理解,直接看下面的例子就懂了~
class Init{int a=2;long b=20;double c=1.0;String d="";boolean e=true;}
3)构造方法初始化
构造方法的特点:
- 构造方法的名字名和类名相同
- 不需要写return语句
- 不需要手动显示的调用,而是在new的时候,就会被自动的调用
- 构造方法支持重载
使用构造方法初始化,比前面两种初始化方式更灵活强大:
- 构造方法可以传递一些参数,动态的获取到要针对对象初始化的值
- 构造方法可以支持重载,可以有多个构造方法,不同的构造方法所支持的参数的个数或者类型是不同的。正因为这样的重载,就可以通过不同的方式来针对某个对象进行初始化。
示例:
class Init{String name;public Init(String name){this.name=name;}
}
public class Blog{public static void main(String[] args) {Init init=new Init("构造方法初始化示例");System.out.println(init.name);}}
结果
分析:在new对象的时候,就会自动调用构造方法,在传入的参数的时候,形参的name和当前创建的对象的成员变量名name重名了,所以编译器无法区分把形参name赋值给形参还是赋值给当前对象的成员变量name,所以可以使用this关键字来区分,表示当前对象,this相当于“我”,看当前的方法是被哪个对象调用的,this就表示是谁。所以通过传入构造的参数就可以成功初始化我们的成员变量name,最终打印出初始化的成果~
关于this的一些注意事项:this只能在成员变量中使用,在构造方法中,必须放在第一行,且只能调用一个.this()的形式调用当前类的另外一个构造方法。
4)代码块初始化
这个也是看下面的例子也就会了,使用的比较少,但是也有特殊的作用~
class Init{String name;{System.out.println("你好呀~我是代码块初始化时打印的哦~~");name="hello";}
}
public class Blog{public static void main(String[] args) {Init init=new Init();System.out.println(init.name);}}
结果
5)实例化对象的初始化执行顺序
默认初始化->就地初始化和代码块初始化谁先出现先执行谁->构造方法初始化
5.toString
任何一个类里面都可以有toString这个方法,通过这个方法,就可以把一个对象转成一个String,转成String之后,就可以把String打印出来,或者保存在文件中,或者通过网络发送出去...
toString这个方法一般不需要显式调用(显式调用也完全可以),不写显式调用的时候,当代码中把这个对象当成字符串来使用的场景中,就会自动触发toString(比如System.out.println())
示例:
class Init{int year;int month;int day;//构造方法public Init(int year,int month,int day){this.year=year;this.month=month;this.day=day;}//toString方法public String toString(){return this.year+"/"+this.month+"/"+this.day;}
}
public class Blog{public static void main(String[] args) {Init init=new Init(2020,1,20);System.out.println(init);}}
结果
6.关于static
如果一个成员没有被static修饰,这是一个对象的属性/成员/字段
如果一个成员被static修饰了,这就是这个类的属性/成员/字段,使用的时候要用类名.XX的方法使用,只有一份(就相当于只有一份图纸,图纸也有自己的属性,比例尺呀啥的~,不会因为根据图纸创建出的对象的不同而导致图纸的属性变了)
class Person{String name="一颗苹果";static String project="Java";}
public class Blog{public static void main(String[] args) {System.out.println(Person.project);}}
7.访问限定符
属性或者方法前可加这些限定符:
- private:类内部可访问
- default:同包之间访问
- protected:不止同包,而且可被其他包中的子类访问
- public:可在类外部访问
类前面只能加public或者啥都不加
该使用哪种访问权限?一般是希望代码封装程度更好一些,能不被外面知道的东西,就尽量别暴露出去,能使用private尽量用private。
8.代码块
是使用{}定义的一段代码,有四种:
1)普通代码块:定义在方法中的代码块
2)构造块:定义在类中的代码块(不加修饰符),一般用来初始化成员变量,上面举栗子了~
3)静态块:使用static定义的代码块,一般用于初始化静态成员属性
class Person{static String name;static{name="一颗苹果";}
}
public class Blog{public static void main(String[] args) {System.out.println(Person.name);}}
注意:静态代码块不管生成多少个对象,其只会执行一次,且是最先执行的。静态代码块执行完毕后, 实例代码块(构造块)执行,再然后是构造函数执行。
static修饰的代码块执行始终在普通代码块之前,static代码块是在类加载的时候执行的,普通代码块是在创建实例的时候执行的,类加载始终是在创建实例之前(类加载只进行一次)
4)同步代码块
9.内部类
将一个类定义在另一个类中或者一个方法中里面,这样的类称为内部类。
1)静态内部类
static修饰,表示是类相关的
public class Blog{static class B{}public static void main(String[] args) {B b1=new Blog.B();B b2=new B();//也可以省略前面的绑定}}
和静态变量静态方法类似,静态内部类也是和当前类(Blog)绑定的,使用的时候也是使用当前的类Blog调用的。
2)匿名内部类(相对比较常用)
是在一个方法或者代码块中定义的类,没有显示申明类的名称.
public class Blog{public static void main(String[] args) {
// 定一个匿名内部类A a=new A(){};}
}
class A{}
可以看到上面,A a=new A()后面有一个{},表示可以重写方法,对于A中的方法进行重写,其实也就相当于重新创建了一个类(重写之后的类的功能和之前的类的功能不同了),但是这个类我们并没有给它起名字,所以就叫做匿名内部类。
()里面是调用的构造方法,{}里面是重写/定义的方法,只是一个定义,没有产生方法的调用.
public class Test {public static void main(String[] args) {A1 a=new A1(){public String func(String s){System.out.println("hello");return s;}};System.out.println(a.func("world"));}
}
class A1{public String func(String s){return s;}
}
分析:
上面的代码中,我们可以看到有一个类A1,它里面有一个方法func(),功能是将调用时传入的参数打印出来。但是我们在main方法中,实际想要根据A1创建对象时,希望它的实例调用func这个方法时不仅能实现原本的func()的功能,还期望它有别的功能,如上例中,还能打印出"hello",所以就要对A1中的func进行重写,于是我们在A1 a=new A1()后面加上大括号,里面写我们重写的内容,此时的a调用func方法的结果就如下所示:
经常用在需要实例化某个对象,但需要重写方法时,比如new接口,抽象类就是使用匿名内部类较多的方式~~
3)成员内部类
public class Test{//定义一个成员内部类Cpublic class C{}public static void main(String[] args) {C c=new Test().new C();}
}
4)局部内部类(没啥用)
局部内部类的作用域和局部变量的作用域相似,在方法或代码段中定义,作用域和匿名内部类的作用域相同。
public class Test {public static void main(String[] args) {class D extends A{}System.out.println(new D());}
}
class A{
}
和匿名内部类相似,只是显示申明了名字
10.类和对象的内存布局
JVM中的内存区域除了堆和栈之外,还有一个非常重要的区域,方法区。这些是JVM自己从系统申请过来的内存的进一步的划分。
栈:方法和方法之间的调用关系
堆:new出来的对象/实例
方法区:存的是一个一个的“类相关的信息”(每个类的方法的二进制的指令也是在这里),对于属性来说,如果属性是一个实例属性,那么不在方法区,而是跟着实例走(实例一般在堆上),如果一个属性是一个类属性(static),那么也就在方法区中。对于方法来说,不管是加static还是不加,对应的内容都是在方法区中。
Java知识点总结【3】类和对象相关推荐
- 八、Java面向对象编程(类、对象、方法、重载、可变参数、作用域、构造器、this本质)
文章目录 Java面向对象编程(类.对象.方法.重载.可变参数.作用域.构造器.this本质) 一.类与对象 1. 类与对象的引出 2. 使用现有技术解决 3. 现有技术解决的缺点分析 4. 类与对象 ...
- Java快速入门学习笔记7 | Java语言中的类与对象
有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...
- Java第五课:类和对象
Java第五课:类和对象 Java第五课:类和对象 1.1 上周回顾 1.2 作业讲解 1.3 类和对象: 1.4 面向对象: 1.4.1 类的概念: 1.4.2 类的基本结构: 1.4.3 对象的概 ...
- Java实用教程笔记 类与对象(续)
类与对象(续) 实例变量(动态变量) 类变量(静态变量)(数据共享)static(尽量写成public(private和protected毫无意义)) 实例方法(既可访问静态数据,又可访问动态数据)A ...
- Java实用教程笔记 类与对象
类与对象 Abstract Body instanceof 文件后缀名 .py .c .cpp .java 成员函数/成员方法/行为 interface接口 可类比C++中抽象类 IDEA快捷键操作 ...
- Java读书笔记05 类与对象
本文为java中对象与类等的基本知识,包括方法.构造.析构.静态域.初始化.包.路径等. 对象与对象变量 在Java中,任何对象变量的值都是对存储在另外一处的一个对象的引用.new操作符的返回值也是一 ...
- 【Java】5.1 类和对象
目 录 总诀:定义类,创建对象,调用方法 成员变量(field):[修饰符]类型 变量名 [=初始值] 方法定义:[修饰符] 返回值类型 方法名 (0~N个形参声明) 构造器定义:初始化对象 ...
- java类描述_java笔记2:Java语言中的类和对象的描述
在Java 语言中,除8 个基本数据类型值之外, 一切都是对象,而对象就是面向对象程序设计的中心. 对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还 ...
- Java学习笔记_类和对象
·类:是一组相关属性和行为的集合,可以看成是一类事务的模板,使用事物的属性特征和行为特征来描述该类事物. ·属性:该事物的状态信息 ·行为:就是该事物能够做什么 ·对象:一类事物的具体体现,对象是类的 ...
- android 静态方法 构造方法,android基础-Java篇02:类和对象、构造方法、访问权限控制、重载、this关键字、static关键字...
一.类和构造方法 (类和对象在百度百科已经有详细的介绍,这里只做简单的描述以及帮助理解:百度百科:类和对象,需要注意的是,百度百科类和对象的举例中都是C++,书写格式不要和Java混淆!) 什么是类? ...
最新文章
- java 主线程_Java中的主线程 - Break易站
- ScrollViewer滚动究竟来触发载入数据的Behavior
- 本地配yum(没有网络)
- IBM等创建开放虚拟化联盟对抗VMware
- 某计算机系统20位地址线 8位数据线,同济大学2009-2010(1)微机原理期终考试试题(B卷)...
- rabbitmq配置文件字段spring.rabbitmq.publisher-confirms过时
- 转 Procrastination
- Mysql学习总结(65)——项目实战中常用SQL实践总结
- Javascript + Servlet的鸿沟如何抹平以构建富客户端应用?[SOS]
- linux mysql查看所有表_Linux之系统操作命令
- Python学习系列----第六章 数据结构
- excel文本写入 npoi_C#使用NPOI读写excel
- 锐捷客户端 开机不能自动联网 无法启动DHCP Client服务
- 这知道这个错误是咋回事啊?
- 程序员的笔记本选择推荐
- 2.14Python标准库使用案例:使用turtle绘制奥林匹克五环
- 10分钟上手pythonpandas_10分钟学pandas(10 Minutes to pandas)-全文翻译
- CNN系列:GoogleNet:深入卷积架构(Going Deeper with Convolutions)
- synaptic 图形界面下载工具
- 什么是动态、静态、伪静态
热门文章
- [ 移植 ] ___ Library : Icu
- 苹果x浏览器显示服务器停止,苹果浏览器服务器停止打不开网页
- 转载:盘点开放源码软件
- 【Python 基础】Python 文件读写模式 mode
- 开源 多进程 框架 c++_有哪些值得推荐的c/c++开源框架与库
- 正能量系列]失业的程序员(四)
- 分支限界法 01背包c语言,算法笔记分支限界法01背包问题
- PhotoShop中画圆角矩形最简单方法(图文并茂)!
- 学生HTML静态网页基础水平制作DIV+CSS+JavaScript技术制作美食网页——美食城6页面
- 怎样使用css让矩形出现圆角,CSS中设置元素的圆角矩形