Java的类演进过程
1、从面向过程到面向对象
class Person {
String name;
int age;
public void eat(){
System.out.println("Person can eat.");
}
}
类是抽象的,不能直接对类来进行操作,需要将此类具体化,所以需要将类转换为对象,同过new关键字来创建一个该类的对象。
Person per = new Person();
通过per对象来进行操作,包括类属性的赋值和函数的执行。
public class ClassDemo {
public static void main(String[] args){
Person per = new Person();
per.age = 30;
per.name = "Wendy";
per.eat();
}
}
Person per1 = new Person();
per1.age = -30;
如果外面的程序可以随意修改一个类的成员变量,会造成不可预料的程序错误,比如数据的错误、混乱或安全性问题。所以我们需要将类的成员变量进行封装,使用private关键字来说明成员变量的访问权限,只有该类的其他成员方法可以调用,其他类中的方法不能调用,这个成员变量就成为了私有成员变量。
class Person{
private String name;
private int age;
public void eat(){
System.out.println("ClassDemo can eat.");
}
}
为了实现良好的封装性,通常将类的成员变量声明为private,再通过public方法来对这个变量进行访问。对一个变量的操作,一般都有读取和赋值操作,分别定义两个方法来实现这两种操作,一个是getXxx(),用来读取这个成员变量操作,另外一个是setXxx(),用来对这个成员变量赋值。
class Person{
private String name;
private int age;
//设置年龄
public void setAge(int age) {
this.age = age;
}
//读取年龄
public int getAge() {
return age;
}
//设置姓名
public void setName(String name) {
this.name = name;
}
//读取姓名
public String getName() {
return name;
}
public void eat(){
System.out.println("Person can eat.");
}
}
public class FunctionDemo {
public static void main(String[] args) {
System.out.println(sum(10,20));
System.out.println(sum1(10,20,30));
System.out.println(sum2(10,20,30,40));
System.out.println(sum3(10.5f,20f));
}
//需求1:求两个数的和
public static int sum(int a,int b) {
System.out.println("int");
return a + b;
}
//需求2:求三数的和
public static int sum1(int a,int b,int c) {
return a + b + c;
}
//需求3:求四个数的和
public static int sum2(int a,int b,int c,int d) {
return a + b + c + d;
}
//需求4:求浮点数的和
public static float sum3(float a,float b) {
System.out.println("float");
return a + b;
}
}
public class FunctionDemo {
public static void main(String[] args) {
//jvm会根据不同的参数去调用不同的功能
System.out.println(sum(10,20));
System.out.println(sum(10, 20, 30));
System.out.println(sum(10, 20, 30, 40));
System.out.println(sum(10.5f, 20f));
}
//需求1:求两个数的和
public static int sum(int a,int b) {
System.out.println("int");
return a + b;
}
//需求2:求三数的和
public static int sum(int a,int b,int c) {
return a + b + c;
}
//需求3:求四个数的和
public static int sum(int a,int b,int c,int d) {
return a + b + c + d;
}
//需求4:求浮点数的和
public static float sum(float a,float b) {
System.out.println("float");
return a + b;
}
}
而方法重载我们会在一般方法上使用,但是更多的是使用在构造方法上。这里就不解释什么叫构造方法了,可以另行学习。当创建一个对象时,JVM会去调用对应类的构造方法,根据构造方法来为类的成员变量进行数据初始化赋值。默认的构造方法是无参构造,但是我们定义了多个构造方法,而且这些构造方法具有不同个数或不同类型的参数,编译器就会根据括号中传递的参数来选择相应的构造方法。
class Person{
private String name;
private int age;
//无参构造方法
public Person() {
System.out.println("调用无参构造方法");
}
//参数为name的构造方法
public Person(String name){
System.out.println("调用参数为name的构造方法");
this.name = name;
}
//参数为age的构造方法
public Person(int age){
System.out.println("调用参数为age的构造方法");
this.age = age;
}
//参数为name,age的构造方法
public Person(String name, int age) {
System.out.println("调用参数为name,age的构造方法");
this.name = name;
this.age = age;
}
//设置年龄
public void setAge(int age) {
this.age = age;
}
//读取年龄
public int getAge() {
return age;
}
//设置姓名
public void setName(String name) {
this.name = name;
}
//读取姓名
public String getName() {
return name;
}
}
public class ClassDemo {
public static void main(String[] args){
Person per1 = new Person();
System.out.println("Name:"+per1.getName()+"\tAge:"+per1.getAge());
Person per2 = new Person("Wendy");
System.out.println("Name:"+per2.getName()+"\tAge:"+per2.getAge());
Person per3 = new Person(25);
System.out.println("Name:"+per3.getName()+"\tAge:"+per3.getAge());
Person per4 = new Person("Ann",30);
System.out.println("Name:"+per4.getName()+"\tAge:"+per4.getAge());
}
}
class Student{
private String name;
private int age;
Student() {}
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;
}
public void eat(){
System.out.println("Person can eat.");
}
}
class Teacher{
private String name;
private int age;
Teacher() {}
Teacher(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;
}
public void eat(){
System.out.println("Person can eat.");
}
}
class Person{
private String name;
private int age;
Person() {}
Person(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;
}
public void eat(){
System.out.println("Person can eat.");
}
}
class Student extends Person{
Student() {}
}
class Teacher extends Person{
Teacher() {}
}
public class ExtendsDemo {
public static void main(String[] args) {
Student stu = new Student();
stu.setName("Wendy");
stu.setAge(28);
System.out.println("Name:" + stu.getName() + "\tAge:" + stu.getAge());
stu.eat();
Teacher teacher = new Teacher();
teacher.setName("Yan");
teacher.setAge(45);
System.out.println("Name:"+teacher.getName()+"\tAge:"+teacher.getAge());
teacher.eat();
}
}
class Student extends Person {
Student() {
}
public void eat() {
System.out.println("Student can eat.");
}
}
class Teacher extends Person {
Teacher() {
}
public void eat() {
System.out.println("Teacher can eat.");
}
}
测试类:
public class ExtendsDemo {
public static void main(String[] args) {
Student stu = new Student();
stu.setName("Wendy");
stu.setAge(28);
System.out.println("Name:" + stu.getName() + "\tAge:" + stu.getAge());
stu.eat();
Teacher teacher = new Teacher();
teacher.setName("Yan");
teacher.setAge(45);
System.out.println("Name:"+teacher.getName()+"\tAge:"+teacher.getAge());
teacher.eat();
}
}
class Fu {
public int num = 100;
//成员方法
public void show() {
System.out.println("show Fu");
}
//成员静态方法
public static void function() {
System.out.println("function Fu");
}
}
class Zi extends Fu {
public int num = 1000;
public int num2 = 200;
//成员方法
public void show() {
System.out.println("show Zi");
}
//子类特有的方法
public void method() {
System.out.println("method zi");
}
//成员静态方法
public static void function() {
System.out.println("function Zi");
}
}
public class DuoTaiDemo {
public static void main(String[] args) {
//要有父类引用指向子类对象。
//父类 f = new 子类();
Fu f = new Zi();
System.out.println(f.num); //100
//找不到符号
//System.out.println(f.num2);
f.show(); //show zi
//找不到符号
//f.method();
f.function(); //functin Fu
}
}
public class DuoTaiDemo {
public static void main(String[] args) {
//父类 f = new 子类();
Fu f = new Zi();
System.out.println(f.num); //
f.show(); //show zi
f.function(); //functin Fu
Zi zi = (Zi)f;
zi.method(); //method zi
}
}
abstract class Person {
private String name;
private int age;
protected Person() {}
Person(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;
}
public abstract void eat();
public abstract void sleep();
}
class Student extends Person {
public Student(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("Student can eat.");
}
public void sleep(){
System.out.println("Student can sleep.");
}
}
class Teacher extends Person {
public Teacher(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("Teacher can eat.");
}
public void sleep(){
System.out.println("Teacher can sleep.");
}
}
测试类:
public class AbstractDemo {
public static void main(String[] args){
Person per1 = new Student("Jone",16);
per1.eat();
per1.sleep();
System.out.println("Name:"+per1.getName()+"\tAge:"+per1.getAge());
Person per2 = new Teacher("Sam",60);
per2.eat();
per2.sleep();
System.out.println("Name:"+per2.getName()+"\tAge:"+per2.getAge());
}
}
//定义动物培训接口
interface AnimalTrain {
public abstract void jump();
}
//抽象类实现接口
abstract class Dog implements AnimalTrain {
}
//具体类实现接口
class Cat implements AnimalTrain {
public void jump() {
System.out.println("猫可以跳高了");
}
}
class InterfaceDemo {
public static void main(String[] args) {
//AnimalTrain是抽象的; 无法实例化
//AnimalTrain at = new AnimalTrain();
//at.jump();
AnimalTrain at = new Cat();
at.jump(); //猫可以跳高了
}
}
2)关系区别:
//定义抽烟接口
interface Smoking {
//抽烟的抽象方法
public abstract void smoke();
}
//定义抽象人类
abstract class Person {
//姓名
private String name;
//年龄
private int age;
public Person() {}
public Person(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;
}
//吃饭();
public abstract void eat();
//睡觉(){}
public void sleep() {
System.out.println("睡觉觉了");
}
}
//具体老师类
class Teacher extends Person {
public Teacher() {}
public Teacher(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("吃大白菜");
}
}
//具体学生类
class Student extends Person {
public Student() {}
public Student(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("吃红烧肉");
}
}
//抽烟的老师
class SmokingTeacher extends Teacher implements Smoking {
public SmokingTeacher() {}
public SmokingTeacher(String name,int age) {
super(name,age);
}
public void smoke() {
System.out.println("抽烟的老师");
}
}
//抽烟的学生
class SmokingStudent extends Student implements Smoking {
public SmokingStudent() {}
public SmokingStudent(String name,int age) {
super(name,age);
}
public void smoke() {
System.out.println("抽烟的学生");
}
}
public class InterfaceDemo {
public static void main(String[] args) {
//测试学生
SmokingStudent ss = new SmokingStudent();
ss.setName("杨小红");
ss.setAge(27);
System.out.println(ss.getName()+"---"+ss.getAge());
ss.eat();
ss.sleep();
ss.smoke();
System.out.println("-------------------");
SmokingStudent ss2 = new SmokingStudent("陈小明",30);
System.out.println(ss2.getName()+"---"+ss2.getAge());
ss2.eat();
ss2.sleep();
ss2.smoke();
//测试老师
SmokingTeacher st = new SmokingTeacher("陈老师",36);
System.out.println(st.getName()+"---"+st.getAge());
st.eat();
st.sleep();
st.smoke();
}
}
Java的类演进过程的更多相关文章
- 一道题反映Java的类初始化过程
Java的类初始化过程: 1. 父类的static成员变量,static语句块. 2. 子类的static成员变量,static语句块. 3. 父类的普通成员变量,构造函数. 4. 子类的普通成员变量 ...
- Java 创建类的过程
创建对象过程: 堆分配父类空间 堆分类子类空间 属性初始化 调用构造方法(第一行是调用父类构造方法)
- Java:验证在类继承过程中equals()、 hashcode()、toString()方法的使用
以下通过实际例子对类创建过程汇中常用的equals().hashcode().toString()方法进行展示,三个方法的创建过程具有通用性,在项目中可直接改写. //通过超类Employee和其子类 ...
- 深入理解Java对象的创建过程:类的初始化与实例化
摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...
- Java虚拟机加载类的过程
Java虚拟机的类加载,从class文件到内存中的类,按先后顺序需要经过加载/链接/初始化三大步骤. Java语言的类型分为两大类:基本类型(primitive types)和引用类型(referen ...
- 深入学习Java对象创建的过程:类的初始化与实例化
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完 ...
- Java对象的创建过程:类的初始化与实例化
一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...
- Java NIO 机制分析(一) Java IO的演进
一.引言 Java1.4之前的早期版本,Java对I/O的支持并不完善,开发人员再开发高性能I/O程序的时候,会面临一些巨大的挑战和困难,主要有以下一些问题: (1)没有数据缓冲区,I/O性能存在问题 ...
- java代码的初始化过程研究
刚刚在ITeye上看到一篇关于java代码初始化的文章,看到代码我试着推理了下结果,虽然是大学时代学的知识了,没想到还能做对.(看来自己大学时掌握的基础还算不错,(*^__^*) 嘻嘻……)但 ...
随机推荐
- VS2010远程调试
1, A:调试机. B:远端被调试机. 2, 从A机的VS2010的安装目录里面,找到../Remote Debugger文件,复制到B机. 3, 启动B机上复制过来的目录下的msvsmon.exe ...
- ZigBee2006,2007,pro各个版本的区别
文章转载自http://home.eeworld.com.cn/my/space-uid-361439-blogid-224722.html
- SQL 远程过程调用失败【0x800706be】或正在关闭 【0x80041033】解决方法
在SQL Server 配置管理器中出现[远程过程调用失败.[0x800706be]]或者[正在关闭 [0x80041033]]错误,如图所示 上网查找发现时SQL2008与VS2012或VS2013 ...
- web响应式之bootstrap的基础用法。
1/首先必须在head里面引用视窗viewport,以保证之后可以响应式分布 <!--meta:vp 响应式布局--> <meta name="viewport" ...
- 如何查看Oracle的用户权限
ORACLE数据字典视图的种类分别为:USER,ALL 和 DBA. USER_*:有关用户所拥有的对象信息,即用户自己创建的对象信息 ALL_*:有关用户可以访问的对象的信息,即用户自己创建的对象的 ...
- Stimulsoft Reports报表工具
关于第三方的报表工具,网上的种类有很多,一些专门做报表工具的公司,还针对不同平台语言做了分别处理.总之功能都很强大,比较流行和使用广泛的貌似还是国外的产品,版本收费和中文资料匮乏,这都是不可避免的问题 ...
- HTML5 Video(视频)
HTML5 Video(视频) 很多站点都会使用到视频. HTML5 提供了展示视频的标准. 检测您的浏览器是否支持 HTML5 视频: 检测 Web站点上的视频 直到现在,仍然不存在一项旨在网页上显 ...
- vim使用总结
tar -xf vim.tar -C ~ vim /etc/vimrc vim /root/.vimrc set ts=4 设置tab有多少空格 set ai 自动对齐 set nu set mous ...
- Fedora 17下安装Oracle 10g详细图文教程
一.硬件要求——内存 & swap & 硬盘 最小内存与swap: 1 GB of RAM & swap 建议内存与swap: 2 GB of RAM & swap [ ...
- vim中编写python代码使用python-mode和syntastic插件时警告(Warning)的消除
问题: 在Vim使用了syntastic后,编写代码时,可以对代码错误和警告进行相对实时的了解,对编写代码有很大的帮助.同时这个插件和python-mode一起工作时,可以对python代码的编写提供 ...