java类与对象的动手动脑和其他小问题
在Java中,我们可以通过组合一私有字段和一对get/set方法来定义一个属性。私有的变量,共有的方法。
package sample;
/**
* 自定义Java类的示例
*/
class MyClass {
// 公有字段
public String Information = "";
// 自定义公有Java实例方法
public void myMethod(String argu) {
System.out.println(argu);
}
// 定义属性:私有字段+get方法+set方法
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
public class ClassAndObjectTest {
public static void main(String[] args) {
//创建类的实例,定义一个对象变量引用这一实例
MyClass obj = new MyClass();
//通过对象变量调用类的公有方法
obj.myMethod("hello");
//给属性赋值
obj.setValue(100);
//输出属性的当前值
System.out.println(obj.getValue());
//直接访问对象公有字段
obj.Information = "Information";
//输出对象公有字段的当前值
System.out.println(obj.Information);
}
}
步骤基本为:
(1)需要定义一个对象变量
(2)然后“创建(new)”一个对象,赋值给对象变量
(3)通过对象变量使用对象,主要方式有:
1)直接调用类的方法;
2)存取类的字段。
MyClass obj = new MyClass();这种“引用”一个对象的变量称为“引用类型”的变量,有时又简称为“对象变量”。 以前的int,float之类的称为原始数据类型的变量。
当声明一个对象类型的变量时,实际上并没有创建一个对象,此变量=null。
定义一个原始类型的变量时,会马上给其分配内存。
在定义变量时,Java要求必须显式初始化变量;对象变量如果不引用一个真实的对象,则必须声明为null。特殊值null:代表一个对象变量不引用任何对象。
上图说明:当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等
当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。
引用代表地址,所以“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。
如何比较两个对象的“内容”是否一样?
两个对象的“内容”,其实是指它们在某一时刻的所有字段的值,“内容相等”,其实是就“对应字段值”一致。
在Java中要比对两个对象的字段值,可以 “重写(override)”基类的equals()方法:
package sample;
public class ObjectEquals {
public static void main(String[] args) {
MyTestClass obj1=new MyTestClass(100);
MyTestClass obj2=new MyTestClass(100);
System.out.println(obj1==obj2);
System.out.println(obj1.equals(obj2));
}
}
class MyTestClass
{
public int Value;
//注意:只有参数类型为Object的,才是重写了Object的equals方法
//参数类型为MyTestClass的,仅仅是Overload了equals方法。
// @Override
// public boolean equals(Object obj)
// {
// return ((MyTestClass)obj).Value==this.Value;
// }
public boolean equals(MyTestClass obj)
{
return obj.Value==this.Value;
}
public MyTestClass(int initValue)
{
Value=initValue;
}
}
第一次输出错误,第二次正确。
当你定义一个类时,如果不显式指明它的“父亲”类是哪个,则默认是Object。
Object是Java的最顶层基类,其中定义了equals( )方法
除了重写基类的equals方法,我们也可以“重载(overload)”equals( )方法:
注意:
与前面“重写”方式的代码相比,equals( )方法的参数类型是MyTestClass而不是Object,并且方法本身也没有附加“@Override”标记。
1.以下代码为何无法通过编译?哪儿出错了?
结论是:如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。
修改之后的代码:
package sample;
public class Test {
public static void main(String[] args){
修改的地方这一行:Foo obj1=new Foo(23);
}
}
class Foo{
int value;
public Foo(int initValue){
value=initValue;
}
}
如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?
这是一个生造出来展示Java语法特性的示例类,在实际开发中不要这样写代码,应该尽量保证一个字段只初始化一次!
2.请依据代码的输出结果,自行总结Java字段初始化的规律。(发表到博客)
package sample;
public class test2 {
public static void main(String[] args){
InitializeBlockClass obj=new InitializeBlockClass();
System.out.println(obj.field);//没有形参 用定义的field
obj=new InitializeBlockClass(300);
System.out.println(obj.field);//有形参调用构造函数
}
}
class InitializeBlockClass{
{
field=200;
}
public int field=100;
public InitializeBlockClass(int value){
this.field=value;
}
public InitializeBlockClass(){
}
}
如果在主函数中创建对象时没有形参时,如果在类中定义了公共的变量并给与了赋值,那么就会把值赋给主函数中的变量,再调用类中的默认构造函数;如果在主函数中创建对象时有形参,则调用类中对应的构造函数。
(1).执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。
(2).执行类的构造函数。
类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。
3.当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。(编写代码)
package jicheng;
//当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。 2015.10.16
public class JiCheng {
public static void mian(String args[]){
Son s=new Son();
s.print();
}
}
//父类对象
class Father
{
String name = "liming";
int age = 21;
}
//子类对象
class Son extends Father
{
String like="running";
void print()
{
System.out.println("name"+name+" age:"
+age+" aihao:"+like);
}
}
运行结果为:name=lining,age=21,like=running.
4.请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。
静态初始化块的执行顺序:
1.静态初始化块只执行一次。
2.创建子类型的对象时,也会导致父类型的静态初始化块的执行。
5.静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?
package example;
//静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)? 2015.10.16
public class example{
public static void main(String[] args)
{
example.display();
example e=new example();
e.displayOne();
e.display();
}
public static void display(){
System.out.println("类的方法");
}
public void displayOne()
{
System.out.println("对象的方法");
}
}
java类与对象的动手动脑和其他小问题的更多相关文章
- JAVA类与对象作业——动手动脑以及课后实验性问题
一: 1.源代码 //MAO2015.10.6 //foo class Foo { int value; public Foo(int initValue) { value = initValue; ...
- Java类和对象初始化
类的生命周期: Java类的初始化: 本阶段负责为类变量赋正确的初始值.(类变量即静态变量) Java编译器把所有的类变量初始化语句和静态初始化器通通收集到<clinit>方法中,该方法只 ...
- java类和对象之间的差
java类和对象之间的差别是一个普遍的问题,刚开始学习java当它来到与类和对象接触.今天就来总结一下它们之间的差异. 先说说class和object差异.事实上,词:object是全部class的父 ...
- 危险代码:如何使用Unsafe操作内存中的Java类和对象
危险代码:如何使用Unsafe操作内存中的Java类和对象—Part1 危险代码:如何使用Unsafe操作内存中的Java类和对象—Part2 危险代码:如何使用Unsafe操作内存中的Java类和对 ...
- [Java初探08]__简单学习Java类和对象
前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...
- java类和对象
类是对象的抽象 对象是类的一个实例类 对象 = new 类();拿对象可以操作这个类里的方法 java类与对象的区别是个老生常谈的问题,刚开始学java的时候就开始接触类和对象,今天来总结一下他们之间 ...
- Java类和对象动手动脑
动手动脑1 以下代码为何无法通过编译?哪儿出错了?
- java第二次课件课后动手动脑习题整理总结(2019年9月23号)
一.动手动脑 1 1.题目 2.程序源代码 package yang8; import java.util.Scanner; import java.util.Random; public class ...
- 解析Java类和对象的初始化过程
类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来 ...
随机推荐
- 程序员必须知道的几个国外IT网站
1.TheServerSide 这是一个老牌的IT信息网站,从名称上你就能看出,它是关注服务器端编程的,以Java和Java周边信息为主,不过最近它也有向客户端和微软产品扩展的趋势.这个网站最初是以免 ...
- USACO Section 2.4: Fractions to Decimals
乍看题目感觉有难度,实际分析后其实是道简单题 /* ID: yingzho1 LANG: C++ TASK: fracdec */ #include <iostream> #include ...
- 京东商城发现了一枚Bug
我在京东上买了几本书,发现了一个BUG.. 买书的时候,我选了京东自营的书和京东其他店的书,合在一起购买,填写了开具发票. 然后,京东处理流程是,将上面一笔订单拆分成两笔,然后发票信息没有转到其他店那 ...
- Java中获取完整的url
Java中获得完整的URl字符串 HttpServletRequest httpRequest=(HttpServletRequest)request; String strBackUrl = &qu ...
- Android eMMC Booting
Android eMMC Booting Contents [hide] 1 eMMC binaries 1.1 Creating the GPT table 1.2 Modifying .IMG F ...
- [CCPC2016]网赛部分比赛代码
来自HDOJ: 5833 ( Zhu and 772002 ) /* ━━━━━┒ギリギリ♂ eye! ┓┏┓┏┓┃キリキリ♂ mind! ┛┗┛┗┛┃\○/ ┓┏┓┏┓┃ / ┛┗┛┗┛┃ノ) ┓┏ ...
- github创建repo,本地导入git项目到github
一般地,在注册好github账号之后,你需要做的事情就是在github上创建一个repo,该repo将成为你的origin(central)repo,随后你就可以将本地的项目git repo导入到这个 ...
- 【笨嘴拙舌WINDOWS】实践检验之屏幕取色
实践是检验真理的唯一标准 要取得屏幕的颜色,首先需要创建一个屏幕DC,然后使用该DC,调用GetPixel就可以了 "Note:GetPixel传入的DC应该是屏幕的DC,而不是桌面的DC, ...
- [ionic开源项目教程] - 第10讲 新闻详情页的用户体验优化
目录 [ionic开源项目教程] 第1讲 前言,技术储备,环境搭建,常用命令 [ionic开源项目教程] 第2讲 新建项目,架构页面,配置app.js和controllers.js [ionic开源项 ...
- 查看mysql存储引擎
一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎:mysql> show engines; 看你的mysql当前默认的存储引擎:mys ...